From ab90781534d3d40636f2ec9723deaf240f12db51 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 11 Dec 2018 02:08:44 +0900 Subject: [PATCH 001/191] first commit --- .eslintrc.json | 25 +- .gitignore | 19 +- CHANGELOG.md | 24 + dist/locales/ca.js | 48 - dist/locales/da.js | 54 - dist/locales/de.js | 52 - dist/locales/es.js | 52 - dist/locales/fi.js | 66 - dist/locales/fr.js | 49 - dist/locales/it.js | 51 - dist/locales/ja.js | 66 - dist/locales/ko.js | 49 - dist/locales/nl.js | 49 - dist/locales/no.js | 47 - dist/locales/pl.js | 82 - dist/locales/pt.js | 53 - dist/locales/ru.js | 65 - dist/locales/sv.js | 56 - dist/locales/zh-cn.js | 54 - dist/locales/zh-tw.js | 54 - dist/sugar-es5.js | 14106 ----------------------- dist/sugar-es5.min.js | 151 - dist/sugar-es5.min.map | 8 - dist/sugar.js | 14376 ++---------------------- dist/sugar.min.js | 143 - dist/sugar.min.map | 8 - lib/common.js | 2 +- lib/core.js | 22 +- package-lock.json | 11297 +++++++++++++++++++ package.json | 30 +- src/.eslintrc.json | 4 + src/core/index.js | 223 + src/es5.js | 1 + src/index.js | 3 + src/number/abs.js | 1 + src/number/acos.js | 1 + src/number/asin.js | 1 + src/number/atan.js | 1 + src/number/atan2.js | 1 + src/number/ceil.js | 1 + src/number/cos.js | 1 + src/number/exp.js | 1 + src/number/floor.js | 1 + src/number/index.js | 57 + src/number/isEven.js | 6 + src/number/isFinite.js | 1 + src/number/isInteger.js | 1 + src/number/isMultipleOf.js | 6 + src/number/isNaN.js | 1 + src/number/isOdd.js | 6 + src/number/isSafeInteger.js | 1 + src/number/log.js | 5 + src/number/namespace.js | 12 + src/number/pow.js | 1 + src/number/random.js | 15 + src/number/round.js | 1 + src/number/sin.js | 2 + src/number/sqrt.js | 1 + src/number/tan.js | 1 + src/number/toChar.js | 8 + src/number/toOrdinal.js | 4 + src/number/util/isMultipleOf.js | 3 + src/number/util/mathAliases.js | 14 + src/number/util/numberAliases.js | 9 + src/number/util/roundWithPrecision.js | 9 + src/number/util/roundingAliases.js | 11 + src/number/util/trunc.js | 3 + src/polyfills.js | 6 + src/util/toOrdinal.js | 20 + test/.eslintrc.json | 10 + test/chainable.js | 240 + test/core.js | 99 + test/extended.js | 68 + test/helpers/methods.js | 11 + test/helpers/module.js | 29 + test/helpers/namespace.js | 10 + test/helpers/suite.js | 36 + test/index.html | 19 + test/index.js | 16 + test/modules.js | 19 + test/number.js | 1049 ++ test/tests/core.js | 647 -- webpack.config.js | 55 + 83 files changed, 14302 insertions(+), 29608 deletions(-) delete mode 100644 dist/locales/ca.js delete mode 100644 dist/locales/da.js delete mode 100644 dist/locales/de.js delete mode 100644 dist/locales/es.js delete mode 100644 dist/locales/fi.js delete mode 100644 dist/locales/fr.js delete mode 100644 dist/locales/it.js delete mode 100644 dist/locales/ja.js delete mode 100644 dist/locales/ko.js delete mode 100644 dist/locales/nl.js delete mode 100644 dist/locales/no.js delete mode 100644 dist/locales/pl.js delete mode 100644 dist/locales/pt.js delete mode 100644 dist/locales/ru.js delete mode 100644 dist/locales/sv.js delete mode 100644 dist/locales/zh-cn.js delete mode 100644 dist/locales/zh-tw.js delete mode 100644 dist/sugar-es5.js delete mode 100644 dist/sugar-es5.min.js delete mode 100644 dist/sugar-es5.min.map delete mode 100644 dist/sugar.min.js delete mode 100644 dist/sugar.min.map create mode 100644 package-lock.json create mode 100644 src/.eslintrc.json create mode 100644 src/core/index.js create mode 100644 src/es5.js create mode 100644 src/index.js create mode 100644 src/number/abs.js create mode 100644 src/number/acos.js create mode 100644 src/number/asin.js create mode 100644 src/number/atan.js create mode 100644 src/number/atan2.js create mode 100644 src/number/ceil.js create mode 100644 src/number/cos.js create mode 100644 src/number/exp.js create mode 100644 src/number/floor.js create mode 100644 src/number/index.js create mode 100644 src/number/isEven.js create mode 100644 src/number/isFinite.js create mode 100644 src/number/isInteger.js create mode 100644 src/number/isMultipleOf.js create mode 100644 src/number/isNaN.js create mode 100644 src/number/isOdd.js create mode 100644 src/number/isSafeInteger.js create mode 100644 src/number/log.js create mode 100644 src/number/namespace.js create mode 100644 src/number/pow.js create mode 100644 src/number/random.js create mode 100644 src/number/round.js create mode 100644 src/number/sin.js create mode 100644 src/number/sqrt.js create mode 100644 src/number/tan.js create mode 100644 src/number/toChar.js create mode 100644 src/number/toOrdinal.js create mode 100644 src/number/util/isMultipleOf.js create mode 100644 src/number/util/mathAliases.js create mode 100644 src/number/util/numberAliases.js create mode 100644 src/number/util/roundWithPrecision.js create mode 100644 src/number/util/roundingAliases.js create mode 100644 src/number/util/trunc.js create mode 100644 src/polyfills.js create mode 100644 src/util/toOrdinal.js create mode 100644 test/.eslintrc.json create mode 100644 test/chainable.js create mode 100644 test/core.js create mode 100644 test/extended.js create mode 100644 test/helpers/methods.js create mode 100644 test/helpers/module.js create mode 100644 test/helpers/namespace.js create mode 100644 test/helpers/suite.js create mode 100644 test/index.html create mode 100644 test/index.js create mode 100644 test/modules.js create mode 100644 test/number.js create mode 100644 webpack.config.js diff --git a/.eslintrc.json b/.eslintrc.json index 2dc035f3c..42d88e15e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,25 +1,14 @@ { "extends": "eslint:recommended", - "rules": { - "no-undef": 0, - "no-cond-assign": 0, - "no-irregular-whitespace": 0, - "no-unused-vars": [2, {"vars": "local", "varsIgnorePattern": "argLen|prop", "args": "after-used"}], - "quotes": [2, "single", "avoid-escape"], - "comma-spacing": 0, - "no-console": 0, - "camelcase": [2, {"properties": "never"}], - "no-multi-spaces": 0, - "dot-notation": 0, - "space-before-blocks": 2, - "linebreak-style": [2, "unix"], - "semi": [2, "always"] - }, - "globals": { - "localStorage": false - }, "env": { "es6": true, + "node": true, "browser": true + }, + "rules": { + "semi": 2 + }, + "parserOptions": { + "sourceType": "module" } } diff --git a/.gitignore b/.gitignore index c8c3a751a..37ace0b1a 100755 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,5 @@ -## MAC OS -.DS_Store - -## TEXTMATE -*.tmproj -tmtags - -## EMACS -*~ -\#* -.\#* - -## VIM *.swp - -## PROJECT::GENERAL -tmp node_modules +dist ## PROJECT::SPECIFIC -packages -coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e6887cf6..1fb5f8d04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ +v3.0.0 +====== + +- Added defineAlias to core. +- Added `Number#atan2` to math aliases. +- Added Number aliases `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. +- Renamed `Number#chr` to `Number#toChar`. +- Renamed `Number#ordinalize` to `Number#toOrdinal`. +- Removed `Number#toNumber`. +- Cannot instantiate chainable without new keyword anymore (ES6). +- `Sugar()` alias is no longer supported. Use `Sugar.extend()` instead. +- Removed `String#includes` with RegExp support. + +TODO: + +- String#padStart/String#padEnd? +- String#trimStart/String#trimEnd? +- Object.values / Object.entries? +- Array#flat/Array#flatMap +- String#matchAll - does it do what Sugar methods already do? +- Object.is implications? +- String#replaceAll? +- Math.random with seed? + v2.0.5 ====== diff --git a/dist/locales/ca.js b/dist/locales/ca.js deleted file mode 100644 index 1816bc2de..000000000 --- a/dist/locales/ca.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Catalan locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('ca') - * - */ -Sugar.Date.addLocale('ca', { - 'plural': true, - 'units': 'milisegon:|s,segon:|s,minut:|s,hor:a|es,di:a|es,setman:a|es,mes:|os,any:|s', - 'months': 'gen:er|,febr:er|,mar:ç|,abr:il|,mai:g|,jun:y|,jul:iol|,ag:ost|,set:embre|,oct:ubre|,nov:embre|,des:embre|', - 'weekdays': 'diumenge|dg,dilluns|dl,dimarts|dt,dimecres|dc,dijous|dj,divendres|dv,dissabte|ds', - 'numerals': 'zero,un,dos,tres,quatre,cinc,sis,set,vuit,nou,deu', - 'tokens': 'el,la,de', - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} {month} {yyyy}', - 'long': '{d} {month} {yyyy} {time}', - 'full': '{weekday} {d} {month} {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{sign} {num} {unit}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'timeMarkers': 'a las', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': "abans d'ahir", 'value': -2 }, - { 'name': 'day', 'src': 'ahir', 'value': -1 }, - { 'name': 'day', 'src': 'avui', 'value': 0 }, - { 'name': 'day', 'src': 'demà|dema', 'value': 1 }, - { 'name': 'sign', 'src': 'fa', 'value': -1 }, - { 'name': 'sign', 'src': 'en', 'value': 1 }, - { 'name': 'shift', 'src': 'passat', 'value': -1 }, - { 'name': 'shift', 'src': 'el proper|la propera', 'value': 1 } - ], - 'parse': [ - '{sign} {num} {unit}', - '{num} {unit} {sign}', - '{0?}{1?} {unit:5-7} {shift}', - '{0?}{1?} {shift} {unit:5-7}' - ], - 'timeParse': [ - '{shift} {weekday}', - '{weekday} {shift}', - '{date?} {2?} {months}\\.? {2?} {year?}' - ] -}); diff --git a/dist/locales/da.js b/dist/locales/da.js deleted file mode 100644 index 90d668962..000000000 --- a/dist/locales/da.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Danish locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('da') - * - */ -Sugar.Date.addLocale('da', { - 'plural': true, - 'units': 'millisekund:|er,sekund:|er,minut:|ter,tim:e|er,dag:|e,ug:e|er|en,måned:|er|en+maaned:|er|en,år:||et+aar:||et', - 'months': 'jan:uar|,feb:ruar|,mar:ts|,apr:il|,maj,jun:i|,jul:i|,aug:ust|,sep:tember|,okt:ober|,nov:ember|,dec:ember|', - 'weekdays': 'søn:dag|+son:dag|,man:dag|,tir:sdag|,ons:dag|,tor:sdag|,fre:dag|,lør:dag|+lor:dag|', - 'numerals': 'nul,en|et,to,tre,fire,fem,seks,syv,otte,ni,ti', - 'tokens': 'den,for', - 'articles': 'den', - 'short': '{dd}-{MM}-{yyyy}', - 'medium': '{d}. {month} {yyyy}', - 'long': '{d}. {month} {yyyy} {time}', - 'full': '{weekday} d. {d}. {month} {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'forgårs|i forgårs|forgaars|i forgaars', 'value': -2 }, - { 'name': 'day', 'src': 'i går|igår|i gaar|igaar', 'value': -1 }, - { 'name': 'day', 'src': 'i dag|idag', 'value': 0 }, - { 'name': 'day', 'src': 'i morgen|imorgen', 'value': 1 }, - { 'name': 'day', 'src': 'over morgon|overmorgen|i over morgen|i overmorgen|iovermorgen', 'value': 2 }, - { 'name': 'sign', 'src': 'siden', 'value': -1 }, - { 'name': 'sign', 'src': 'om', 'value': 1 }, - { 'name': 'shift', 'src': 'i sidste|sidste', 'value': -1 }, - { 'name': 'shift', 'src': 'denne', 'value': 0 }, - { 'name': 'shift', 'src': 'næste|naeste', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{num} {unit} {sign}', - '{sign} {num} {unit}', - '{1?} {num} {unit} {sign}', - '{shift} {unit:5-7}' - ], - 'timeParse': [ - '{day|weekday}', - '{date} {months?}\\.? {year?}' - ], - 'timeFrontParse': [ - '{shift} {weekday}', - '{0?} {weekday?},? {date}\\.? {months?}\\.? {year?}' - ] -}); diff --git a/dist/locales/de.js b/dist/locales/de.js deleted file mode 100644 index 3e57399c7..000000000 --- a/dist/locales/de.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * German locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('de') - * - */ -Sugar.Date.addLocale('de', { - 'plural': true, - 'units': 'Millisekunde:|n,Sekunde:|n,Minute:|n,Stunde:|n,Tag:|en,Woche:|n,Monat:|en,Jahr:|en|e', - 'months': 'Jan:uar|,Feb:ruar|,M:är|ärz|ar|arz,Apr:il|,Mai,Juni,Juli,Aug:ust|,Sept:ember|,Okt:ober|,Nov:ember|,Dez:ember|', - 'weekdays': 'So:nntag|,Mo:ntag|,Di:enstag|,Mi:ttwoch|,Do:nnerstag|,Fr:eitag|,Sa:mstag|', - 'numerals': 'null,ein:|e|er|en|em,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,zehn', - 'tokens': 'der', - 'short': '{dd}.{MM}.{yyyy}', - 'medium': '{d}. {Month} {yyyy}', - 'long': '{d}. {Month} {yyyy} {time}', - 'full': '{Weekday}, {d}. {Month} {yyyy} {time}', - 'stamp': '{Dow} {d} {Mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{sign} {num} {unit}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'timeMarkers': 'um', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'vorgestern', 'value': -2 }, - { 'name': 'day', 'src': 'gestern', 'value': -1 }, - { 'name': 'day', 'src': 'heute', 'value': 0 }, - { 'name': 'day', 'src': 'morgen', 'value': 1 }, - { 'name': 'day', 'src': 'übermorgen|ubermorgen|uebermorgen', 'value': 2 }, - { 'name': 'sign', 'src': 'vor:|her', 'value': -1 }, - { 'name': 'sign', 'src': 'in', 'value': 1 }, - { 'name': 'shift', 'src': 'letzte:|r|n|s', 'value': -1 }, - { 'name': 'shift', 'src': 'nächste:|r|n|s+nachste:|r|n|s+naechste:|r|n|s+kommende:n|r', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{sign} {num} {unit}', - '{num} {unit} {sign}', - '{shift} {unit:5-7}' - ], - 'timeParse': [ - '{shift?} {day|weekday}', - '{weekday?},? {date}\\.? {months?}\\.? {year?}' - ], - 'timeFrontParse': [ - '{shift} {weekday}', - '{weekday?},? {date}\\.? {months?}\\.? {year?}' - ] -}); diff --git a/dist/locales/es.js b/dist/locales/es.js deleted file mode 100644 index 2775123c9..000000000 --- a/dist/locales/es.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Spanish locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('es') - * - */ -Sugar.Date.addLocale('es', { - 'plural': true, - 'units': 'milisegundo:|s,segundo:|s,minuto:|s,hora:|s,día|días|dia|dias,semana:|s,mes:|es,año|años|ano|anos', - 'months': 'ene:ro|,feb:rero|,mar:zo|,abr:il|,may:o|,jun:io|,jul:io|,ago:sto|,sep:tiembre|,oct:ubre|,nov:iembre|,dic:iembre|', - 'weekdays': 'dom:ingo|,lun:es|,mar:tes|,mié:rcoles|+mie:rcoles|,jue:ves|,vie:rnes|,sáb:ado|+sab:ado|', - 'numerals': 'cero,uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve,diez', - 'tokens': 'el,la,de', - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} de {Month} de {yyyy}', - 'long': '{d} de {Month} de {yyyy} {time}', - 'full': '{weekday}, {d} de {month} de {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{sign} {num} {unit}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'timeMarkers': 'a las', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'anteayer', 'value': -2 }, - { 'name': 'day', 'src': 'ayer', 'value': -1 }, - { 'name': 'day', 'src': 'hoy', 'value': 0 }, - { 'name': 'day', 'src': 'mañana|manana', 'value': 1 }, - { 'name': 'sign', 'src': 'hace', 'value': -1 }, - { 'name': 'sign', 'src': 'dentro de', 'value': 1 }, - { 'name': 'shift', 'src': 'pasad:o|a', 'value': -1 }, - { 'name': 'shift', 'src': 'próximo|próxima|proximo|proxima', 'value': 1 } - ], - 'parse': [ - '{months} {2?} {year?}', - '{sign} {num} {unit}', - '{num} {unit} {sign}', - '{0?}{1?} {unit:5-7} {shift}', - '{0?}{1?} {shift} {unit:5-7}' - ], - 'timeParse': [ - '{shift?} {day|weekday} {shift?}', - '{date} {2?} {months?}\\.? {2?} {year?}' - ], - 'timeFrontParse': [ - '{shift?} {weekday} {shift?}', - '{date} {2?} {months?}\\.? {2?} {year?}' - ] -}); diff --git a/dist/locales/fi.js b/dist/locales/fi.js deleted file mode 100644 index 0465d9b65..000000000 --- a/dist/locales/fi.js +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Finnish locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('fi') - * - */ -Sugar.Date.addLocale('fi', { - 'plural': true, - 'units': 'millisekun:ti|tia|nin|teja|tina,sekun:ti|tia|nin|teja|tina,minuut:ti|tia|in|teja|tina,tun:ti|tia|nin|teja|tina,päiv:ä|ää|än|iä|änä,viik:ko|koa|on|olla|koja|kona,kuukau:si|tta|den+kuussa,vuo:si|tta|den|sia|tena|nna', - 'months': 'tammi:kuuta||kuu,helmi:kuuta||kuu,maalis:kuuta||kuu,huhti:kuuta||kuu,touko:kuuta||kuu,kesä:kuuta||kuu,heinä:kuuta||kuu,elo:kuuta||kuu,syys:kuuta||kuu,loka:kuuta||kuu,marras:kuuta||kuu,joulu:kuuta||kuu', - 'weekdays': 'su:nnuntai||nnuntaina,ma:anantai||anantaina,ti:istai||istaina,ke:skiviikko||skiviikkona,to:rstai||rstaina,pe:rjantai||rjantaina,la:uantai||uantaina', - 'numerals': 'nolla,yksi|ensimmäinen,kaksi|toinen,kolm:e|as,neljä:|s,vii:si|des,kuu:si|des,seitsemä:n|s,kahdeksa:n|s,yhdeksä:n|s,kymmene:n|s', - 'short': '{d}.{M}.{yyyy}', - 'medium': '{d}. {month} {yyyy}', - 'long': '{d}. {month} {yyyy} klo {time}', - 'full': '{weekday} {d}. {month} {yyyy} klo {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}.{mm}', - 'timeMarkers': 'klo,kello', - 'timeSeparator': '.', - 'ordinalSuffix': '.', - 'relative': function(num, unit, ms, format) { - var units = this['units']; - function numberWithUnit(mult) { - return num + ' ' + units[(8 * mult) + unit]; - } - function baseUnit() { - return numberWithUnit(num === 1 ? 0 : 1); - } - switch(format) { - case 'duration': return baseUnit(); - case 'past': return baseUnit() + ' sitten'; - case 'future': return numberWithUnit(2) + ' kuluttua'; - } - }, - 'modifiers': [ - { 'name': 'day', 'src': 'toissa päivänä', 'value': -2 }, - { 'name': 'day', 'src': 'eilen|eilistä', 'value': -1 }, - { 'name': 'day', 'src': 'tänään', 'value': 0 }, - { 'name': 'day', 'src': 'huomenna|huomista', 'value': 1 }, - { 'name': 'day', 'src': 'ylihuomenna|ylihuomista', 'value': 2 }, - { 'name': 'sign', 'src': 'sitten|aiemmin', 'value': -1 }, - { 'name': 'sign', 'src': 'päästä|kuluttua|myöhemmin', 'value': 1 }, - { 'name': 'edge', 'src': 'lopussa', 'value': 2 }, - { 'name': 'edge', 'src': 'ensimmäinen|ensimmäisenä', 'value': -2 }, - { 'name': 'shift', 'src': 'edel:linen|lisenä', 'value': -1 }, - { 'name': 'shift', 'src': 'viime', 'value': -1 }, - { 'name': 'shift', 'src': 'tä:llä|ssä|nä|mä', 'value': 0 }, - { 'name': 'shift', 'src': 'seuraava|seuraavana|tuleva|tulevana|ensi', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{shift} {unit:5-7}' - ], - 'timeParse': [ - '{shift?} {day|weekday}', - '{weekday?},? {date}\\.? {months?}\\.? {year?}' - ], - 'timeFrontParse': [ - '{shift?} {day|weekday}', - '{num?} {unit} {sign}', - '{weekday?},? {date}\\.? {months?}\\.? {year?}' - ] -}); diff --git a/dist/locales/fr.js b/dist/locales/fr.js deleted file mode 100644 index 6b663427f..000000000 --- a/dist/locales/fr.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * French locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('fr') - * - */ -Sugar.Date.addLocale('fr', { - 'plural': true, - 'units': 'milliseconde:|s,seconde:|s,minute:|s,heure:|s,jour:|s,semaine:|s,mois,an:|s|née|nee', - 'months': 'janv:ier|,févr:ier|+fevr:ier|,mars,avr:il|,mai,juin,juil:let|,août,sept:embre|,oct:obre|,nov:embre|,déc:embre|+dec:embre|', - 'weekdays': 'dim:anche|,lun:di|,mar:di|,mer:credi|,jeu:di|,ven:dredi|,sam:edi|', - 'numerals': 'zéro,un:|e,deux,trois,quatre,cinq,six,sept,huit,neuf,dix', - 'tokens': "l'|la|le,er", - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} {month} {yyyy}', - 'long': '{d} {month} {yyyy} {time}', - 'full': '{weekday} {d} {month} {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{sign} {num} {unit}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'timeMarkers': 'à', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'hier', 'value': -1 }, - { 'name': 'day', 'src': "aujourd'hui", 'value': 0 }, - { 'name': 'day', 'src': 'demain', 'value': 1 }, - { 'name': 'sign', 'src': 'il y a', 'value': -1 }, - { 'name': 'sign', 'src': "dans|d'ici", 'value': 1 }, - { 'name': 'shift', 'src': 'derni:èr|er|ère|ere', 'value': -1 }, - { 'name': 'shift', 'src': 'prochain:|e', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{sign} {num} {unit}', - '{0?} {unit:5-7} {shift}' - ], - 'timeParse': [ - '{day|weekday} {shift?}', - '{weekday?},? {0?} {date}{1?} {months}\\.? {year?}' - ], - 'timeFrontParse': [ - '{0?} {weekday} {shift}', - '{weekday?},? {0?} {date}{1?} {months}\\.? {year?}' - ] -}); diff --git a/dist/locales/it.js b/dist/locales/it.js deleted file mode 100644 index 536018d14..000000000 --- a/dist/locales/it.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Italian locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('it') - * - */ -Sugar.Date.addLocale('it', { - 'plural': true, - 'units': 'millisecond:o|i,second:o|i,minut:o|i,or:a|e,giorn:o|i,settiman:a|e,mes:e|i,ann:o|i', - 'months': 'gen:naio|,feb:braio|,mar:zo|,apr:ile|,mag:gio|,giu:gno|,lug:lio|,ago:sto|,set:tembre|,ott:obre|,nov:embre|,dic:embre|', - 'weekdays': 'dom:enica|,lun:edì||edi,mar:tedì||tedi,mer:coledì||coledi,gio:vedì||vedi,ven:erdì||erdi,sab:ato|', - 'numerals': "zero,un:|a|o|',due,tre,quattro,cinque,sei,sette,otto,nove,dieci", - 'tokens': "l'|la|il", - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} {month} {yyyy}', - 'long': '{d} {month} {yyyy} {time}', - 'full': '{weekday}, {d} {month} {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{num} {unit} {sign}', - 'duration': '{num} {unit}', - 'timeMarkers': 'alle', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'ieri', 'value': -1 }, - { 'name': 'day', 'src': 'oggi', 'value': 0 }, - { 'name': 'day', 'src': 'domani', 'value': 1 }, - { 'name': 'day', 'src': 'dopodomani', 'value': 2 }, - { 'name': 'sign', 'src': 'fa', 'value': -1 }, - { 'name': 'sign', 'src': 'da adesso', 'value': 1 }, - { 'name': 'shift', 'src': 'scors:o|a', 'value': -1 }, - { 'name': 'shift', 'src': 'prossim:o|a', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{num} {unit} {sign}', - '{0?} {unit:5-7} {shift}', - '{0?} {shift} {unit:5-7}' - ], - 'timeParse': [ - '{day|weekday} {shift?}', - '{weekday?},? {date} {months?}\\.? {year?}' - ], - 'timeFrontParse': [ - '{day|weekday} {shift?}', - '{weekday?},? {date} {months?}\\.? {year?}' - ] -}); diff --git a/dist/locales/ja.js b/dist/locales/ja.js deleted file mode 100644 index f2712b49a..000000000 --- a/dist/locales/ja.js +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Japanese locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('ja') - * - */ -Sugar.Date.addLocale('ja', { - 'ampmFront': true, - 'numeralUnits': true, - 'allowsFullWidth': true, - 'timeMarkerOptional': true, - 'firstDayOfWeek': 0, - 'firstDayOfWeekYear': 1, - 'units': 'ミリ秒,秒,分,時間,日,週間|週,ヶ月|ヵ月|月,年|年度', - 'weekdays': '日:曜日||曜,月:曜日||曜,火:曜日||曜,水:曜日||曜,木:曜日||曜,金:曜日||曜,土:曜日||曜', - 'numerals': '〇,一,二,三,四,五,六,七,八,九', - 'placeholders': '十,百,千,万', - 'timeSuffixes': ',秒,分,時,日,,月,年度?', - 'short': '{yyyy}/{MM}/{dd}', - 'medium': '{yyyy}年{M}月{d}日', - 'long': '{yyyy}年{M}月{d}日{time}', - 'full': '{yyyy}年{M}月{d}日{time} {weekday}', - 'stamp': '{yyyy}年{M}月{d}日 {H}:{mm} {dow}', - 'time': '{tt}{h}時{mm}分', - 'past': '{num}{unit}{sign}', - 'future': '{num}{unit}{sign}', - 'duration': '{num}{unit}', - 'ampm': '午前,午後', - 'modifiers': [ - { 'name': 'day', 'src': '一昨々日|前々々日', 'value': -3 }, - { 'name': 'day', 'src': '一昨日|おととい|前々日', 'value': -2 }, - { 'name': 'day', 'src': '昨日|前日', 'value': -1 }, - { 'name': 'day', 'src': '今日|当日|本日', 'value': 0 }, - { 'name': 'day', 'src': '明日|翌日|次日', 'value': 1 }, - { 'name': 'day', 'src': '明後日|翌々日', 'value': 2 }, - { 'name': 'day', 'src': '明々後日|翌々々日', 'value': 3 }, - { 'name': 'sign', 'src': '前', 'value': -1 }, - { 'name': 'sign', 'src': '後', 'value': 1 }, - { 'name': 'edge', 'src': '始|初日|頭', 'value': -2 }, - { 'name': 'edge', 'src': '末|尻', 'value': 2 }, - { 'name': 'edge', 'src': '末日', 'value': 1 }, - { 'name': 'shift', 'src': '一昨々|前々々', 'value': -3 }, - { 'name': 'shift', 'src': '一昨|前々|先々', 'value': -2 }, - { 'name': 'shift', 'src': '先|昨|去|前', 'value': -1 }, - { 'name': 'shift', 'src': '今|本|当', 'value': 0 }, - { 'name': 'shift', 'src': '来|明|翌|次', 'value': 1 }, - { 'name': 'shift', 'src': '明後|翌々|次々|再来|さ来', 'value': 2 }, - { 'name': 'shift', 'src': '明々後|翌々々', 'value': 3 } - ], - 'parse': [ - '{month}{edge}', - '{num}{unit}{sign}', - '{year?}{month}', - '{year}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift}{unit:5}{weekday?}', - '{shift}{unit:7}{month}{edge}', - '{shift}{unit:7}{month?}{date?}', - '{shift}{unit:6}{edge?}{date?}', - '{year?}{month?}{date}' - ] -}); diff --git a/dist/locales/ko.js b/dist/locales/ko.js deleted file mode 100644 index d0df20ba4..000000000 --- a/dist/locales/ko.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Korean locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('ko') - * - */ -Sugar.Date.addLocale('ko', { - 'ampmFront': true, - 'numeralUnits': true, - 'units': '밀리초,초,분,시간,일,주,개월|달,년|해', - 'weekdays': '일:요일|,월:요일|,화:요일|,수:요일|,목:요일|,금:요일|,토:요일|', - 'numerals': '영|제로,일|한,이,삼,사,오,육,칠,팔,구,십', - 'short': '{yyyy}.{MM}.{dd}', - 'medium': '{yyyy}년 {M}월 {d}일', - 'long': '{yyyy}년 {M}월 {d}일 {time}', - 'full': '{yyyy}년 {M}월 {d}일 {weekday} {time}', - 'stamp': '{yyyy}년 {M}월 {d}일 {H}:{mm} {dow}', - 'time': '{tt} {h}시 {mm}분', - 'past': '{num}{unit} {sign}', - 'future': '{num}{unit} {sign}', - 'duration': '{num}{unit}', - 'timeSuffixes': ',초,분,시,일,,월,년', - 'ampm': '오전,오후', - 'modifiers': [ - { 'name': 'day', 'src': '그저께', 'value': -2 }, - { 'name': 'day', 'src': '어제', 'value': -1 }, - { 'name': 'day', 'src': '오늘', 'value': 0 }, - { 'name': 'day', 'src': '내일', 'value': 1 }, - { 'name': 'day', 'src': '모레', 'value': 2 }, - { 'name': 'sign', 'src': '전', 'value': -1 }, - { 'name': 'sign', 'src': '후', 'value': 1 }, - { 'name': 'shift', 'src': '지난|작', 'value': -1 }, - { 'name': 'shift', 'src': '이번|올', 'value': 0 }, - { 'name': 'shift', 'src': '다음|내', 'value': 1 } - ], - 'parse': [ - '{num}{unit} {sign}', - '{shift?} {unit:5-7}', - '{year?} {month}', - '{year}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift} {unit:5?} {weekday}', - '{year?} {month?} {date} {weekday?}' - ] -}); diff --git a/dist/locales/nl.js b/dist/locales/nl.js deleted file mode 100644 index 5c98149be..000000000 --- a/dist/locales/nl.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Dutch locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('nl') - * - */ -Sugar.Date.addLocale('nl', { - 'plural': true, - 'units': 'milliseconde:|n,seconde:|n,minu:ut|ten,uur,dag:|en,we:ek|ken,maand:|en,jaar', - 'months': 'jan:uari|,feb:ruari|,maart|mrt,apr:il|,mei,jun:i|,jul:i|,aug:ustus|,sep:tember|,okt:ober|,nov:ember|,dec:ember|', - 'weekdays': 'zondag|zo,maandag|ma,dinsdag|di,woensdag|wo|woe,donderdag|do,vrijdag|vr|vrij,zaterdag|za', - 'numerals': 'nul,een,twee,drie,vier,vijf,zes,zeven,acht,negen,tien', - 'short': '{dd}-{MM}-{yyyy}', - 'medium': '{d} {month} {yyyy}', - 'long': '{d} {Month} {yyyy} {time}', - 'full': '{weekday} {d} {Month} {yyyy} {time}', - 'stamp': '{dow} {d} {Mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{num} {unit} {sign}', - 'duration': '{num} {unit}', - 'timeMarkers': "'s,om", - 'modifiers': [ - { 'name': 'day', 'src': 'gisteren', 'value': -1 }, - { 'name': 'day', 'src': 'vandaag', 'value': 0 }, - { 'name': 'day', 'src': 'morgen', 'value': 1 }, - { 'name': 'day', 'src': 'overmorgen', 'value': 2 }, - { 'name': 'sign', 'src': 'geleden', 'value': -1 }, - { 'name': 'sign', 'src': 'vanaf nu', 'value': 1 }, - { 'name': 'shift', 'src': 'laatste|vorige|afgelopen', 'value': -1 }, - { 'name': 'shift', 'src': 'volgend:|e', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{num} {unit} {sign}', - '{0?} {unit:5-7} {shift}', - '{0?} {shift} {unit:5-7}' - ], - 'timeParse': [ - '{shift?} {day|weekday}', - '{weekday?},? {date} {months?}\\.? {year?}' - ], - 'timeFrontParse': [ - '{shift?} {day|weekday}', - '{weekday?},? {date} {months?}\\.? {year?}' - ] -}); diff --git a/dist/locales/no.js b/dist/locales/no.js deleted file mode 100644 index 36de93ef4..000000000 --- a/dist/locales/no.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Norwegian locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('no') - * - */ -Sugar.Date.addLocale('no', { - 'plural': true, - 'units': 'millisekund:|er,sekund:|er,minutt:|er,tim:e|er,dag:|er,uk:e|er|en,måned:|er|en+maaned:|er|en,år:||et+aar:||et', - 'months': 'januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember', - 'weekdays': 'søndag|sondag,mandag,tirsdag,onsdag,torsdag,fredag,lørdag|lordag', - 'numerals': 'en|et,to,tre,fire,fem,seks,sju|syv,åtte,ni,ti', - 'tokens': 'den,for', - 'articles': 'den', - 'short':'d. {d}. {month} {yyyy}', - 'long': 'den {d}. {month} {yyyy} {H}:{mm}', - 'full': '{Weekday} den {d}. {month} {yyyy} {H}:{mm}:{ss}', - 'past': '{num} {unit} {sign}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'forgårs|i forgårs|forgaars|i forgaars', 'value': -2 }, - { 'name': 'day', 'src': 'i går|igår|i gaar|igaar', 'value': -1 }, - { 'name': 'day', 'src': 'i dag|idag', 'value': 0 }, - { 'name': 'day', 'src': 'i morgen|imorgen', 'value': 1 }, - { 'name': 'day', 'src': 'overimorgen|overmorgen|over i morgen', 'value': 2 }, - { 'name': 'sign', 'src': 'siden', 'value': -1 }, - { 'name': 'sign', 'src': 'om', 'value': 1 }, - { 'name': 'shift', 'src': 'i siste|siste', 'value': -1 }, - { 'name': 'shift', 'src': 'denne', 'value': 0 }, - { 'name': 'shift', 'src': 'neste', 'value': 1 } - ], - 'parse': [ - '{num} {unit} {sign}', - '{sign} {num} {unit}', - '{1?} {num} {unit} {sign}', - '{shift} {unit:5-7}' - ], - 'timeParse': [ - '{date} {month}', - '{shift} {weekday}', - '{0?} {weekday?},? {date?} {month}\\.? {year}' - ] -}); diff --git a/dist/locales/pl.js b/dist/locales/pl.js deleted file mode 100644 index 05251264f..000000000 --- a/dist/locales/pl.js +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Polish locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('pl') - * - */ -Sugar.Date.addLocale('pl', { - 'plural': true, - 'units': 'milisekund:a|y|,sekund:a|y|,minut:a|y|,godzin:a|y|,dzień|dni|dni,tydzień|tygodnie|tygodni,miesiąc|miesiące|miesięcy,rok|lata|lat', - 'months': 'sty:cznia||czeń,lut:ego||y,mar:ca||zec,kwi:etnia||ecień,maj:a|,cze:rwca||rwiec,lip:ca||iec,sie:rpnia||rpień,wrz:eśnia||esień,paź:dziernika||dziernik,lis:topada||topad,gru:dnia||dzień', - 'weekdays': 'nie:dziela||dzielę,pon:iedziałek|,wt:orek|,śr:oda||odę,czw:artek|,piątek|pt,sobota|sb|sobotę', - 'numerals': 'zero,jeden|jedną,dwa|dwie,trzy,cztery,pięć,sześć,siedem,osiem,dziewięć,dziesięć', - 'tokens': 'w|we,roku', - 'short': '{dd}.{MM}.{yyyy}', - 'medium': '{d} {month} {yyyy}', - 'long': '{d} {month} {yyyy} {time}', - 'full' : '{weekday}, {d} {month} {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'timeMarkers': 'o', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'przedwczoraj', 'value': -2 }, - { 'name': 'day', 'src': 'wczoraj', 'value': -1 }, - { 'name': 'day', 'src': 'dzisiaj|dziś', 'value': 0 }, - { 'name': 'day', 'src': 'jutro', 'value': 1 }, - { 'name': 'day', 'src': 'pojutrze', 'value': 2 }, - { 'name': 'sign', 'src': 'temu|przed', 'value': -1 }, - { 'name': 'sign', 'src': 'za', 'value': 1 }, - { 'name': 'shift', 'src': 'zeszły|zeszła|ostatni|ostatnia', 'value': -1 }, - { 'name': 'shift', 'src': 'następny|następna|następnego|przyszły|przyszła|przyszłego', 'value': 1 } - ], - 'relative': function (num, unit, ms, format) { - // special cases for relative days - var DAY = 4; - if (unit === DAY) { - if (num === 1 && format === 'past') return 'wczoraj'; - if (num === 1 && format === 'future') return 'jutro'; - if (num === 2 && format === 'past') return 'przedwczoraj'; - if (num === 2 && format === 'future') return 'pojutrze'; - } - - var mult; - var last = +num.toFixed(0).slice(-1); - var last2 = +num.toFixed(0).slice(-2); - switch (true) { - case num === 1: mult = 0; break; - case last2 >= 12 && last2 <= 14: mult = 2; break; - case last >= 2 && last <= 4: mult = 1; break; - default: mult = 2; - } - var text = this['units'][(mult * 8) + unit]; - var prefix = num + ' '; - - // changing to accusative case for 'past' and 'future' formats - // (only singular feminine unit words are different in accusative, each of which ends with 'a') - if ((format === 'past' || format === 'future') && num === 1) { - text = text.replace(/a$/, 'ę'); - } - - text = prefix + text; - switch (format) { - case 'duration': return text; - case 'past': return text + ' temu'; - case 'future': return 'za ' + text; - } - }, - 'parse': [ - '{num} {unit} {sign}', - '{sign} {num} {unit}', - '{months} {year?}', - '{shift} {unit:5-7}', - '{0} {shift?} {weekday}' - ], - 'timeFrontParse': [ - '{day|weekday}', - '{date} {months} {year?} {1?}', - '{0?} {shift?} {weekday}' - ] -}); diff --git a/dist/locales/pt.js b/dist/locales/pt.js deleted file mode 100644 index 3304a744a..000000000 --- a/dist/locales/pt.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Portuguese locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('pt') - * - */ -Sugar.Date.addLocale('pt', { - 'plural': true, - 'units': 'milisegundo:|s,segundo:|s,minuto:|s,hora:|s,dia:|s,semana:|s,mês|mêses|mes|meses,ano:|s', - 'months': 'jan:eiro|,fev:ereiro|,mar:ço|,abr:il|,mai:o|,jun:ho|,jul:ho|,ago:sto|,set:embro|,out:ubro|,nov:embro|,dez:embro|', - 'weekdays': 'dom:ingo|,seg:unda-feira|,ter:ça-feira|,qua:rta-feira|,qui:nta-feira|,sex:ta-feira|,sáb:ado||ado', - 'numerals': 'zero,um:|a,dois|duas,três|tres,quatro,cinco,seis,sete,oito,nove,dez', - 'tokens': 'a,de', - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} de {Month} de {yyyy}', - 'long': '{d} de {Month} de {yyyy} {time}', - 'full': '{Weekday}, {d} de {Month} de {yyyy} {time}', - 'stamp': '{Dow} {d} {Mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'timeMarkers': 'às', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'anteontem', 'value': -2 }, - { 'name': 'day', 'src': 'ontem', 'value': -1 }, - { 'name': 'day', 'src': 'hoje', 'value': 0 }, - { 'name': 'day', 'src': 'amanh:ã|a', 'value': 1 }, - { 'name': 'sign', 'src': 'atrás|atras|há|ha', 'value': -1 }, - { 'name': 'sign', 'src': 'daqui a', 'value': 1 }, - { 'name': 'shift', 'src': 'passad:o|a', 'value': -1 }, - { 'name': 'shift', 'src': 'próximo|próxima|proximo|proxima', 'value': 1 } - ], - 'parse': [ - '{months} {1?} {year?}', - '{num} {unit} {sign}', - '{sign} {num} {unit}', - '{0?} {unit:5-7} {shift}', - '{0?} {shift} {unit:5-7}' - ], - 'timeParse': [ - '{shift?} {day|weekday}', - '{0?} {shift} {weekday}', - '{date} {1?} {months?} {1?} {year?}' - ], - 'timeFrontParse': [ - '{shift?} {day|weekday}', - '{date} {1?} {months?} {1?} {year?}' - ] -}); diff --git a/dist/locales/ru.js b/dist/locales/ru.js deleted file mode 100644 index 62b918834..000000000 --- a/dist/locales/ru.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Russian locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('ru') - * - */ -Sugar.Date.addLocale('ru', { - 'firstDayOfWeekYear': 1, - 'units': 'миллисекунд:а|у|ы|,секунд:а|у|ы|,минут:а|у|ы|,час:||а|ов,день|день|дня|дней,недел:я|ю|и|ь|е,месяц:||а|ев|е,год|год|года|лет|году', - 'months': 'янв:аря||.|арь,фев:раля||р.|раль,мар:та||т,апр:еля||.|ель,мая|май,июн:я||ь,июл:я||ь,авг:уста||.|уст,сен:тября||т.|тябрь,окт:ября||.|ябрь,ноя:бря||брь,дек:абря||.|абрь', - 'weekdays': 'воскресенье|вс,понедельник|пн,вторник|вт,среда|ср,четверг|чт,пятница|пт,суббота|сб', - 'numerals': 'ноль,од:ин|ну,дв:а|е,три,четыре,пять,шесть,семь,восемь,девять,десять', - 'tokens': 'в|на,г\\.?(?:ода)?', - 'short': '{dd}.{MM}.{yyyy}', - 'medium': '{d} {month} {yyyy} г.', - 'long': '{d} {month} {yyyy} г., {time}', - 'full': '{weekday}, {d} {month} {yyyy} г., {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'timeMarkers': 'в', - 'ampm': ' утра, вечера', - 'modifiers': [ - { 'name': 'day', 'src': 'позавчера', 'value': -2 }, - { 'name': 'day', 'src': 'вчера', 'value': -1 }, - { 'name': 'day', 'src': 'сегодня', 'value': 0 }, - { 'name': 'day', 'src': 'завтра', 'value': 1 }, - { 'name': 'day', 'src': 'послезавтра', 'value': 2 }, - { 'name': 'sign', 'src': 'назад', 'value': -1 }, - { 'name': 'sign', 'src': 'через', 'value': 1 }, - { 'name': 'shift', 'src': 'прошл:ый|ой|ом', 'value': -1 }, - { 'name': 'shift', 'src': 'следующ:ий|ей|ем', 'value': 1 } - ], - 'relative': function(num, unit, ms, format) { - var numberWithUnit, last = num.toString().slice(-1), mult; - switch(true) { - case num >= 11 && num <= 15: mult = 3; break; - case last == 1: mult = 1; break; - case last >= 2 && last <= 4: mult = 2; break; - default: mult = 3; - } - numberWithUnit = num + ' ' + this['units'][(mult * 8) + unit]; - switch(format) { - case 'duration': return numberWithUnit; - case 'past': return numberWithUnit + ' назад'; - case 'future': return 'через ' + numberWithUnit; - } - }, - 'parse': [ - '{num} {unit} {sign}', - '{sign} {num} {unit}', - '{months} {year?}', - '{0?} {shift} {unit:5-7}' - ], - 'timeParse': [ - '{day|weekday}', - '{0?} {shift} {weekday}', - '{date} {months?} {year?} {1?}' - ], - 'timeFrontParse': [ - '{0?} {shift} {weekday}', - '{date} {months?} {year?} {1?}' - ] -}); diff --git a/dist/locales/sv.js b/dist/locales/sv.js deleted file mode 100644 index 89bfc3bb7..000000000 --- a/dist/locales/sv.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Swedish locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('sv') - * - */ -Sugar.Date.addLocale('sv', { - 'plural': true, - 'units': 'millisekund:|er,sekund:|er,minut:|er,timm:e|ar,dag:|ar,veck:a|or|an,månad:|er|en+manad:|er|en,år:||et+ar:||et', - 'months': 'jan:uari|,feb:ruari|,mar:s|,apr:il|,maj,jun:i|,jul:i|,aug:usti|,sep:tember|,okt:ober|,nov:ember|,dec:ember|', - 'weekdays': 'sön:dag|+son:dag|,mån:dag||dagen+man:dag||dagen,tis:dag|,ons:dag|,tor:sdag|,fre:dag|,lör:dag||dag', - 'numerals': 'noll,en|ett,två|tva,tre,fyra,fem,sex,sju,åtta|atta,nio,tio', - 'tokens': 'den,för|for', - 'articles': 'den', - 'short': '{yyyy}-{MM}-{dd}', - 'medium': '{d} {month} {yyyy}', - 'long': '{d} {month} {yyyy} {time}', - 'full': '{weekday} {d} {month} {yyyy} {time}', - 'stamp': '{dow} {d} {mon} {yyyy} {time}', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{sign} {num} {unit}', - 'duration': '{num} {unit}', - 'ampm': 'am,pm', - 'modifiers': [ - { 'name': 'day', 'src': 'förrgår|i förrgår|iförrgår|forrgar|i forrgar|iforrgar', 'value': -2 }, - { 'name': 'day', 'src': 'går|i går|igår|gar|i gar|igar', 'value': -1 }, - { 'name': 'day', 'src': 'dag|i dag|idag', 'value': 0 }, - { 'name': 'day', 'src': 'morgon|i morgon|imorgon', 'value': 1 }, - { 'name': 'day', 'src': 'över morgon|övermorgon|i över morgon|i övermorgon|iövermorgon|over morgon|overmorgon|i over morgon|i overmorgon|iovermorgon', 'value': 2 }, - { 'name': 'sign', 'src': 'sedan|sen', 'value': -1 }, - { 'name': 'sign', 'src': 'om', 'value': 1 }, - { 'name': 'shift', 'src': 'i förra|förra|i forra|forra', 'value': -1 }, - { 'name': 'shift', 'src': 'denna', 'value': 0 }, - { 'name': 'shift', 'src': 'nästa|nasta', 'value': 1 } - ], - 'parse': [ - '{months} {year?}', - '{num} {unit} {sign}', - '{sign} {num} {unit}', - '{1?} {num} {unit} {sign}', - '{shift} {unit:5-7}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift} {weekday}', - '{0?} {weekday?},? {date} {months?}\\.? {year?}' - ], - 'timeFrontParse': [ - '{day|weekday}', - '{shift} {weekday}', - '{0?} {weekday?},? {date} {months?}\\.? {year?}' - ] -}); diff --git a/dist/locales/zh-cn.js b/dist/locales/zh-cn.js deleted file mode 100644 index e304beec3..000000000 --- a/dist/locales/zh-cn.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Simplified Chinese locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('zh-CN') - * - */ -Sugar.Date.addLocale('zh-CN', { - 'ampmFront': true, - 'numeralUnits': true, - 'allowsFullWidth': true, - 'timeMarkerOptional': true, - 'units': '毫秒,秒钟,分钟,小时,天,个星期|周,个月,年', - 'weekdays': '星期日|日|周日|星期天,星期一|一|周一,星期二|二|周二,星期三|三|周三,星期四|四|周四,星期五|五|周五,星期六|六|周六', - 'numerals': '〇,一,二,三,四,五,六,七,八,九', - 'placeholders': '十,百,千,万', - 'short': '{yyyy}-{MM}-{dd}', - 'medium': '{yyyy}年{M}月{d}日', - 'long': '{yyyy}年{M}月{d}日{time}', - 'full': '{yyyy}年{M}月{d}日{weekday}{time}', - 'stamp': '{yyyy}年{M}月{d}日{H}:{mm}{dow}', - 'time': '{tt}{h}点{mm}分', - 'past': '{num}{unit}{sign}', - 'future': '{num}{unit}{sign}', - 'duration': '{num}{unit}', - 'timeSuffixes': ',秒,分钟?,点|时,日|号,,月,年', - 'ampm': '上午,下午', - 'modifiers': [ - { 'name': 'day', 'src': '大前天', 'value': -3 }, - { 'name': 'day', 'src': '前天', 'value': -2 }, - { 'name': 'day', 'src': '昨天', 'value': -1 }, - { 'name': 'day', 'src': '今天', 'value': 0 }, - { 'name': 'day', 'src': '明天', 'value': 1 }, - { 'name': 'day', 'src': '后天', 'value': 2 }, - { 'name': 'day', 'src': '大后天', 'value': 3 }, - { 'name': 'sign', 'src': '前', 'value': -1 }, - { 'name': 'sign', 'src': '后', 'value': 1 }, - { 'name': 'shift', 'src': '上|去', 'value': -1 }, - { 'name': 'shift', 'src': '这', 'value': 0 }, - { 'name': 'shift', 'src': '下|明', 'value': 1 } - ], - 'parse': [ - '{num}{unit}{sign}', - '{shift}{unit:5-7}', - '{year?}{month}', - '{year}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift}{weekday}', - '{year?}{month?}{date}' - ] -}); diff --git a/dist/locales/zh-tw.js b/dist/locales/zh-tw.js deleted file mode 100644 index 39f0c44cd..000000000 --- a/dist/locales/zh-tw.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Traditional Chinese locale definition. - * See the readme for customization and more information. - * To set this locale globally: - * - * Sugar.Date.setLocale('zh-TW') - * - */ -Sugar.Date.addLocale('zh-TW', { - 'ampmFront': true, - 'numeralUnits': true, - 'allowsFullWidth': true, - 'timeMarkerOptional': true, - 'units': '毫秒,秒鐘,分鐘,小時,天,個星期|週,個月,年', - 'weekdays': '星期日|日|週日|星期天,星期一|一|週一,星期二|二|週二,星期三|三|週三,星期四|四|週四,星期五|五|週五,星期六|六|週六', - 'numerals': '〇,一,二,三,四,五,六,七,八,九', - 'placeholders': '十,百,千,万', - 'short': '{yyyy}/{MM}/{dd}', - 'medium': '{yyyy}年{M}月{d}日', - 'long': '{yyyy}年{M}月{d}日{time}', - 'full': '{yyyy}年{M}月{d}日{weekday}{time}', - 'stamp': '{yyyy}年{M}月{d}日{H}:{mm}{dow}', - 'time': '{tt}{h}點{mm}分', - 'past': '{num}{unit}{sign}', - 'future': '{num}{unit}{sign}', - 'duration': '{num}{unit}', - 'timeSuffixes': ',秒,分鐘?,點|時,日|號,,月,年', - 'ampm': '上午,下午', - 'modifiers': [ - { 'name': 'day', 'src': '大前天', 'value': -3 }, - { 'name': 'day', 'src': '前天', 'value': -2 }, - { 'name': 'day', 'src': '昨天', 'value': -1 }, - { 'name': 'day', 'src': '今天', 'value': 0 }, - { 'name': 'day', 'src': '明天', 'value': 1 }, - { 'name': 'day', 'src': '後天', 'value': 2 }, - { 'name': 'day', 'src': '大後天', 'value': 3 }, - { 'name': 'sign', 'src': '前', 'value': -1 }, - { 'name': 'sign', 'src': '後', 'value': 1 }, - { 'name': 'shift', 'src': '上|去', 'value': -1 }, - { 'name': 'shift', 'src': '這', 'value': 0 }, - { 'name': 'shift', 'src': '下|明', 'value': 1 } - ], - 'parse': [ - '{num}{unit}{sign}', - '{shift}{unit:5-7}', - '{year?}{month}', - '{year}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift}{weekday}', - '{year?}{month?}{date}' - ] -}); diff --git a/dist/sugar-es5.js b/dist/sugar-es5.js deleted file mode 100644 index d6f8313c4..000000000 --- a/dist/sugar-es5.js +++ /dev/null @@ -1,14106 +0,0 @@ -/* - * Sugar v2.0.6 - * - * Freely distributable and licensed under the MIT-style license. - * Copyright (c) Andrew Plummer - * https://sugarjs.com/ - * - * ---------------------------- */ -(function() { - 'use strict'; - - /*** - * @module Core - * @description Core functionality including the ability to define methods and - * extend onto natives. - * - ***/ - - // The global to export. - var Sugar; - - // The name of Sugar in the global namespace. - var SUGAR_GLOBAL = 'Sugar'; - - // Natives available on initialization. Letting Object go first to ensure its - // global is set by the time the rest are checking for chainable Object methods. - var NATIVE_NAMES = 'Object Number String Array Date RegExp Function'; - - // Static method flag - var STATIC = 0x1; - - // Instance method flag - var INSTANCE = 0x2; - - // IE8 has a broken defineProperty but no defineProperties so this saves a try/catch. - var PROPERTY_DESCRIPTOR_SUPPORT = !!(Object.defineProperty && Object.defineProperties); - - var globalContext = getGlobal(); - - // Whether object instance methods can be mapped to the prototype. - var allowObjectPrototype = false; - - // A map from Array to SugarArray. - var namespacesByName = {}; - - // A map from [object Object] to namespace. - var namespacesByClassString = {}; - - // Defining properties. - // istanbul ignore next - var defineProperty = PROPERTY_DESCRIPTOR_SUPPORT ? Object.defineProperty : definePropertyShim; - - // A default chainable class for unknown types. - var DefaultChainable = getNewChainableClass('Chainable'); - - - // Global methods - - function getGlobal() { - // Get global context by keyword here to avoid issues with libraries - // that can potentially alter this script's context object. - return testGlobal(typeof global !== 'undefined' && global) || - testGlobal(typeof window !== 'undefined' && window); - } - - function testGlobal(obj) { - // Note that Rhino uses a different "global" keyword so perform an - // extra check here to ensure that it's actually the global object. - return obj && obj.Object === Object ? obj : null; - } - - function setupGlobal() { - Sugar = globalContext[SUGAR_GLOBAL]; - // istanbul ignore if - if (Sugar) { - // Reuse already defined Sugar global object. - return; - } - Sugar = function(arg) { - forEachProperty(Sugar, function(sugarNamespace, name) { - // Although only the only enumerable properties on the global - // object are Sugar namespaces, environments that can't set - // non-enumerable properties will step through the utility methods - // as well here, so use this check to only allow true namespaces. - if (hasOwn(namespacesByName, name)) { - sugarNamespace.extend(arg); - } - }); - return Sugar; - }; - // istanbul ignore else - if (typeof module !== 'undefined' && module.exports) { - // Node or webpack environment - module.exports = Sugar; - } else { - // Unwrapped browser environment - try { - globalContext[SUGAR_GLOBAL] = Sugar; - } catch (e) { - // Contexts such as QML have a read-only global context. - } - } - forEachProperty(NATIVE_NAMES.split(' '), function(name) { - createNamespace(name); - }); - setGlobalProperties(); - } - - /*** - * @method createNamespace(name) - * @returns SugarNamespace - * @namespace Sugar - * @short Creates a new Sugar namespace. - * @extra This method is for plugin developers who want to define methods to be - * used with natives that Sugar does not handle by default. The new - * namespace will appear on the `Sugar` global with all the methods of - * normal namespaces, including the ability to define new methods. When - * extended, any defined methods will be mapped to `name` in the global - * context. - * - * @example - * - * Sugar.createNamespace('Boolean'); - * - * @param {string} name - The namespace name. - * - ***/ - function createNamespace(name) { - - // Is the current namespace Object? - var isObject = name === 'Object'; - - // A Sugar namespace is also a chainable class: Sugar.Array, etc. - var sugarNamespace = getNewChainableClass(name, true); - - /*** - * @method extend([opts]) - * @returns Sugar - * @namespace Sugar - * @short Extends Sugar defined methods onto natives. - * @extra This method can be called on individual namespaces like - * `Sugar.Array` or on the `Sugar` global itself, in which case - * [opts] will be forwarded to each `extend` call. For more, - * see `extending`. - * - * @options - * - * methods An array of method names to explicitly extend. - * - * except An array of method names or global namespaces (`Array`, - * `String`) to explicitly exclude. Namespaces should be the - * actual global objects, not strings. - * - * namespaces An array of global namespaces (`Array`, `String`) to - * explicitly extend. Namespaces should be the actual - * global objects, not strings. - * - * enhance A shortcut to disallow all "enhance" flags at once - * (flags listed below). For more, see `enhanced methods`. - * Default is `true`. - * - * enhanceString A boolean allowing String enhancements. Default is `true`. - * - * enhanceArray A boolean allowing Array enhancements. Default is `true`. - * - * objectPrototype A boolean allowing Sugar to extend Object.prototype - * with instance methods. This option is off by default - * and should generally not be used except with caution. - * For more, see `object methods`. - * - * @example - * - * Sugar.Array.extend(); - * Sugar.extend(); - * - * @option {Array} [methods] - * @option {Array} [except] - * @option {Array} [namespaces] - * @option {boolean} [enhance] - * @option {boolean} [enhanceString] - * @option {boolean} [enhanceArray] - * @option {boolean} [objectPrototype] - * @param {ExtendOptions} [opts] - * - *** - * @method extend([opts]) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Extends Sugar defined methods for a specific namespace onto natives. - * @param {ExtendOptions} [opts] - * - ***/ - var extend = function (opts) { - - var nativeClass = globalContext[name], nativeProto = nativeClass.prototype; - var staticMethods = {}, instanceMethods = {}, methodsByName; - - function objectRestricted(name, target) { - return isObject && target === nativeProto && - (!allowObjectPrototype || name === 'get' || name === 'set'); - } - - function arrayOptionExists(field, val) { - var arr = opts[field]; - if (arr) { - for (var i = 0, el; el = arr[i]; i++) { - if (el === val) { - return true; - } - } - } - return false; - } - - function arrayOptionExcludes(field, val) { - return opts[field] && !arrayOptionExists(field, val); - } - - function disallowedByFlags(methodName, target, flags) { - // Disallowing methods by flag currently only applies if methods already - // exist to avoid enhancing native methods, as aliases should still be - // extended (i.e. Array#all should still be extended even if Array#every - // is being disallowed by a flag). - if (!target[methodName] || !flags) { - return false; - } - for (var i = 0; i < flags.length; i++) { - if (opts[flags[i]] === false) { - return true; - } - } - } - - function namespaceIsExcepted() { - return arrayOptionExists('except', nativeClass) || - arrayOptionExcludes('namespaces', nativeClass); - } - - function methodIsExcepted(methodName) { - return arrayOptionExists('except', methodName); - } - - function canExtend(methodName, method, target) { - return !objectRestricted(methodName, target) && - !disallowedByFlags(methodName, target, method.flags) && - !methodIsExcepted(methodName); - } - - opts = opts || {}; - methodsByName = opts.methods; - - if (namespaceIsExcepted()) { - return; - } else if (isObject && typeof opts.objectPrototype === 'boolean') { - // Store "objectPrototype" flag for future reference. - allowObjectPrototype = opts.objectPrototype; - } - - forEachProperty(methodsByName || sugarNamespace, function(method, methodName) { - if (methodsByName) { - // If we have method names passed in an array, - // then we need to flip the key and value here - // and find the method in the Sugar namespace. - methodName = method; - method = sugarNamespace[methodName]; - } - if (hasOwn(method, 'instance') && canExtend(methodName, method, nativeProto)) { - instanceMethods[methodName] = method.instance; - } - if(hasOwn(method, 'static') && canExtend(methodName, method, nativeClass)) { - staticMethods[methodName] = method; - } - }); - - // Accessing the extend target each time instead of holding a reference as - // it may have been overwritten (for example Date by Sinon). Also need to - // access through the global to allow extension of user-defined namespaces. - extendNative(nativeClass, staticMethods); - extendNative(nativeProto, instanceMethods); - - if (!methodsByName) { - // If there are no method names passed, then - // all methods in the namespace will be extended - // to the native. This includes all future defined - // methods, so add a flag here to check later. - setProperty(sugarNamespace, 'active', true); - } - return sugarNamespace; - }; - - function defineWithOptionCollect(methodName, instance, args) { - setProperty(sugarNamespace, methodName, function(arg1, arg2, arg3) { - var opts = collectDefineOptions(arg1, arg2, arg3); - defineMethods(sugarNamespace, opts.methods, instance, args, opts.last); - return sugarNamespace; - }); - } - - /*** - * @method defineStatic(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines static methods on the namespace that can later be extended - * onto the native globals. - * @extra Accepts either a single object mapping names to functions, or name - * and function as two arguments. If `extend` was previously called - * with no arguments, the method will be immediately mapped to its - * native when defined. - * - * @example - * - * Sugar.Number.defineStatic({ - * isOdd: function (num) { - * return num % 2 === 1; - * } - * }); - * - * @signature defineStatic(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineStatic', STATIC); - - /*** - * @method defineInstance(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines methods on the namespace that can later be extended as - * instance methods onto the native prototype. - * @extra Accepts either a single object mapping names to functions, or name - * and function as two arguments. All functions should accept the - * native for which they are mapped as their first argument, and should - * never refer to `this`. If `extend` was previously called with no - * arguments, the method will be immediately mapped to its native when - * defined. - * - * Methods cannot accept more than 4 arguments in addition to the - * native (5 arguments total). Any additional arguments will not be - * mapped. If the method needs to accept unlimited arguments, use - * `defineInstanceWithArguments`. Otherwise if more options are - * required, use an options object instead. - * - * @example - * - * Sugar.Number.defineInstance({ - * square: function (num) { - * return num * num; - * } - * }); - * - * @signature defineInstance(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineInstance', INSTANCE); - - /*** - * @method defineInstanceAndStatic(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short A shortcut to define both static and instance methods on the namespace. - * @extra This method is intended for use with `Object` instance methods. Sugar - * will not map any methods to `Object.prototype` by default, so defining - * instance methods as static helps facilitate their proper use. - * - * @example - * - * Sugar.Object.defineInstanceAndStatic({ - * isAwesome: function (obj) { - * // check if obj is awesome! - * } - * }); - * - * @signature defineInstanceAndStatic(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineInstanceAndStatic', INSTANCE | STATIC); - - - /*** - * @method defineStaticWithArguments(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines static methods that collect arguments. - * @extra This method is identical to `defineStatic`, except that when defined - * methods are called, they will collect any arguments past `n - 1`, - * where `n` is the number of arguments that the method accepts. - * Collected arguments will be passed to the method in an array - * as the last argument defined on the function. - * - * @example - * - * Sugar.Number.defineStaticWithArguments({ - * addAll: function (num, args) { - * for (var i = 0; i < args.length; i++) { - * num += args[i]; - * } - * return num; - * } - * }); - * - * @signature defineStaticWithArguments(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineStaticWithArguments', STATIC, true); - - /*** - * @method defineInstanceWithArguments(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines instance methods that collect arguments. - * @extra This method is identical to `defineInstance`, except that when - * defined methods are called, they will collect any arguments past - * `n - 1`, where `n` is the number of arguments that the method - * accepts. Collected arguments will be passed to the method as the - * last argument defined on the function. - * - * @example - * - * Sugar.Number.defineInstanceWithArguments({ - * addAll: function (num, args) { - * for (var i = 0; i < args.length; i++) { - * num += args[i]; - * } - * return num; - * } - * }); - * - * @signature defineInstanceWithArguments(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineInstanceWithArguments', INSTANCE, true); - - /*** - * @method defineStaticPolyfill(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines static methods that are mapped onto the native if they do - * not already exist. - * @extra Intended only for use creating polyfills that follow the ECMAScript - * spec. Accepts either a single object mapping names to functions, or - * name and function as two arguments. Note that polyfill methods will - * be immediately mapped onto their native prototype regardless of the - * use of `extend`. - * - * @example - * - * Sugar.Object.defineStaticPolyfill({ - * keys: function (obj) { - * // get keys! - * } - * }); - * - * @signature defineStaticPolyfill(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - setProperty(sugarNamespace, 'defineStaticPolyfill', function(arg1, arg2, arg3) { - var opts = collectDefineOptions(arg1, arg2, arg3); - extendNative(globalContext[name], opts.methods, true, opts.last); - return sugarNamespace; - }); - - /*** - * @method defineInstancePolyfill(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines instance methods that are mapped onto the native prototype - * if they do not already exist. - * @extra Intended only for use creating polyfills that follow the ECMAScript - * spec. Accepts either a single object mapping names to functions, or - * name and function as two arguments. This method differs from - * `defineInstance` as there is no static signature (as the method - * is mapped as-is to the native), so it should refer to its `this` - * object. Note that polyfill methods will be immediately mapped onto - * their native prototype regardless of the use of `extend`. - * - * @example - * - * Sugar.Array.defineInstancePolyfill({ - * indexOf: function (arr, el) { - * // index finding code here! - * } - * }); - * - * @signature defineInstancePolyfill(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - setProperty(sugarNamespace, 'defineInstancePolyfill', function(arg1, arg2, arg3) { - var opts = collectDefineOptions(arg1, arg2, arg3); - extendNative(globalContext[name].prototype, opts.methods, true, opts.last); - // Map instance polyfills to chainable as well. - forEachProperty(opts.methods, function(fn, methodName) { - defineChainableMethod(sugarNamespace, methodName, fn); - }); - return sugarNamespace; - }); - - /*** - * @method alias(toName, from) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Aliases one Sugar method to another. - * - * @example - * - * Sugar.Array.alias('all', 'every'); - * - * @signature alias(toName, fn) - * @param {string} toName - Name for new method. - * @param {string|Function} from - Method to alias, or string shortcut. - ***/ - setProperty(sugarNamespace, 'alias', function(name, source) { - var method = typeof source === 'string' ? sugarNamespace[source] : source; - setMethod(sugarNamespace, name, method); - return sugarNamespace; - }); - - // Each namespace can extend only itself through its .extend method. - setProperty(sugarNamespace, 'extend', extend); - - // Cache the class to namespace relationship for later use. - namespacesByName[name] = sugarNamespace; - namespacesByClassString['[object ' + name + ']'] = sugarNamespace; - - mapNativeToChainable(name); - mapObjectChainablesToNamespace(sugarNamespace); - - - // Export - return Sugar[name] = sugarNamespace; - } - - function setGlobalProperties() { - setProperty(Sugar, 'VERSION', '2.0.6'); - setProperty(Sugar, 'extend', Sugar); - setProperty(Sugar, 'toString', toString); - setProperty(Sugar, 'createNamespace', createNamespace); - - setProperty(Sugar, 'util', { - 'hasOwn': hasOwn, - 'getOwn': getOwn, - 'setProperty': setProperty, - 'classToString': classToString, - 'defineProperty': defineProperty, - 'forEachProperty': forEachProperty, - 'mapNativeToChainable': mapNativeToChainable - }); - } - - function toString() { - return SUGAR_GLOBAL; - } - - - // Defining Methods - - function defineMethods(sugarNamespace, methods, type, args, flags) { - forEachProperty(methods, function(method, methodName) { - var instanceMethod, staticMethod = method; - if (args) { - staticMethod = wrapMethodWithArguments(method); - } - if (flags) { - staticMethod.flags = flags; - } - - // A method may define its own custom implementation, so - // make sure that's not the case before creating one. - if (type & INSTANCE && !method.instance) { - instanceMethod = wrapInstanceMethod(method, args); - setProperty(staticMethod, 'instance', instanceMethod); - } - - if (type & STATIC) { - setProperty(staticMethod, 'static', true); - } - - setMethod(sugarNamespace, methodName, staticMethod); - - if (sugarNamespace.active) { - // If the namespace has been activated (.extend has been called), - // then map this method as well. - sugarNamespace.extend(methodName); - } - }); - } - - function collectDefineOptions(arg1, arg2, arg3) { - var methods, last; - if (typeof arg1 === 'string') { - methods = {}; - methods[arg1] = arg2; - last = arg3; - } else { - methods = arg1; - last = arg2; - } - return { - last: last, - methods: methods - }; - } - - function wrapInstanceMethod(fn, args) { - return args ? wrapMethodWithArguments(fn, true) : wrapInstanceMethodFixed(fn); - } - - function wrapMethodWithArguments(fn, instance) { - // Functions accepting enumerated arguments will always have "args" as the - // last argument, so subtract one from the function length to get the point - // at which to start collecting arguments. If this is an instance method on - // a prototype, then "this" will be pushed into the arguments array so start - // collecting 1 argument earlier. - var startCollect = fn.length - 1 - (instance ? 1 : 0); - return function() { - var args = [], collectedArgs = [], len; - if (instance) { - args.push(this); - } - len = Math.max(arguments.length, startCollect); - // Optimized: no leaking arguments - for (var i = 0; i < len; i++) { - if (i < startCollect) { - args.push(arguments[i]); - } else { - collectedArgs.push(arguments[i]); - } - } - args.push(collectedArgs); - return fn.apply(this, args); - }; - } - - function wrapInstanceMethodFixed(fn) { - switch(fn.length) { - // Wrapped instance methods will always be passed the instance - // as the first argument, but requiring the argument to be defined - // may cause confusion here, so return the same wrapped function regardless. - case 0: - case 1: - return function() { - return fn(this); - }; - case 2: - return function(a) { - return fn(this, a); - }; - case 3: - return function(a, b) { - return fn(this, a, b); - }; - case 4: - return function(a, b, c) { - return fn(this, a, b, c); - }; - case 5: - return function(a, b, c, d) { - return fn(this, a, b, c, d); - }; - } - } - - // Method helpers - - function extendNative(target, source, polyfill, override) { - forEachProperty(source, function(method, name) { - if (polyfill && !override && target[name]) { - // Method exists, so bail. - return; - } - setProperty(target, name, method); - }); - } - - function setMethod(sugarNamespace, methodName, method) { - sugarNamespace[methodName] = method; - if (method.instance) { - defineChainableMethod(sugarNamespace, methodName, method.instance, true); - } - } - - - // Chainables - - function getNewChainableClass(name) { - var fn = function SugarChainable(obj, arg) { - if (!(this instanceof fn)) { - return new fn(obj, arg); - } - if (this.constructor !== fn) { - // Allow modules to define their own constructors. - obj = this.constructor.apply(obj, arguments); - } - this.raw = obj; - }; - setProperty(fn, 'toString', function() { - return SUGAR_GLOBAL + name; - }); - setProperty(fn.prototype, 'valueOf', function() { - return this.raw; - }); - return fn; - } - - function defineChainableMethod(sugarNamespace, methodName, fn) { - var wrapped = wrapWithChainableResult(fn), existing, collision, dcp; - dcp = DefaultChainable.prototype; - existing = dcp[methodName]; - - // If the method was previously defined on the default chainable, then a - // collision exists, so set the method to a disambiguation function that will - // lazily evaluate the object and find it's associated chainable. An extra - // check is required to avoid false positives from Object inherited methods. - collision = existing && existing !== Object.prototype[methodName]; - - // The disambiguation function is only required once. - if (!existing || !existing.disambiguate) { - dcp[methodName] = collision ? disambiguateMethod(methodName) : wrapped; - } - - // The target chainable always receives the wrapped method. Additionally, - // if the target chainable is Sugar.Object, then map the wrapped method - // to all other namespaces as well if they do not define their own method - // of the same name. This way, a Sugar.Number will have methods like - // isEqual that can be called on any object without having to traverse up - // the prototype chain and perform disambiguation, which costs cycles. - // Note that the "if" block below actually does nothing on init as Object - // goes first and no other namespaces exist yet. However it needs to be - // here as Object instance methods defined later also need to be mapped - // back onto existing namespaces. - sugarNamespace.prototype[methodName] = wrapped; - if (sugarNamespace === Sugar.Object) { - mapObjectChainableToAllNamespaces(methodName, wrapped); - } - } - - function mapObjectChainablesToNamespace(sugarNamespace) { - forEachProperty(Sugar.Object && Sugar.Object.prototype, function(val, methodName) { - if (typeof val === 'function') { - setObjectChainableOnNamespace(sugarNamespace, methodName, val); - } - }); - } - - function mapObjectChainableToAllNamespaces(methodName, fn) { - forEachProperty(namespacesByName, function(sugarNamespace) { - setObjectChainableOnNamespace(sugarNamespace, methodName, fn); - }); - } - - function setObjectChainableOnNamespace(sugarNamespace, methodName, fn) { - var proto = sugarNamespace.prototype; - if (!hasOwn(proto, methodName)) { - proto[methodName] = fn; - } - } - - function wrapWithChainableResult(fn) { - return function() { - return new DefaultChainable(fn.apply(this.raw, arguments)); - }; - } - - function disambiguateMethod(methodName) { - var fn = function() { - var raw = this.raw, sugarNamespace; - if (raw != null) { - // Find the Sugar namespace for this unknown. - sugarNamespace = namespacesByClassString[classToString(raw)]; - } - if (!sugarNamespace) { - // If no sugarNamespace can be resolved, then default - // back to Sugar.Object so that undefined and other - // non-supported types can still have basic object - // methods called on them, such as type checks. - sugarNamespace = Sugar.Object; - } - - return new sugarNamespace(raw)[methodName].apply(this, arguments); - }; - fn.disambiguate = true; - return fn; - } - - function mapNativeToChainable(name, methodNames) { - var sugarNamespace = namespacesByName[name], - nativeProto = globalContext[name].prototype; - - if (!methodNames && ownPropertyNames) { - methodNames = ownPropertyNames(nativeProto); - } - - forEachProperty(methodNames, function(methodName) { - if (nativeMethodProhibited(methodName)) { - // Sugar chainables have their own constructors as well as "valueOf" - // methods, so exclude them here. The __proto__ argument should be trapped - // by the function check below, however simply accessing this property on - // Object.prototype causes QML to segfault, so pre-emptively excluding it. - return; - } - try { - var fn = nativeProto[methodName]; - if (typeof fn !== 'function') { - // Bail on anything not a function. - return; - } - } catch (e) { - // Function.prototype has properties that - // will throw errors when accessed. - return; - } - defineChainableMethod(sugarNamespace, methodName, fn); - }); - } - - function nativeMethodProhibited(methodName) { - return methodName === 'constructor' || - methodName === 'valueOf' || - methodName === '__proto__'; - } - - - // Util - - // Internal references - var ownPropertyNames = Object.getOwnPropertyNames, - internalToString = Object.prototype.toString, - internalHasOwnProperty = Object.prototype.hasOwnProperty; - - // Defining this as a variable here as the ES5 module - // overwrites it to patch DONTENUM. - var forEachProperty = function (obj, fn) { - for(var key in obj) { - if (!hasOwn(obj, key)) continue; - if (fn.call(obj, obj[key], key, obj) === false) break; - } - }; - - // istanbul ignore next - function definePropertyShim(obj, prop, descriptor) { - obj[prop] = descriptor.value; - } - - function setProperty(target, name, value, enumerable) { - defineProperty(target, name, { - value: value, - enumerable: !!enumerable, - configurable: true, - writable: true - }); - } - - // PERF: Attempts to speed this method up get very Heisenbergy. Quickly - // returning based on typeof works for primitives, but slows down object - // types. Even === checks on null and undefined (no typeof) will end up - // basically breaking even. This seems to be as fast as it can go. - function classToString(obj) { - return internalToString.call(obj); - } - - function hasOwn(obj, prop) { - return !!obj && internalHasOwnProperty.call(obj, prop); - } - - function getOwn(obj, prop) { - if (hasOwn(obj, prop)) { - return obj[prop]; - } - } - - setupGlobal(); - - /*** - * @module Common - * @description Internal utility and common methods. - ***/ - - // Flag allowing native methods to be enhanced. - var ENHANCEMENTS_FLAG = 'enhance'; - - // For type checking, etc. Excludes object as this is more nuanced. - var NATIVE_TYPES = 'Boolean Number String Date RegExp Function Array Error Set Map'; - - // Do strings have no keys? - var NO_KEYS_IN_STRING_OBJECTS = !('0' in Object('a')); - - // Prefix for private properties. - var PRIVATE_PROP_PREFIX = '_sugar_'; - - // Matches 1..2 style ranges in properties. - var PROPERTY_RANGE_REG = /^(.*?)\[([-\d]*)\.\.([-\d]*)\](.*)$/; - - // WhiteSpace/LineTerminator as defined in ES5.1 plus Unicode characters in the Space, Separator category. - var TRIM_CHARS = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF'; - - // Regex for matching a formatted string. - var STRING_FORMAT_REG = /([{}])\1|{([^}]*)}|(%)%|(%(\w*))/g; - - // Common chars - var HALF_WIDTH_ZERO = 0x30, - FULL_WIDTH_ZERO = 0xff10, - HALF_WIDTH_PERIOD = '.', - FULL_WIDTH_PERIOD = '.', - HALF_WIDTH_COMMA = ',', - OPEN_BRACE = '{', - CLOSE_BRACE = '}'; - - // Namespace aliases - var sugarObject = Sugar.Object, - sugarArray = Sugar.Array, - sugarDate = Sugar.Date, - sugarString = Sugar.String, - sugarNumber = Sugar.Number, - sugarFunction = Sugar.Function, - sugarRegExp = Sugar.RegExp; - - // Class checks - var isSerializable, - isBoolean, isNumber, isString, - isDate, isRegExp, isFunction, - isArray, isSet, isMap, isError; - - function buildClassChecks() { - - var knownTypes = {}; - - function addCoreTypes() { - - var names = spaceSplit(NATIVE_TYPES); - - isBoolean = buildPrimitiveClassCheck(names[0]); - isNumber = buildPrimitiveClassCheck(names[1]); - isString = buildPrimitiveClassCheck(names[2]); - - isDate = buildClassCheck(names[3]); - isRegExp = buildClassCheck(names[4]); - - // Wanted to enhance performance here by using simply "typeof" - // but Firefox has two major issues that make this impossible, - // one fixed, the other not, so perform a full class check here. - // - // 1. Regexes can be typeof "function" in FF < 3 - // https://bugzilla.mozilla.org/show_bug.cgi?id=61911 (fixed) - // - // 2. HTMLEmbedElement and HTMLObjectElement are be typeof "function" - // https://bugzilla.mozilla.org/show_bug.cgi?id=268945 (won't fix) - isFunction = buildClassCheck(names[5]); - - // istanbul ignore next - isArray = Array.isArray || buildClassCheck(names[6]); - isError = buildClassCheck(names[7]); - - isSet = buildClassCheck(names[8], typeof Set !== 'undefined' && Set); - isMap = buildClassCheck(names[9], typeof Map !== 'undefined' && Map); - - // Add core types as known so that they can be checked by value below, - // notably excluding Functions and adding Arguments and Error. - addKnownType('Arguments'); - addKnownType(names[0]); - addKnownType(names[1]); - addKnownType(names[2]); - addKnownType(names[3]); - addKnownType(names[4]); - addKnownType(names[6]); - - } - - function addArrayTypes() { - var types = 'Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64'; - forEach(spaceSplit(types), function(str) { - addKnownType(str + 'Array'); - }); - } - - function addKnownType(className) { - var str = '[object '+ className +']'; - knownTypes[str] = true; - } - - function isKnownType(className) { - return knownTypes[className]; - } - - function buildClassCheck(className, globalObject) { - // istanbul ignore if - if (globalObject && isClass(new globalObject, 'Object')) { - return getConstructorClassCheck(globalObject); - } else { - return getToStringClassCheck(className); - } - } - - // Map and Set may be [object Object] in certain IE environments. - // In this case we need to perform a check using the constructor - // instead of Object.prototype.toString. - // istanbul ignore next - function getConstructorClassCheck(obj) { - var ctorStr = String(obj); - return function(obj) { - return String(obj.constructor) === ctorStr; - }; - } - - function getToStringClassCheck(className) { - return function(obj, str) { - // perf: Returning up front on instanceof appears to be slower. - return isClass(obj, className, str); - }; - } - - function buildPrimitiveClassCheck(className) { - var type = className.toLowerCase(); - return function(obj) { - var t = typeof obj; - return t === type || t === 'object' && isClass(obj, className); - }; - } - - addCoreTypes(); - addArrayTypes(); - - isSerializable = function(obj, className) { - // Only known objects can be serialized. This notably excludes functions, - // host objects, Symbols (which are matched by reference), and instances - // of classes. The latter can arguably be matched by value, but - // distinguishing between these and host objects -- which should never be - // compared by value -- is very tricky so not dealing with it here. - return isKnownType(className) || isPlainObject(obj, className); - }; - - } - - function isClass(obj, className, str) { - if (!str) { - str = classToString(obj); - } - return str === '[object '+ className +']'; - } - - // Wrapping the core's "define" methods to - // save a few bytes in the minified script. - function wrapNamespace(method) { - return function(sugarNamespace, arg1, arg2) { - sugarNamespace[method](arg1, arg2); - }; - } - - // Method define aliases - var alias = wrapNamespace('alias'), - defineStatic = wrapNamespace('defineStatic'), - defineInstance = wrapNamespace('defineInstance'), - defineStaticPolyfill = wrapNamespace('defineStaticPolyfill'), - defineInstancePolyfill = wrapNamespace('defineInstancePolyfill'), - defineInstanceAndStatic = wrapNamespace('defineInstanceAndStatic'), - defineInstanceWithArguments = wrapNamespace('defineInstanceWithArguments'); - - function defineInstanceSimilar(sugarNamespace, set, fn, flags) { - defineInstance(sugarNamespace, collectSimilarMethods(set, fn), flags); - } - - function defineInstanceAndStaticSimilar(sugarNamespace, set, fn, flags) { - defineInstanceAndStatic(sugarNamespace, collectSimilarMethods(set, fn), flags); - } - - function collectSimilarMethods(set, fn) { - var methods = {}; - if (isString(set)) { - set = spaceSplit(set); - } - forEach(set, function(el, i) { - fn(methods, el, i); - }); - return methods; - } - - // This song and dance is to fix methods to a different length - // from what they actually accept in order to stay in line with - // spec. Additionally passing argument length, as some methods - // throw assertion errors based on this (undefined check is not - // enough). Fortunately for now spec is such that passing 3 - // actual arguments covers all requirements. Note that passing - // the argument length also forces the compiler to not rewrite - // length of the compiled function. - function fixArgumentLength(fn) { - var staticFn = function(a) { - var args = arguments; - return fn(a, args[1], args[2], args.length - 1); - }; - staticFn.instance = function(b) { - var args = arguments; - return fn(this, b, args[1], args.length); - }; - return staticFn; - } - - function defineAccessor(namespace, name, fn) { - setProperty(namespace, name, fn); - } - - function defineOptionsAccessor(namespace, defaults) { - var obj = simpleClone(defaults); - - function getOption(name) { - return obj[name]; - } - - function setOption(arg1, arg2) { - var options; - if (arguments.length === 1) { - options = arg1; - } else { - options = {}; - options[arg1] = arg2; - } - forEachProperty(options, function(val, name) { - if (val === null) { - val = defaults[name]; - } - obj[name] = val; - }); - } - - defineAccessor(namespace, 'getOption', getOption); - defineAccessor(namespace, 'setOption', setOption); - return getOption; - } - - // For methods defined directly on the prototype like Range - function defineOnPrototype(ctor, methods) { - var proto = ctor.prototype; - forEachProperty(methods, function(val, key) { - proto[key] = val; - }); - } - - // Argument helpers - - function assertArgument(exists) { - if (!exists) { - throw new TypeError('Argument required'); - } - } - - function assertCallable(obj) { - if (!isFunction(obj)) { - throw new TypeError('Function is not callable'); - } - } - - function assertArray(obj) { - if (!isArray(obj)) { - throw new TypeError('Array required'); - } - } - - function assertWritable(obj) { - if (isPrimitive(obj)) { - // If strict mode is active then primitives will throw an - // error when attempting to write properties. We can't be - // sure if strict mode is available, so pre-emptively - // throw an error here to ensure consistent behavior. - throw new TypeError('Property cannot be written'); - } - } - - // Coerces an object to a positive integer. - // Does not allow Infinity. - function coercePositiveInteger(n) { - n = +n || 0; - if (n < 0 || !isNumber(n) || !isFinite(n)) { - throw new RangeError('Invalid number'); - } - return trunc(n); - } - - - // General helpers - - function isDefined(o) { - return o !== undefined; - } - - function isUndefined(o) { - return o === undefined; - } - - function privatePropertyAccessor(key) { - var privateKey = PRIVATE_PROP_PREFIX + key; - return function(obj, val) { - if (arguments.length > 1) { - setProperty(obj, privateKey, val); - return obj; - } - return obj[privateKey]; - }; - } - - function setChainableConstructor(sugarNamespace, createFn) { - sugarNamespace.prototype.constructor = function() { - return createFn.apply(this, arguments); - }; - } - - // Fuzzy matching helpers - - function getMatcher(f) { - if (!isPrimitive(f)) { - var className = classToString(f); - if (isRegExp(f, className)) { - return regexMatcher(f); - } else if (isDate(f, className)) { - return dateMatcher(f); - } else if (isFunction(f, className)) { - return functionMatcher(f); - } else if (isPlainObject(f, className)) { - return fuzzyMatcher(f); - } - } - // Default is standard isEqual - return defaultMatcher(f); - } - - function fuzzyMatcher(obj) { - var matchers = {}; - return function(el, i, arr) { - var matched = true; - if (!isObjectType(el)) { - return false; - } - forEachProperty(obj, function(val, key) { - matchers[key] = getOwn(matchers, key) || getMatcher(val); - if (matchers[key].call(arr, el[key], i, arr) === false) { - matched = false; - } - return matched; - }); - return matched; - }; - } - - function defaultMatcher(f) { - return function(el) { - return isEqual(el, f); - }; - } - - function regexMatcher(reg) { - reg = RegExp(reg); - return function(el) { - return reg.test(el); - }; - } - - function dateMatcher(d) { - var ms = d.getTime(); - return function(el) { - return !!(el && el.getTime) && el.getTime() === ms; - }; - } - - function functionMatcher(fn) { - return function(el, i, arr) { - // Return true up front if match by reference - return el === fn || fn.call(arr, el, i, arr); - }; - } - - // Object helpers - - function getKeys(obj) { - return Object.keys(obj); - } - - function deepHasProperty(obj, key, any) { - return handleDeepProperty(obj, key, any, true); - } - - function deepGetProperty(obj, key, any) { - return handleDeepProperty(obj, key, any, false); - } - - function deepSetProperty(obj, key, val) { - handleDeepProperty(obj, key, false, false, true, false, val); - return obj; - } - - function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { - var ns, bs, ps, cbi, set, isLast, isPush, isIndex, nextIsIndex, exists; - ns = obj; - if (key == null) return; - - if (isObjectType(key)) { - // Allow array and array-like accessors - bs = [key]; - } else { - key = String(key); - if (key.indexOf('..') !== -1) { - return handleArrayIndexRange(obj, key, any, val); - } - bs = key.split('['); - } - - set = isDefined(val); - - for (var i = 0, blen = bs.length; i < blen; i++) { - ps = bs[i]; - - if (isString(ps)) { - ps = periodSplit(ps); - } - - for (var j = 0, plen = ps.length; j < plen; j++) { - key = ps[j]; - - // Is this the last key? - isLast = i === blen - 1 && j === plen - 1; - - // Index of the closing ] - cbi = key.indexOf(']'); - - // Is the key an array index? - isIndex = cbi !== -1; - - // Is this array push syntax "[]"? - isPush = set && cbi === 0; - - // If the bracket split was successful and this is the last element - // in the dot split, then we know the next key will be an array index. - nextIsIndex = blen > 1 && j === plen - 1; - - if (isPush) { - // Set the index to the end of the array - key = ns.length; - } else if (isIndex) { - // Remove the closing ] - key = key.slice(0, -1); - } - - // If the array index is less than 0, then - // add its length to allow negative indexes. - if (isIndex && key < 0) { - key = +key + ns.length; - } - - // Bracket keys may look like users[5] or just [5], so the leading - // characters are optional. We can enter the namespace if this is the - // 2nd part, if there is only 1 part, or if there is an explicit key. - if (i || key || blen === 1) { - - // TODO: need to be sure this check handles ''.length when - // we refactor. - exists = any ? key in Object(ns) : hasOwn(ns, key); - - // Non-existent namespaces are only filled if they are intermediate - // (not at the end) or explicitly filling the last. - if (fill && (!isLast || fillLast) && !exists) { - // For our purposes, last only needs to be an array. - ns = ns[key] = nextIsIndex || (fillLast && isLast) ? [] : {}; - continue; - } - - if (has) { - if (isLast || !exists) { - return exists; - } - } else if (set && isLast) { - assertWritable(ns); - ns[key] = val; - } - - ns = exists ? ns[key] : undefined; - } - - } - } - return ns; - } - - // Get object property with support for 0..1 style range notation. - function handleArrayIndexRange(obj, key, any, val) { - var match, start, end, leading, trailing, arr, set; - match = key.match(PROPERTY_RANGE_REG); - if (!match) { - return; - } - - set = isDefined(val); - leading = match[1]; - - if (leading) { - arr = handleDeepProperty(obj, leading, any, false, set ? true : false, true); - } else { - arr = obj; - } - - assertArray(arr); - - trailing = match[4]; - start = match[2] ? +match[2] : 0; - end = match[3] ? +match[3] : arr.length; - - // A range of 0..1 is inclusive, so we need to add 1 to the end. If this - // pushes the index from -1 to 0, then set it to the full length of the - // array, otherwise it will return nothing. - end = end === -1 ? arr.length : end + 1; - - if (set) { - for (var i = start; i < end; i++) { - handleDeepProperty(arr, i + trailing, any, false, true, false, val); - } - } else { - arr = arr.slice(start, end); - - // If there are trailing properties, then they need to be mapped for each - // element in the array. - if (trailing) { - if (trailing.charAt(0) === HALF_WIDTH_PERIOD) { - // Need to chomp the period if one is trailing after the range. We - // can't do this at the regex level because it will be required if - // we're setting the value as it needs to be concatentated together - // with the array index to be set. - trailing = trailing.slice(1); - } - return map(arr, function(el) { - return handleDeepProperty(el, trailing); - }); - } - } - return arr; - } - - function getOwnKey(obj, key) { - if (hasOwn(obj, key)) { - return key; - } - } - - function hasProperty(obj, prop) { - return !isPrimitive(obj) && prop in obj; - } - - function isObjectType(obj, type) { - return !!obj && (type || typeof obj) === 'object'; - } - - function isPrimitive(obj, type) { - type = type || typeof obj; - return obj == null || type === 'string' || type === 'number' || type === 'boolean'; - } - - function isPlainObject(obj, className) { - return isObjectType(obj) && - isClass(obj, 'Object', className) && - hasValidPlainObjectPrototype(obj) && - hasOwnEnumeratedProperties(obj); - } - - function hasValidPlainObjectPrototype(obj) { - var hasToString = 'toString' in obj; - var hasConstructor = 'constructor' in obj; - // An object created with Object.create(null) has no methods in the - // prototype chain, so check if any are missing. The additional hasToString - // check is for false positives on some host objects in old IE which have - // toString but no constructor. If the object has an inherited constructor, - // then check if it is Object (the "isPrototypeOf" tapdance here is a more - // robust way of ensuring this if the global has been hijacked). Note that - // accessing the constructor directly (without "in" or "hasOwnProperty") - // will throw a permissions error in IE8 on cross-domain windows. - return (!hasConstructor && !hasToString) || - (hasConstructor && !hasOwn(obj, 'constructor') && - hasOwn(obj.constructor.prototype, 'isPrototypeOf')); - } - - function hasOwnEnumeratedProperties(obj) { - // Plain objects are generally defined as having enumerated properties - // all their own, however in early IE environments without defineProperty, - // there may also be enumerated methods in the prototype chain, so check - // for both of these cases. - var objectProto = Object.prototype; - for (var key in obj) { - var val = obj[key]; - if (!hasOwn(obj, key) && val !== objectProto[key]) { - return false; - } - } - return true; - } - - function simpleRepeat(n, fn) { - for (var i = 0; i < n; i++) { - fn(i); - } - } - - function simpleClone(obj) { - return simpleMerge({}, obj); - } - - // TODO: Use Object.assign here going forward. - function simpleMerge(target, source) { - forEachProperty(source, function(val, key) { - target[key] = val; - }); - return target; - } - - // Make primtives types like strings into objects. - function coercePrimitiveToObject(obj) { - if (isPrimitive(obj)) { - obj = Object(obj); - } - // istanbul ignore next - if (NO_KEYS_IN_STRING_OBJECTS && isString(obj)) { - forceStringCoercion(obj); - } - return obj; - } - - // Force strings to have their indexes set in - // environments that don't do this automatically. - // istanbul ignore next - function forceStringCoercion(obj) { - var i = 0, chr; - while (chr = obj.charAt(i)) { - obj[i++] = chr; - } - } - - // Equality helpers - - // Perf - function isEqual(a, b, stack) { - var aClass, bClass; - if (a === b) { - // Return quickly up front when matched by reference, - // but be careful about 0 !== -0. - return a !== 0 || 1 / a === 1 / b; - } - aClass = classToString(a); - bClass = classToString(b); - if (aClass !== bClass) { - return false; - } - - if (isSerializable(a, aClass) && isSerializable(b, bClass)) { - return objectIsEqual(a, b, aClass, stack); - } else if (isSet(a, aClass) && isSet(b, bClass)) { - return a.size === b.size && isEqual(setToArray(a), setToArray(b), stack); - } else if (isMap(a, aClass) && isMap(b, bClass)) { - return a.size === b.size && isEqual(mapToArray(a), mapToArray(b), stack); - } else if (isError(a, aClass) && isError(b, bClass)) { - return a.toString() === b.toString(); - } - - return false; - } - - // Perf - function objectIsEqual(a, b, aClass, stack) { - var aType = typeof a, bType = typeof b, propsEqual, count; - if (aType !== bType) { - return false; - } - if (isObjectType(a.valueOf())) { - if (a.length !== b.length) { - // perf: Quickly returning up front for arrays. - return false; - } - count = 0; - propsEqual = true; - iterateWithCyclicCheck(a, false, stack, function(key, val, cyc, stack) { - if (!cyc && (!(key in b) || !isEqual(val, b[key], stack))) { - propsEqual = false; - } - count++; - return propsEqual; - }); - if (!propsEqual || count !== getKeys(b).length) { - return false; - } - } - // Stringifying the value handles NaN, wrapped primitives, dates, and errors in one go. - return a.valueOf().toString() === b.valueOf().toString(); - } - - // Serializes an object in a way that will provide a token unique - // to the type, class, and value of an object. Host objects, class - // instances etc, are not serializable, and are held in an array - // of references that will return the index as a unique identifier - // for the object. This array is passed from outside so that the - // calling function can decide when to dispose of this array. - function serializeInternal(obj, refs, stack) { - var type = typeof obj, sign = '', className, value, ref; - - // Return up front on - if (1 / obj === -Infinity) { - sign = '-'; - } - - // Return quickly for primitives to save cycles - if (isPrimitive(obj, type) && !isRealNaN(obj)) { - return type + sign + obj; - } - - className = classToString(obj); - - if (!isSerializable(obj, className)) { - ref = indexOf(refs, obj); - if (ref === -1) { - ref = refs.length; - refs.push(obj); - } - return ref; - } else if (isObjectType(obj)) { - value = serializeDeep(obj, refs, stack) + obj.toString(); - } else if (obj.valueOf) { - value = obj.valueOf(); - } - return type + className + sign + value; - } - - function serializeDeep(obj, refs, stack) { - var result = ''; - iterateWithCyclicCheck(obj, true, stack, function(key, val, cyc, stack) { - result += cyc ? 'CYC' : key + serializeInternal(val, refs, stack); - }); - return result; - } - - function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { - - function next(val, key) { - var cyc = false; - - // Allowing a step into the structure before triggering this check to save - // cycles on standard JSON structures and also to try as hard as possible to - // catch basic properties that may have been modified. - if (stack.length > 1) { - var i = stack.length; - while (i--) { - if (stack[i] === val) { - cyc = true; - } - } - } - - stack.push(val); - fn(key, val, cyc, stack); - stack.pop(); - } - - function iterateWithSortedKeys() { - // Sorted keys is required for serialization, where object order - // does not matter but stringified order does. - var arr = getKeys(obj).sort(), key; - for (var i = 0; i < arr.length; i++) { - key = arr[i]; - next(obj[key], arr[i]); - } - } - - // This method for checking for cyclic structures was egregiously stolen from - // the ingenious method by @kitcambridge from the Underscore script: - // https://github.com/documentcloud/underscore/issues/240 - if (!stack) { - stack = []; - } - - if (sortedKeys) { - iterateWithSortedKeys(); - } else { - forEachProperty(obj, next); - } - } - - - // Array helpers - - function isArrayIndex(n) { - return n >>> 0 == n && n != 0xFFFFFFFF; - } - - function iterateOverSparseArray(arr, fn, fromIndex, loop) { - var indexes = getSparseArrayIndexes(arr, fromIndex, loop), index; - for (var i = 0, len = indexes.length; i < len; i++) { - index = indexes[i]; - fn.call(arr, arr[index], index, arr); - } - return arr; - } - - // It's unclear whether or not sparse arrays qualify as "simple enumerables". - // If they are not, however, the wrapping function will be deoptimized, so - // isolate here (also to share between es5 and array modules). - function getSparseArrayIndexes(arr, fromIndex, loop, fromRight) { - var indexes = [], i; - for (i in arr) { - // istanbul ignore next - if (isArrayIndex(i) && (loop || (fromRight ? i <= fromIndex : i >= fromIndex))) { - indexes.push(+i); - } - } - indexes.sort(function(a, b) { - var aLoop = a > fromIndex; - var bLoop = b > fromIndex; - // This block cannot be reached unless ES5 methods are being shimmed. - // istanbul ignore if - if (aLoop !== bLoop) { - return aLoop ? -1 : 1; - } - return a - b; - }); - return indexes; - } - - function getEntriesForIndexes(obj, find, loop, isString) { - var result, length = obj.length; - if (!isArray(find)) { - return entryAtIndex(obj, find, length, loop, isString); - } - result = new Array(find.length); - forEach(find, function(index, i) { - result[i] = entryAtIndex(obj, index, length, loop, isString); - }); - return result; - } - - function getNormalizedIndex(index, length, loop) { - if (index && loop) { - index = index % length; - } - if (index < 0) index = length + index; - return index; - } - - function entryAtIndex(obj, index, length, loop, isString) { - index = getNormalizedIndex(index, length, loop); - return isString ? obj.charAt(index) : obj[index]; - } - - function mapWithShortcuts(el, f, context, mapArgs) { - if (!f) { - return el; - } else if (f.apply) { - return f.apply(context, mapArgs); - } else if (isArray(f)) { - return map(f, function(m) { - return mapWithShortcuts(el, m, context, mapArgs); - }); - } else if (isFunction(el[f])) { - return el[f].call(el); - } else { - return deepGetProperty(el, f, true); - } - } - - function spaceSplit(str) { - return str.split(' '); - } - - function commaSplit(str) { - return str.split(HALF_WIDTH_COMMA); - } - - function periodSplit(str) { - return str.split(HALF_WIDTH_PERIOD); - } - - function forEach(arr, fn) { - for (var i = 0, len = arr.length; i < len; i++) { - if (!(i in arr)) { - return iterateOverSparseArray(arr, fn, i); - } - fn(arr[i], i); - } - } - - function filter(arr, fn) { - var result = []; - for (var i = 0, len = arr.length; i < len; i++) { - var el = arr[i]; - if (i in arr && fn(el, i)) { - result.push(el); - } - } - return result; - } - - function map(arr, fn) { - // perf: Not using fixed array len here as it may be sparse. - var result = []; - for (var i = 0, len = arr.length; i < len; i++) { - if (i in arr) { - result.push(fn(arr[i], i)); - } - } - return result; - } - - function indexOf(arr, el) { - for (var i = 0, len = arr.length; i < len; i++) { - if (i in arr && arr[i] === el) return i; - } - return -1; - } - - // Number helpers - - // istanbul ignore next - var trunc = Math.trunc || function(n) { - if (n === 0 || !isFinite(n)) return n; - return n < 0 ? ceil(n) : floor(n); - }; - - function isRealNaN(obj) { - // This is only true of NaN - return obj != null && obj !== obj; - } - - function withPrecision(val, precision, fn) { - var multiplier = pow(10, abs(precision || 0)); - fn = fn || round; - if (precision < 0) multiplier = 1 / multiplier; - return fn(val * multiplier) / multiplier; - } - - function padNumber(num, place, sign, base, replacement) { - var str = abs(num).toString(base || 10); - str = repeatString(replacement || '0', place - str.replace(/\.\d+/, '').length) + str; - if (sign || num < 0) { - str = (num < 0 ? '-' : '+') + str; - } - return str; - } - - function getOrdinalSuffix(num) { - if (num >= 11 && num <= 13) { - return 'th'; - } else { - switch(num % 10) { - case 1: return 'st'; - case 2: return 'nd'; - case 3: return 'rd'; - default: return 'th'; - } - } - } - - // Fullwidth number helpers - var fullWidthNumberReg, fullWidthNumberMap, fullWidthNumbers; - - function buildFullWidthNumber() { - var fwp = FULL_WIDTH_PERIOD, hwp = HALF_WIDTH_PERIOD, hwc = HALF_WIDTH_COMMA, fwn = ''; - fullWidthNumberMap = {}; - for (var i = 0, digit; i <= 9; i++) { - digit = chr(i + FULL_WIDTH_ZERO); - fwn += digit; - fullWidthNumberMap[digit] = chr(i + HALF_WIDTH_ZERO); - } - fullWidthNumberMap[hwc] = ''; - fullWidthNumberMap[fwp] = hwp; - // Mapping this to itself to capture it easily - // in stringToNumber to detect decimals later. - fullWidthNumberMap[hwp] = hwp; - fullWidthNumberReg = allCharsReg(fwn + fwp + hwc + hwp); - fullWidthNumbers = fwn; - } - - // Takes into account full-width characters, commas, and decimals. - function stringToNumber(str, base) { - var sanitized, isDecimal; - sanitized = str.replace(fullWidthNumberReg, function(chr) { - var replacement = getOwn(fullWidthNumberMap, chr); - if (replacement === HALF_WIDTH_PERIOD) { - isDecimal = true; - } - return replacement; - }); - return isDecimal ? parseFloat(sanitized) : parseInt(sanitized, base || 10); - } - - // Math aliases - var abs = Math.abs, - pow = Math.pow, - min = Math.min, - max = Math.max, - ceil = Math.ceil, - floor = Math.floor, - round = Math.round; - - - // String helpers - - var chr = String.fromCharCode; - - function trim(str) { - return str.trim(); - } - - function repeatString(str, num) { - var result = ''; - str = str.toString(); - while (num > 0) { - if (num & 1) { - result += str; - } - if (num >>= 1) { - str += str; - } - } - return result; - } - - function simpleCapitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - function createFormatMatcher(bracketMatcher, percentMatcher, precheck) { - - var reg = STRING_FORMAT_REG; - var compileMemoized = memoizeFunction(compile); - - function getToken(format, match) { - var get, token, literal, fn; - var bKey = match[2]; - var pLit = match[3]; - var pKey = match[5]; - if (match[4] && percentMatcher) { - token = pKey; - get = percentMatcher; - } else if (bKey) { - token = bKey; - get = bracketMatcher; - } else if (pLit && percentMatcher) { - literal = pLit; - } else { - literal = match[1] || match[0]; - } - if (get) { - assertPassesPrecheck(precheck, bKey, pKey); - fn = function(obj, opt) { - return get(obj, token, opt); - }; - } - format.push(fn || getLiteral(literal)); - } - - function getSubstring(format, str, start, end) { - if (end > start) { - var sub = str.slice(start, end); - assertNoUnmatched(sub, OPEN_BRACE); - assertNoUnmatched(sub, CLOSE_BRACE); - format.push(function() { - return sub; - }); - } - } - - function getLiteral(str) { - return function() { - return str; - }; - } - - function assertPassesPrecheck(precheck, bt, pt) { - if (precheck && !precheck(bt, pt)) { - throw new TypeError('Invalid token '+ (bt || pt) +' in format string'); - } - } - - function assertNoUnmatched(str, chr) { - if (str.indexOf(chr) !== -1) { - throw new TypeError('Unmatched '+ chr +' in format string'); - } - } - - function compile(str) { - var format = [], lastIndex = 0, match; - reg.lastIndex = 0; - while(match = reg.exec(str)) { - getSubstring(format, str, lastIndex, match.index); - getToken(format, match); - lastIndex = reg.lastIndex; - } - getSubstring(format, str, lastIndex, str.length); - return format; - } - - return function(str, obj, opt) { - var format = compileMemoized(str), result = ''; - for (var i = 0; i < format.length; i++) { - result += format[i](obj, opt); - } - return result; - }; - } - - // Inflection helper - - var Inflections = {}; - - function getAcronym(str) { - // istanbul ignore next - return Inflections.acronyms && Inflections.acronyms.find(str); - } - - function getHumanWord(str) { - // istanbul ignore next - return Inflections.human && Inflections.human.find(str); - } - - function runHumanRules(str) { - // istanbul ignore next - return Inflections.human && Inflections.human.runRules(str) || str; - } - - // RegExp helpers - - function allCharsReg(src) { - return RegExp('[' + src + ']', 'g'); - } - - function getRegExpFlags(reg, add) { - var flags = ''; - add = add || ''; - function checkFlag(prop, flag) { - if (prop || add.indexOf(flag) > -1) { - flags += flag; - } - } - checkFlag(reg.global, 'g'); - checkFlag(reg.ignoreCase, 'i'); - checkFlag(reg.multiline, 'm'); - checkFlag(reg.sticky, 'y'); - return flags; - } - - function escapeRegExp(str) { - if (!isString(str)) str = String(str); - return str.replace(/([\\/'*+?|()[\]{}.^$-])/g,'\\$1'); - } - - // Date helpers - - var _utc = privatePropertyAccessor('utc'); - - function callDateGet(d, method) { - return d['get' + (_utc(d) ? 'UTC' : '') + method](); - } - - function callDateSet(d, method, value, safe) { - // "Safe" denotes not setting the date if the value is the same as what is - // currently set. In theory this should be a noop, however it will cause - // timezone shifts when in the middle of a DST fallback. This is unavoidable - // as the notation itself is ambiguous (i.e. there are two "1:00ams" on - // November 1st, 2015 in northern hemisphere timezones that follow DST), - // however when advancing or rewinding dates this can throw off calculations - // so avoiding this unintentional shifting on an opt-in basis. - if (safe && value === callDateGet(d, method, value)) { - return; - } - d['set' + (_utc(d) ? 'UTC' : '') + method](value); - } - - // Memoization helpers - - var INTERNAL_MEMOIZE_LIMIT = 1000; - - // Note that attemps to consolidate this with Function#memoize - // ended up clunky as that is also serializing arguments. Separating - // these implementations turned out to be simpler. - function memoizeFunction(fn) { - var memo = {}, counter = 0; - - return function(key) { - if (hasOwn(memo, key)) { - return memo[key]; - } - // istanbul ignore if - if (counter === INTERNAL_MEMOIZE_LIMIT) { - memo = {}; - counter = 0; - } - counter++; - return memo[key] = fn(key); - }; - } - - // ES6 helpers - - function setToArray(set) { - var arr = new Array(set.size), i = 0; - set.forEach(function(val) { - arr[i++] = val; - }); - return arr; - } - - function mapToArray(map) { - var arr = new Array(map.size), i = 0; - map.forEach(function(val, key) { - arr[i++] = [key, val]; - }); - return arr; - } - - buildClassChecks(); - buildFullWidthNumber(); - - /*** - * @module ES5 - * @description Functions and polyfill methods that fix ES5 functionality. This - * module is excluded from default builds, and can be included if - * you need legacy browser support (IE8 and below). - * - ***/ - - // Non-enumerable properties on Object.prototype. In early JScript implementations - // (< IE9) these will shadow object properties and break for..in loops. - var DONT_ENUM_PROPS = [ - 'valueOf', - 'toString', - 'constructor', - 'isPrototypeOf', - 'hasOwnProperty', - 'toLocaleString', - 'propertyIsEnumerable' - ]; - - /*** - * @fix - * @short Fixes DontEnum bug for iteration methods in < IE9. - ***/ - function buildDontEnumFix() { - if (!({toString:1}).propertyIsEnumerable('toString')) { - var forEachEnumerableProperty = forEachProperty; - forEachProperty = function(obj, fn) { - forEachEnumerableProperty(obj, fn); - for (var i = 0, key; key = DONT_ENUM_PROPS[i]; i++) { - if (hasOwn(obj, key)) { - if(fn.call(obj, obj[key], key, obj) === false) break; - } - } - }; - } - } - - /*** - * @fix - * @short Adds native methods to chainables in < IE9. - ***/ - function buildChainableNativeMethodsFix() { - if (!Object.getOwnPropertyNames) { - defineNativeMethodsOnChainable(); - } - } - - // Polyfilled methods will automatically be added to the chainable prototype. - // However, Object.getOwnPropertyNames cannot be shimmed for non-enumerable - // properties, so if it does not exist, then the only way to access native - // methods previous to ES5 is to provide them as a list of tokens here. - function defineNativeMethodsOnChainable() { - - var nativeTokens = { - 'Function': 'apply,call', - 'RegExp': 'compile,exec,test', - 'Number': 'toExponential,toFixed,toLocaleString,toPrecision', - 'Object': 'hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString', - 'Array': 'concat,join,pop,push,reverse,shift,slice,sort,splice,toLocaleString,unshift', - 'Date': 'getTime,getTimezoneOffset,setTime,toDateString,toGMTString,toLocaleDateString,toLocaleString,toLocaleTimeString,toTimeString,toUTCString', - 'String': 'anchor,big,blink,bold,charAt,charCodeAt,concat,fixed,fontcolor,fontsize,indexOf,italics,lastIndexOf,link,localeCompare,match,replace,search,slice,small,split,strike,sub,substr,substring,sup,toLocaleLowerCase,toLocaleUpperCase,toLowerCase,toUpperCase' - }; - - var dateTokens = 'FullYear,Month,Date,Hours,Minutes,Seconds,Milliseconds'.split(','); - - function addDateTokens(prefix, arr) { - for (var i = 0; i < dateTokens.length; i++) { - arr.push(prefix + dateTokens[i]); - } - } - - forEachProperty(nativeTokens, function(str, name) { - var tokens = str.split(','); - if (name === 'Date') { - addDateTokens('get', tokens); - addDateTokens('set', tokens); - addDateTokens('getUTC', tokens); - addDateTokens('setUTC', tokens); - } - tokens.push('toString'); - mapNativeToChainable(name, tokens); - }); - - } - - - buildDontEnumFix(); - buildChainableNativeMethodsFix(); - - - /*** @namespace Object ***/ - - function assertNonNull(obj) { - if (obj == null) { - throw new TypeError('Object required'); - } - } - - defineStaticPolyfill(sugarObject, { - - 'keys': function(obj) { - var keys = []; - assertNonNull(obj); - forEachProperty(coercePrimitiveToObject(obj), function(val, key) { - keys.push(key); - }); - return keys; - } - - }); - - - /*** @namespace Array ***/ - - function arrayIndexOf(arr, search, fromIndex, fromRight) { - var length = arr.length, defaultFromIndex, index, increment; - - increment = fromRight ? -1 : 1; - defaultFromIndex = fromRight ? length - 1 : 0; - fromIndex = trunc(fromIndex); - if (!fromIndex && fromIndex !== 0) { - fromIndex = defaultFromIndex; - } - if (fromIndex < 0) { - fromIndex = length + fromIndex; - } - if ((!fromRight && fromIndex < 0) || (fromRight && fromIndex >= length)) { - fromIndex = defaultFromIndex; - } - - index = fromIndex; - - while((fromRight && index >= 0) || (!fromRight && index < length)) { - if (!(index in arr)) { - return sparseIndexOf(arr, search, fromIndex, fromRight); - } - if (isArrayIndex(index) && arr[index] === search) { - return index; - } - index += increment; - } - return -1; - } - - function sparseIndexOf(arr, search, fromIndex, fromRight) { - var indexes = getSparseArrayIndexes(arr, fromIndex, false, fromRight), index; - indexes.sort(function(a, b) { - return fromRight ? b - a : a - b; - }); - while ((index = indexes.shift()) !== undefined) { - if (arr[index] === search) { - return +index; - } - } - return -1; - } - - function arrayReduce(arr, fn, initialValue, fromRight) { - var length = arr.length, count = 0, defined = isDefined(initialValue), result, index; - assertCallable(fn); - if (length == 0 && !defined) { - throw new TypeError('Reduce called on empty array with no initial value'); - } else if (defined) { - result = initialValue; - } else { - result = arr[fromRight ? length - 1 : count]; - count++; - } - while(count < length) { - index = fromRight ? length - count - 1 : count; - if (index in arr) { - result = fn(result, arr[index], index, arr); - } - count++; - } - return result; - } - - defineStaticPolyfill(sugarArray, { - - /*** - * - * @method isArray(obj) - * @returns Boolean - * @polyfill ES5 - * @static - * @short Returns true if `obj` is an Array. - * - * @example - * - * Array.isArray(3) -> false - * Array.isArray(true) -> false - * Array.isArray('wasabi') -> false - * Array.isArray([1,2,3]) -> true - * - ***/ - 'isArray': function(obj) { - return isArray(obj); - } - - }); - - defineInstancePolyfill(sugarArray, { - - 'every': function(fn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - var length = this.length, index = 0; - assertCallable(fn); - while(index < length) { - if (index in this && !fn.call(context, this[index], index, this)) { - return false; - } - index++; - } - return true; - }, - - 'some': function(fn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - var length = this.length, index = 0; - assertCallable(fn); - while(index < length) { - if (index in this && fn.call(context, this[index], index, this)) { - return true; - } - index++; - } - return false; - }, - - 'map': function(fn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - var length = this.length, index = 0, result = new Array(length); - assertCallable(fn); - while(index < length) { - if (index in this) { - result[index] = fn.call(context, this[index], index, this); - } - index++; - } - return result; - }, - - 'filter': function(fn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - var length = this.length, index = 0, result = []; - assertCallable(fn); - while(index < length) { - if (index in this && fn.call(context, this[index], index, this)) { - result.push(this[index]); - } - index++; - } - return result; - }, - - /*** - * @method indexOf(search, [fromIndex] = 0) - * @returns Number - * @polyfill ES5 - * @short Searches the array and returns the first index where `search` occurs, - * or `-1` if the element is not found. - * @extra [fromIndex] is the index from which to begin the search. This - * method performs a simple strict equality comparison on `search`. - * Sugar does not enhance this method to support `enhanced matching`. - * For such functionality, use the `findIndex` method instead. - * - * @example - * - * [1,2,3].indexOf(3) -> 1 - * [1,2,3].indexOf(7) -> -1 - * - ***/ - 'indexOf': function(search) { - // Force compiler to respect argument length. - var argLen = arguments.length, fromIndex = arguments[1]; - if (isString(this)) return this.indexOf(search, fromIndex); - return arrayIndexOf(this, search, fromIndex); - }, - - /*** - * @method lastIndexOf(search, [fromIndex] = array.length - 1) - * @returns Number - * @polyfill ES5 - * @short Searches the array from the end and returns the first index where - * `search` occurs, or `-1` if the element is not found. - * @extra [fromIndex] is the index from which to begin the search. This method - * performs a simple strict equality comparison on `search`. - * Sugar does not enhance this method to support `enhanced matching`. - * - * @example - * - * [1,2,1].lastIndexOf(1) -> 2 - * [1,2,1].lastIndexOf(7) -> -1 - * - ***/ - 'lastIndexOf': function(search) { - // Force compiler to respect argument length. - var argLen = arguments.length, fromIndex = arguments[1]; - if (isString(this)) return this.lastIndexOf(search, fromIndex); - return arrayIndexOf(this, search, fromIndex, true); - }, - - /*** - * @method forEach([eachFn], [context]) - * @polyfill ES5 - * @short Iterates over the array, calling [eachFn] on each loop. - * @extra [context] becomes the `this` object. - * - * @callback eachFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','b','c'].forEach(function(a) { - * // Called 3 times: 'a','b','c' - * }); - * - ***/ - 'forEach': function(eachFn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - var length = this.length, index = 0; - assertCallable(eachFn); - while(index < length) { - if (index in this) { - eachFn.call(context, this[index], index, this); - } - index++; - } - }, - - /*** - * @method reduce(reduceFn, [init]) - * @returns Mixed - * @polyfill ES5 - * @short Reduces the array to a single result. - * @extra This operation is sometimes called "accumulation", as it takes the - * result of the last iteration of `reduceFn` and passes it as the first - * argument to the next iteration, "accumulating" that value as it goes. - * The return value of this method will be the return value of the final - * iteration of `reduceFn`. If [init] is passed, it will be the initial - * "accumulator" (the first argument). If [init] is not passed, then it - * will take the first element in the array, and `reduceFn` will not be - * called for that element. - * - * @callback reduceFn - * - * acc The "accumulator". Either [init], the result of the last iteration - * of `reduceFn`, or the first element of the array. - * el The current element for this iteration. - * idx The current index for this iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].reduce(function(a, b) { - * return a - b; // 1 - 2 - 3 - * }); - * - * [1,2,3].reduce(function(a, b) { - * return a - b; // 100 - 1 - 2 - 3 - * }, 100); - * - ***/ - 'reduce': function(reduceFn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - return arrayReduce(this, reduceFn, context); - }, - - /*** - * @method reduceRight([reduceFn], [init]) - * @returns Mixed - * @polyfill ES5 - * @short Similar to `Array#reduce`, but operates on the elements in reverse. - * - * @callback reduceFn - * - * acc The "accumulator", either [init], the result of the last iteration - * of `reduceFn`, or the last element of the array. - * el The current element for this iteration. - * idx The current index for this iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].reduceRight(function(a, b) { - * return a - b; // 3 - 2 - 1 - * }); - * - * [1,2,3].reduceRight(function(a, b) { - * return a - b; // 100 - 3 - 2 - 1 - * }, 100); - * - * - ***/ - 'reduceRight': function(reduceFn) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - return arrayReduce(this, reduceFn, context, true); - } - - }); - - - /*** @namespace String ***/ - - var TRIM_REG = RegExp('^[' + TRIM_CHARS + ']+|['+ TRIM_CHARS +']+$', 'g'); - - defineInstancePolyfill(sugarString, { - /*** - * @method trim() - * @returns String - * @polyfill ES5 - * @short Removes leading and trailing whitespace from the string. - * @extra Whitespace is defined as line breaks, tabs, and any character in the - * "Space, Separator" Unicode category, conforming to the the ES5 spec. - * - * @example - * - * ' wasabi '.trim() -> 'wasabi' - * ' wasabi '.trimLeft() -> 'wasabi ' - * ' wasabi '.trimRight() -> ' wasabi' - * - ***/ - 'trim': function() { - return this.toString().replace(TRIM_REG, ''); - } - }); - - - /*** @namespace Function ***/ - - defineInstancePolyfill(sugarFunction, { - - /*** - * @method bind(context, [arg1], ...) - * @returns Function - * @polyfill ES5 - * @short Binds `context` as the `this` object for the function when it is - * called. Also allows currying an unlimited number of parameters. - * @extra "currying" means setting parameters ([arg1], [arg2], etc.) ahead of - * time so that they are passed when the function is called later. If - * you pass additional parameters when the function is actually called, - * they will be added to the end of the curried parameters. - * - * @example - * - * logThis.bind('woof')() -> logs 'woof' as its this object - * addArgs.bind(1, 2, 3)() -> returns 5 with 1 as the this object - * addArgs.bind(1)(2, 3, 4) -> returns 9 - * - ***/ - 'bind': function(context) { - // Optimized: no leaking arguments - var boundArgs = []; for(var $i = 1, $len = arguments.length; $i < $len; $i++) boundArgs.push(arguments[$i]); - var fn = this, bound; - assertCallable(this); - bound = function() { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - return fn.apply(fn.prototype && this instanceof fn ? this : context, boundArgs.concat(args)); - }; - bound.prototype = this.prototype; - return bound; - } - - }); - - - /*** @namespace Date ***/ - - defineStaticPolyfill(sugarDate, { - - /*** - * @method now() - * @returns String - * @polyfill ES5 - * @static - * @short Returns the current time as a Unix timestamp. - * @extra The number of milliseconds since January 1st, 1970 00:00:00 (UTC). - * - * @example - * - * Date.now() -> ex. 1311938296231 - * - ***/ - 'now': function() { - return new Date().getTime(); - } - - }); - - function hasISOSupport() { - var d = new Date(Date.UTC(2000, 0)); - return !!d.toISOString && d.toISOString() === '2000-01-01T00:00:00.000Z'; - } - - defineInstancePolyfill(sugarDate, { - - /*** - * @method toISOString() - * @returns String - * @polyfill ES5 - * @short Formats the string to ISO8601 format. - * @extra This will always format as UTC time. - * - * @example - * - * Date.create().toISOString() -> ex. 2011-07-05 12:24:55.528Z - * - ***/ - 'toISOString': function() { - return padNumber(this.getUTCFullYear(), 4) + '-' + - padNumber(this.getUTCMonth() + 1, 2) + '-' + - padNumber(this.getUTCDate(), 2) + 'T' + - padNumber(this.getUTCHours(), 2) + ':' + - padNumber(this.getUTCMinutes(), 2) + ':' + - padNumber(this.getUTCSeconds(), 2) + '.' + - padNumber(this.getUTCMilliseconds(), 3) + 'Z'; - }, - - /*** - * @method toJSON([key]) - * @returns String - * @polyfill ES5 - * @short Returns a JSON representation of the date. - * @extra This is effectively an alias for `toISOString`. Will always return - * the date in UTC time. [key] is ignored. - * - * @example - * - * Date.create().toJSON() -> ex. 2011-07-05 12:24:55.528Z - * - ***/ - 'toJSON': function(key) { - // Force compiler to respect argument length. - var argLen = arguments.length; - return this.toISOString(key); - } - - }, !hasISOSupport()); - - /*** - * @module ES6 - * @description Polyfills that provide basic ES6 compatibility. This module - * provides the base for Sugar functionality, but is not a full - * polyfill suite. - * - ***/ - - - /*** @namespace String ***/ - - function getCoercedStringSubject(obj) { - if (obj == null) { - throw new TypeError('String required.'); - } - return String(obj); - } - - function getCoercedSearchString(obj) { - if (isRegExp(obj)) { - throw new TypeError(); - } - return String(obj); - } - - defineInstancePolyfill(sugarString, { - - /*** - * @method includes(search, [pos] = 0) - * @returns Boolean - * @polyfill ES6 - * @short Returns true if `search` is contained within the string. - * @extra Search begins at [pos], which defaults to the beginning of the - * string. Sugar enhances this method to allow matching a regex. - * - * @example - * - * 'jumpy'.includes('py') -> true - * 'broken'.includes('ken', 3) -> true - * 'broken'.includes('bro', 3) -> false - * - ***/ - 'includes': function(searchString) { - // Force compiler to respect argument length. - var argLen = arguments.length, pos = arguments[1]; - var str = getCoercedStringSubject(this); - searchString = getCoercedSearchString(searchString); - return str.indexOf(searchString, pos) !== -1; - }, - - /*** - * @method startsWith(search, [pos] = 0) - * @returns Boolean - * @polyfill ES6 - * @short Returns true if the string starts with substring `search`. - * @extra Search begins at [pos], which defaults to the entire string length. - * - * @example - * - * 'hello'.startsWith('hell') -> true - * 'hello'.startsWith('HELL') -> false - * 'hello'.startsWith('ell', 1) -> true - * - ***/ - 'startsWith': function(searchString) { - // Force compiler to respect argument length. - var argLen = arguments.length, position = arguments[1]; - var str, start, pos, len, searchLength; - str = getCoercedStringSubject(this); - searchString = getCoercedSearchString(searchString); - pos = +position || 0; - len = str.length; - start = min(max(pos, 0), len); - searchLength = searchString.length; - if (searchLength + start > len) { - return false; - } - if (str.substr(start, searchLength) === searchString) { - return true; - } - return false; - }, - - /*** - * @method endsWith(search, [pos] = length) - * @returns Boolean - * @polyfill ES6 - * @short Returns true if the string ends with substring `search`. - * @extra Search ends at [pos], which defaults to the entire string length. - * - * @example - * - * 'jumpy'.endsWith('py') -> true - * 'jumpy'.endsWith('MPY') -> false - * 'jumpy'.endsWith('mp', 4) -> false - * - ***/ - 'endsWith': function(searchString) { - // Force compiler to respect argument length. - var argLen = arguments.length, endPosition = arguments[1]; - var str, start, end, pos, len, searchLength; - str = getCoercedStringSubject(this); - searchString = getCoercedSearchString(searchString); - len = str.length; - pos = len; - if (isDefined(endPosition)) { - pos = +endPosition || 0; - } - end = min(max(pos, 0), len); - searchLength = searchString.length; - start = end - searchLength; - if (start < 0) { - return false; - } - if (str.substr(start, searchLength) === searchString) { - return true; - } - return false; - }, - - /*** - * @method repeat([num] = 0) - * @returns String - * @polyfill ES6 - * @short Returns the string repeated [num] times. - * - * @example - * - * 'jumpy'.repeat(2) -> 'jumpyjumpy' - * 'a'.repeat(5) -> 'aaaaa' - * 'a'.repeat(0) -> '' - * - ***/ - 'repeat': function(num) { - num = coercePositiveInteger(num); - return repeatString(this, num); - } - - }); - - - /*** @namespace Number ***/ - - // istanbul ignore next - defineStaticPolyfill(sugarNumber, { - - /*** - * @method isNaN(value) - * @returns Boolean - * @polyfill ES6 - * @static - * @short Returns true only if the number is `NaN`. - * @extra This is differs from the global `isNaN`, which returns true for - * anything that is not a number. - * - * @example - * - * Number.isNaN(NaN) -> true - * Number.isNaN('n') -> false - * - ***/ - 'isNaN': function(obj) { - return isRealNaN(obj); - } - - }); - - - /*** @namespace Array ***/ - - function getCoercedObject(obj) { - if (obj == null) { - throw new TypeError('Object required.'); - } - return coercePrimitiveToObject(obj); - } - - defineStaticPolyfill(sugarArray, { - - /*** - * @method from(a, [mapFn], [context]) - * @returns Mixed - * @polyfill ES6 - * @static - * @short Creates an array from an array-like object. - * @extra If [mapFn] is passed, it will be map each element of the array. - * [context] is the `this` object if passed. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * Array.from({0:'a',1:'b',length:2}); -> ['a','b'] - * - ***/ - 'from': function(a) { - // Force compiler to respect argument length. - var argLen = arguments.length, mapFn = arguments[1], context = arguments[2]; - var len, arr; - if (isDefined(mapFn)) { - assertCallable(mapFn); - } - a = getCoercedObject(a); - len = trunc(max(0, a.length || 0)); - if (!isArrayIndex(len)) { - throw new RangeError('Invalid array length'); - } - if (isFunction(this)) { - arr = new this(len); - arr.length = len; - } else { - arr = new Array(len); - } - for (var i = 0; i < len; i++) { - setProperty(arr, i, isDefined(mapFn) ? mapFn.call(context, a[i], i) : a[i], true); - } - return arr; - } - - }); - - defineInstancePolyfill(sugarArray, { - - 'find': function(f) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - assertCallable(f); - for (var i = 0, len = this.length; i < len; i++) { - if (f.call(context, this[i], i, this)) { - return this[i]; - } - } - }, - - 'findIndex': function(f) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - assertCallable(f); - for (var i = 0, len = this.length; i < len; i++) { - if (f.call(context, this[i], i, this)) { - return i; - } - } - return -1; - } - - }); - - /*** - * @module ES7 - * @description Polyfills that provide basic ES7 compatibility. This module - * provides the base for Sugar functionality, but is not a full - * polyfill suite. - * - ***/ - - - /*** @namespace Array ***/ - - function sameValueZero(a, b) { - if (isRealNaN(a)) { - return isRealNaN(b); - } - return a === b ? a !== 0 || 1 / a === 1 / b : false; - } - - defineInstancePolyfill(sugarArray, { - - /*** - * @method includes(search, [fromIndex] = 0) - * @returns Boolean - * @polyfill ES7 - * @short Returns true if `search` is contained within the array. - * @extra Search begins at [fromIndex], which defaults to the beginning of the - * array. - * - * @example - * - * [1,2,3].includes(2) -> true - * [1,2,3].includes(4) -> false - * [1,2,3].includes(2, 3) -> false - * - ***/ - 'includes': function(search) { - // Force compiler to respect argument length. - var argLen = arguments.length, fromIndex = arguments[1]; - var arr = this, len; - if (isString(arr)) { - return arr.includes(search, fromIndex); - } - fromIndex = fromIndex ? fromIndex.valueOf() : 0; - len = arr.length; - if (fromIndex < 0) { - fromIndex = max(0, fromIndex + len); - } - for (var i = fromIndex; i < len; i++) { - if (sameValueZero(search, arr[i])) { - return true; - } - } - return false; - } - - }); - - /*** - * @module Date - * @description Date parsing and formatting, relative formats, number shortcuts, - * and locale support with default English locales. - * - ***/ - - var DATE_OPTIONS = { - 'newDateInternal': defaultNewDate - }; - - var LOCALE_ARRAY_FIELDS = [ - 'months', 'weekdays', 'units', 'numerals', 'placeholders', - 'articles', 'tokens', 'timeMarkers', 'ampm', 'timeSuffixes', - 'parse', 'timeParse', 'timeFrontParse', 'modifiers' - ]; - - // Regex for stripping Timezone Abbreviations - var TIMEZONE_ABBREVIATION_REG = /\(([-+]\d{2,4}|\w{3,5})\)$/; - - // Regex for years with 2 digits or less - var ABBREVIATED_YEAR_REG = /^'?(\d{1,2})$/; - - // One minute in milliseconds - var MINUTES = 60 * 1000; - - // Date unit indexes - var HOURS_INDEX = 3, - DAY_INDEX = 4, - WEEK_INDEX = 5, - MONTH_INDEX = 6, - YEAR_INDEX = 7; - - // ISO Defaults - var ISO_FIRST_DAY_OF_WEEK = 1, - ISO_FIRST_DAY_OF_WEEK_YEAR = 4; - - var CoreParsingTokens = { - 'yyyy': { - param: 'year', - src: '[-−+]?\\d{4,6}' - }, - 'yy': { - param: 'year', - src: '\\d{2}' - }, - 'y': { - param: 'year', - src: '\\d' - }, - 'ayy': { - param: 'year', - src: '\'\\d{2}' - }, - 'MM': { - param: 'month', - src: '(?:1[012]|0?[1-9])' - }, - 'dd': { - param: 'date', - src: '(?:3[01]|[12][0-9]|0?[1-9])' - }, - 'hh': { - param: 'hour', - src: '(?:2[0-4]|[01]?[0-9])' - }, - 'mm': { - param: 'minute', - src: '[0-5]\\d' - }, - 'ss': { - param: 'second', - src: '[0-5]\\d(?:[,.]\\d+)?' - }, - 'tzHour': { - src: '[-−+](?:2[0-4]|[01]?[0-9])' - }, - 'tzMinute': { - src: '[0-5]\\d' - }, - 'iyyyy': { - param: 'year', - src: '(?:[-−+]?\\d{4}|[-−+]\\d{5,6})' - }, - 'ihh': { - param: 'hour', - src: '(?:2[0-4]|[01][0-9])(?:[,.]\\d+)?' - }, - 'imm': { - param: 'minute', - src: '[0-5]\\d(?:[,.]\\d+)?' - }, - 'GMT': { - param: 'utc', - src: 'GMT' - }, - 'Z': { - param: 'utc', - src: 'Z' - }, - 'timestamp': { - src: '\\d+' - } - }; - - var LocalizedParsingTokens = { - 'year': { - base: 'yyyy|ayy', - requiresSuffix: true - }, - 'month': { - base: 'MM', - requiresSuffix: true - }, - 'date': { - base: 'dd', - requiresSuffix: true - }, - 'hour': { - base: 'hh', - requiresSuffixOr: ':' - }, - 'minute': { - base: 'mm' - }, - 'second': { - base: 'ss' - }, - 'num': { - src: '\\d+', - requiresNumerals: true - } - }; - - var CoreParsingFormats = [ - { - // 12-1978 - // 08-1978 (MDY) - src: '{MM}[-.\\/]{yyyy}' - }, - { - // 12/08/1978 - // 08/12/1978 (MDY) - time: true, - src: '{dd}[-\\/]{MM}(?:[-\\/]{yyyy|yy|y})?', - mdy: '{MM}[-\\/]{dd}(?:[-\\/]{yyyy|yy|y})?' - }, - { - // 12.08.1978 - // 08.12.1978 (MDY) - time: true, - src: '{dd}\\.{MM}(?:\\.{yyyy|yy|y})?', - mdy: '{MM}\\.{dd}(?:\\.{yyyy|yy|y})?', - localeCheck: function(loc) { - // Do not allow this format if the locale - // uses a period as a time separator. - return loc.timeSeparator !== '.'; - } - }, - { - // 1975-08-25 - time: true, - src: '{yyyy}[-.\\/]{MM}(?:[-.\\/]{dd})?' - }, - { - // .NET JSON - src: '\\\\/Date\\({timestamp}(?:[-+]\\d{4,4})?\\)\\\\/' - }, - { - // ISO-8601 - src: '{iyyyy}(?:-?{MM}(?:-?{dd}(?:T{ihh}(?::?{imm}(?::?{ss})?)?)?)?)?{tzOffset?}' - } - ]; - - var CoreOutputFormats = { - 'ISO8601': '{yyyy}-{MM}-{dd}T{HH}:{mm}:{ss}.{SSS}{Z}', - 'RFC1123': '{Dow}, {dd} {Mon} {yyyy} {HH}:{mm}:{ss} {ZZ}', - 'RFC1036': '{Weekday}, {dd}-{Mon}-{yy} {HH}:{mm}:{ss} {ZZ}' - }; - - var FormatTokensBase = [ - { - ldml: 'Dow', - strf: 'a', - lowerToken: 'dow', - get: function(d, localeCode) { - return localeManager.get(localeCode).getWeekdayName(getWeekday(d), 2); - } - }, - { - ldml: 'Weekday', - strf: 'A', - lowerToken: 'weekday', - allowAlternates: true, - get: function(d, localeCode, alternate) { - return localeManager.get(localeCode).getWeekdayName(getWeekday(d), alternate); - } - }, - { - ldml: 'Mon', - strf: 'b h', - lowerToken: 'mon', - get: function(d, localeCode) { - return localeManager.get(localeCode).getMonthName(getMonth(d), 2); - } - }, - { - ldml: 'Month', - strf: 'B', - lowerToken: 'month', - allowAlternates: true, - get: function(d, localeCode, alternate) { - return localeManager.get(localeCode).getMonthName(getMonth(d), alternate); - } - }, - { - strf: 'C', - get: function(d) { - return getYear(d).toString().slice(0, 2); - } - }, - { - ldml: 'd date day', - strf: 'd', - strfPadding: 2, - ldmlPaddedToken: 'dd', - ordinalToken: 'do', - get: function(d) { - return getDate(d); - } - }, - { - strf: 'e', - get: function(d) { - return padNumber(getDate(d), 2, false, 10, ' '); - } - }, - { - ldml: 'H 24hr', - strf: 'H', - strfPadding: 2, - ldmlPaddedToken: 'HH', - get: function(d) { - return getHours(d); - } - }, - { - ldml: 'h hours 12hr', - strf: 'I', - strfPadding: 2, - ldmlPaddedToken: 'hh', - get: function(d) { - return getHours(d) % 12 || 12; - } - }, - { - ldml: 'D', - strf: 'j', - strfPadding: 3, - ldmlPaddedToken: 'DDD', - get: function(d) { - var s = setUnitAndLowerToEdge(cloneDate(d), MONTH_INDEX); - return getDaysSince(d, s) + 1; - } - }, - { - ldml: 'M', - strf: 'm', - strfPadding: 2, - ordinalToken: 'Mo', - ldmlPaddedToken: 'MM', - get: function(d) { - return getMonth(d) + 1; - } - }, - { - ldml: 'm minutes', - strf: 'M', - strfPadding: 2, - ldmlPaddedToken: 'mm', - get: function(d) { - return callDateGet(d, 'Minutes'); - } - }, - { - ldml: 'Q', - get: function(d) { - return ceil((getMonth(d) + 1) / 3); - } - }, - { - ldml: 'TT', - strf: 'p', - get: function(d, localeCode) { - return getMeridiemToken(d, localeCode); - } - }, - { - ldml: 'tt', - strf: 'P', - get: function(d, localeCode) { - return getMeridiemToken(d, localeCode).toLowerCase(); - } - }, - { - ldml: 'T', - lowerToken: 't', - get: function(d, localeCode) { - return getMeridiemToken(d, localeCode).charAt(0); - } - }, - { - ldml: 's seconds', - strf: 'S', - strfPadding: 2, - ldmlPaddedToken: 'ss', - get: function(d) { - return callDateGet(d, 'Seconds'); - } - }, - { - ldml: 'S ms', - strfPadding: 3, - ldmlPaddedToken: 'SSS', - get: function(d) { - return callDateGet(d, 'Milliseconds'); - } - }, - { - ldml: 'e', - strf: 'u', - ordinalToken: 'eo', - get: function(d) { - return getWeekday(d) || 7; - } - }, - { - strf: 'U', - strfPadding: 2, - get: function(d) { - // Sunday first, 0-53 - return getWeekNumber(d, false, 0); - } - }, - { - ldml: 'W', - strf: 'V', - strfPadding: 2, - ordinalToken: 'Wo', - ldmlPaddedToken: 'WW', - get: function(d) { - // Monday first, 1-53 (ISO8601) - return getWeekNumber(d, true); - } - }, - { - strf: 'w', - get: function(d) { - return getWeekday(d); - } - }, - { - ldml: 'w', - ordinalToken: 'wo', - ldmlPaddedToken: 'ww', - get: function(d, localeCode) { - // Locale dependent, 1-53 - var loc = localeManager.get(localeCode), - dow = loc.getFirstDayOfWeek(localeCode), - doy = loc.getFirstDayOfWeekYear(localeCode); - return getWeekNumber(d, true, dow, doy); - } - }, - { - strf: 'W', - strfPadding: 2, - get: function(d) { - // Monday first, 0-53 - return getWeekNumber(d, false); - } - }, - { - ldmlPaddedToken: 'gggg', - ldmlTwoDigitToken: 'gg', - get: function(d, localeCode) { - return getWeekYear(d, localeCode); - } - }, - { - strf: 'G', - strfPadding: 4, - strfTwoDigitToken: 'g', - ldmlPaddedToken: 'GGGG', - ldmlTwoDigitToken: 'GG', - get: function(d, localeCode) { - return getWeekYear(d, localeCode, true); - } - }, - { - ldml: 'year', - ldmlPaddedToken: 'yyyy', - ldmlTwoDigitToken: 'yy', - strf: 'Y', - strfPadding: 4, - strfTwoDigitToken: 'y', - get: function(d) { - return getYear(d); - } - }, - { - ldml: 'ZZ', - strf: 'z', - get: function(d) { - return getUTCOffset(d); - } - }, - { - ldml: 'X', - get: function(d) { - return trunc(d.getTime() / 1000); - } - }, - { - ldml: 'x', - get: function(d) { - return d.getTime(); - } - }, - { - ldml: 'Z', - get: function(d) { - return getUTCOffset(d, true); - } - }, - { - ldml: 'z', - strf: 'Z', - get: function(d) { - // Note that this is not accurate in all browsing environments! - // https://github.com/moment/moment/issues/162 - // It will continue to be supported for Node and usage with the - // understanding that it may be blank. - var match = d.toString().match(TIMEZONE_ABBREVIATION_REG); - // istanbul ignore next - return match ? match[1] : ''; - } - }, - { - strf: 'D', - alias: '%m/%d/%y' - }, - { - strf: 'F', - alias: '%Y-%m-%d' - }, - { - strf: 'r', - alias: '%I:%M:%S %p' - }, - { - strf: 'R', - alias: '%H:%M' - }, - { - strf: 'T', - alias: '%H:%M:%S' - }, - { - strf: 'x', - alias: '{short}' - }, - { - strf: 'X', - alias: '{time}' - }, - { - strf: 'c', - alias: '{stamp}' - } - ]; - - var DateUnits = [ - { - name: 'millisecond', - method: 'Milliseconds', - multiplier: 1, - start: 0, - end: 999 - }, - { - name: 'second', - method: 'Seconds', - multiplier: 1000, - start: 0, - end: 59 - }, - { - name: 'minute', - method: 'Minutes', - multiplier: 60 * 1000, - start: 0, - end: 59 - }, - { - name: 'hour', - method: 'Hours', - multiplier: 60 * 60 * 1000, - start: 0, - end: 23 - }, - { - name: 'day', - alias: 'date', - method: 'Date', - ambiguous: true, - multiplier: 24 * 60 * 60 * 1000, - start: 1, - end: function(d) { - return getDaysInMonth(d); - } - }, - { - name: 'week', - method: 'ISOWeek', - ambiguous: true, - multiplier: 7 * 24 * 60 * 60 * 1000 - }, - { - name: 'month', - method: 'Month', - ambiguous: true, - multiplier: 30.4375 * 24 * 60 * 60 * 1000, - start: 0, - end: 11 - }, - { - name: 'year', - method: 'FullYear', - ambiguous: true, - multiplier: 365.25 * 24 * 60 * 60 * 1000, - start: 0 - } - ]; - - /*** - * @method getOption(name) - * @returns Mixed - * @accessor - * @short Gets an option used internally by Date. - * @example - * - * Sugar.Date.getOption('newDateInternal'); - * - * @param {string} name - * - *** - * @method setOption(name, value) - * @accessor - * @short Sets an option used internally by Date. - * @extra If `value` is `null`, the default value will be restored. - * @options - * - * newDateInternal Sugar's internal date constructor. Date methods often - * construct a `new Date()` internally as a reference point - * (`isToday`, relative formats like `tomorrow`, etc). This - * can be overridden if you need it to be something else. - * Most commonly, this allows you to return a shifted date - * to simulate a specific timezone, as dates in Javascript - * are always local. - * - * @example - * - * Sugar.Date.setOption('newDateInternal', function() { - * var d = new Date(), offset; - * offset = (d.getTimezoneOffset() - 600) * 60 * 1000; // Hawaii time! - * d.setTime(d.getTime() + offset); - * return d; - * }); - * - * @signature setOption(options) - * @param {DateOptions} options - * @param {string} name - * @param {any} value - * @option {Function} newDateInternal - * - ***/ - var _dateOptions = defineOptionsAccessor(sugarDate, DATE_OPTIONS); - - function setDateChainableConstructor() { - setChainableConstructor(sugarDate, createDate); - } - - // General helpers - - function getNewDate() { - return _dateOptions('newDateInternal')(); - } - - function defaultNewDate() { - return new Date; - } - - function cloneDate(d) { - // Rhino environments have a bug where new Date(d) truncates - // milliseconds so need to call getTime() here. - var clone = new Date(d.getTime()); - _utc(clone, !!_utc(d)); - return clone; - } - - function dateIsValid(d) { - return !isNaN(d.getTime()); - } - - function assertDateIsValid(d) { - if (!dateIsValid(d)) { - throw new TypeError('Date is not valid'); - } - } - - function getHours(d) { - return callDateGet(d, 'Hours'); - } - - function getWeekday(d) { - return callDateGet(d, 'Day'); - } - - function getDate(d) { - return callDateGet(d, 'Date'); - } - - function getMonth(d) { - return callDateGet(d, 'Month'); - } - - function getYear(d) { - return callDateGet(d, 'FullYear'); - } - - function setDate(d, val) { - callDateSet(d, 'Date', val); - } - - function setMonth(d, val) { - callDateSet(d, 'Month', val); - } - - function setYear(d, val) { - callDateSet(d, 'FullYear', val); - } - - function getDaysInMonth(d) { - return 32 - callDateGet(new Date(getYear(d), getMonth(d), 32), 'Date'); - } - - function setWeekday(d, dow, dir) { - if (!isNumber(dow)) return; - var currentWeekday = getWeekday(d); - if (dir) { - // Allow a "direction" parameter to determine whether a weekday can - // be set beyond the current weekday in either direction. - var ndir = dir > 0 ? 1 : -1; - var offset = dow % 7 - currentWeekday; - if (offset && offset / abs(offset) !== ndir) { - dow += 7 * ndir; - } - } - setDate(d, getDate(d) + dow - currentWeekday); - return d.getTime(); - } - - // Normal callDateSet method with ability - // to handle ISOWeek setting as well. - function callDateSetWithWeek(d, method, value, safe) { - if (method === 'ISOWeek') { - setISOWeekNumber(d, value); - } else { - callDateSet(d, method, value, safe); - } - } - - // UTC helpers - - function isUTC(d) { - return !!_utc(d) || tzOffset(d) === 0; - } - - function getUTCOffset(d, iso) { - var offset = _utc(d) ? 0 : tzOffset(d), hours, mins, colon; - colon = iso === true ? ':' : ''; - if (!offset && iso) return 'Z'; - hours = padNumber(trunc(-offset / 60), 2, true); - mins = padNumber(abs(offset % 60), 2); - return hours + colon + mins; - } - - function tzOffset(d) { - return d.getTimezoneOffset(); - } - - // Argument helpers - - function collectUpdateDateArguments(args, allowDuration) { - var arg1 = args[0], arg2 = args[1], params, reset; - if (allowDuration && isString(arg1)) { - params = getDateParamsFromString(arg1); - reset = arg2; - } else if (isNumber(arg1) && isNumber(arg2)) { - params = collectDateParamsFromArguments(args); - } else { - params = isObjectType(arg1) ? simpleClone(arg1) : arg1; - reset = arg2; - } - return [params, reset]; - } - - function collectDateParamsFromArguments(args) { - var params = {}, index = 0; - walkUnitDown(YEAR_INDEX, function(unit) { - var arg = args[index++]; - if (isDefined(arg)) { - params[unit.name] = arg; - } - }); - return params; - } - - function getDateParamsFromString(str) { - var match, num, params = {}; - match = str.match(/^(-?\d*[\d.]\d*)?\s?(\w+?)s?$/i); - if (match) { - if (isUndefined(num)) { - num = match[1] ? +match[1] : 1; - } - params[match[2].toLowerCase()] = num; - } - return params; - } - - // Iteration helpers - - // Years -> Milliseconds - function iterateOverDateUnits(fn, startIndex, endIndex) { - endIndex = endIndex || 0; - if (isUndefined(startIndex)) { - startIndex = YEAR_INDEX; - } - for (var index = startIndex; index >= endIndex; index--) { - if (fn(DateUnits[index], index) === false) { - break; - } - } - } - - // Years -> Milliseconds using getLower/Higher methods - function walkUnitDown(unitIndex, fn) { - while (unitIndex >= 0) { - if (fn(DateUnits[unitIndex], unitIndex) === false) { - break; - } - unitIndex = getLowerUnitIndex(unitIndex); - } - } - - // Moving lower from specific unit - function getLowerUnitIndex(index) { - if (index === MONTH_INDEX) { - return DAY_INDEX; - } else if (index === WEEK_INDEX) { - return HOURS_INDEX; - } - return index - 1; - } - - // Moving higher from specific unit - function getHigherUnitIndex(index) { - return index === DAY_INDEX ? MONTH_INDEX : index + 1; - } - - // Years -> Milliseconds checking all date params including "weekday" - function iterateOverDateParams(params, fn, startIndex, endIndex) { - - function run(name, unit, i) { - var val = getDateParam(params, name); - if (isDefined(val)) { - fn(name, val, unit, i); - } - } - - iterateOverDateUnits(function (unit, i) { - var result = run(unit.name, unit, i); - if (result !== false && i === DAY_INDEX) { - // Check for "weekday", which has a distinct meaning - // in the context of setting a date, but has the same - // meaning as "day" as a unit of time. - result = run('weekday', unit, i); - } - return result; - }, startIndex, endIndex); - - } - - // Years -> Days - function iterateOverHigherDateParams(params, fn) { - iterateOverDateParams(params, fn, YEAR_INDEX, DAY_INDEX); - } - - // Advancing helpers - - function advanceDate(d, unit, num, reset) { - var set = {}; - set[unit] = num; - return updateDate(d, set, reset, 1); - } - - function advanceDateWithArgs(d, args, dir) { - args = collectUpdateDateArguments(args, true); - return updateDate(d, args[0], args[1], dir); - } - - // Edge helpers - - function resetTime(d) { - return setUnitAndLowerToEdge(d, HOURS_INDEX); - } - - function resetLowerUnits(d, unitIndex) { - return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex)); - } - - function moveToBeginningOfWeek(d, firstDayOfWeek) { - setWeekday(d, floor((getWeekday(d) - firstDayOfWeek) / 7) * 7 + firstDayOfWeek); - return d; - } - - function moveToEndOfWeek(d, firstDayOfWeek) { - var target = firstDayOfWeek - 1; - setWeekday(d, ceil((getWeekday(d) - target) / 7) * 7 + target); - return d; - } - - function moveToBeginningOfUnit(d, unitIndex, localeCode) { - if (unitIndex === WEEK_INDEX) { - moveToBeginningOfWeek(d, localeManager.get(localeCode).getFirstDayOfWeek()); - } - return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex)); - } - - function moveToEndOfUnit(d, unitIndex, localeCode, stopIndex) { - if (unitIndex === WEEK_INDEX) { - moveToEndOfWeek(d, localeManager.get(localeCode).getFirstDayOfWeek()); - } - return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex), stopIndex, true); - } - - function setUnitAndLowerToEdge(d, startIndex, stopIndex, end) { - walkUnitDown(startIndex, function(unit, i) { - var val = end ? unit.end : unit.start; - if (isFunction(val)) { - val = val(d); - } - callDateSet(d, unit.method, val); - return !isDefined(stopIndex) || i > stopIndex; - }); - return d; - } - - // Param helpers - - function getDateParamKey(params, key) { - return getOwnKey(params, key) || - getOwnKey(params, key + 's') || - (key === 'day' && getOwnKey(params, 'date')); - } - - function getDateParam(params, key) { - return getOwn(params, getDateParamKey(params, key)); - } - - function deleteDateParam(params, key) { - delete params[getDateParamKey(params, key)]; - } - - function getUnitIndexForParamName(name) { - var params = {}, unitIndex; - params[name] = 1; - iterateOverDateParams(params, function(name, val, unit, i) { - unitIndex = i; - return false; - }); - return unitIndex; - } - - // Time distance helpers - - function getDaysSince(d1, d2) { - return getTimeDistanceForUnit(d1, d2, DateUnits[DAY_INDEX]); - } - - function getTimeDistanceForUnit(d1, d2, unit) { - var fwd = d2 > d1, num, tmp; - if (!fwd) { - tmp = d2; - d2 = d1; - d1 = tmp; - } - num = d2 - d1; - if (unit.multiplier > 1) { - num = trunc(num / unit.multiplier); - } - // For higher order with potential ambiguity, use the numeric calculation - // as a starting point, then iterate until we pass the target date. Decrement - // starting point by 1 to prevent overshooting the date due to inconsistencies - // in ambiguous units numerically. For example, calculating the number of days - // from the beginning of the year to August 5th at 11:59:59 by doing a simple - // d2 - d1 will produce different results depending on whether or not a - // timezone shift was encountered due to DST, however that should not have an - // effect on our calculation here, so subtract by 1 to ensure that the - // starting point has not already overshot our target date. - if (unit.ambiguous) { - d1 = cloneDate(d1); - if (num) { - num -= 1; - advanceDate(d1, unit.name, num); - } - while (d1 < d2) { - advanceDate(d1, unit.name, 1); - if (d1 > d2) { - break; - } - num += 1; - } - } - return fwd ? -num : num; - } - - // Parsing helpers - - function getYearFromAbbreviation(str, d, prefer) { - // Following IETF here, adding 1900 or 2000 depending on the last two digits. - // Note that this makes no accordance for what should happen after 2050, but - // intentionally ignoring this for now. https://www.ietf.org/rfc/rfc2822.txt - var val = +str, delta; - val += val < 50 ? 2000 : 1900; - if (prefer) { - delta = val - getYear(d); - if (delta / abs(delta) !== prefer) { - val += prefer * 100; - } - } - return val; - } - - // Week number helpers - - function setISOWeekNumber(d, num) { - if (isNumber(num)) { - // Intentionally avoiding updateDate here to prevent circular dependencies. - var isoWeek = cloneDate(d), dow = getWeekday(d); - moveToFirstDayOfWeekYear(isoWeek, ISO_FIRST_DAY_OF_WEEK, ISO_FIRST_DAY_OF_WEEK_YEAR); - setDate(isoWeek, getDate(isoWeek) + 7 * (num - 1)); - setYear(d, getYear(isoWeek)); - setMonth(d, getMonth(isoWeek)); - setDate(d, getDate(isoWeek)); - setWeekday(d, dow || 7); - } - return d.getTime(); - } - - function getWeekNumber(d, allowPrevious, firstDayOfWeek, firstDayOfWeekYear) { - var isoWeek, n = 0; - if (isUndefined(firstDayOfWeek)) { - firstDayOfWeek = ISO_FIRST_DAY_OF_WEEK; - } - if (isUndefined(firstDayOfWeekYear)) { - firstDayOfWeekYear = ISO_FIRST_DAY_OF_WEEK_YEAR; - } - // Moving to the end of the week allows for forward year traversal, ie - // Dec 29 2014 is actually week 01 of 2015. - isoWeek = moveToEndOfWeek(cloneDate(d), firstDayOfWeek); - moveToFirstDayOfWeekYear(isoWeek, firstDayOfWeek, firstDayOfWeekYear); - if (allowPrevious && d < isoWeek) { - // If the date is still before the start of the year, then it should be - // the last week of the previous year, ie Jan 1 2016 is actually week 53 - // of 2015, so move to the beginning of the week to traverse the year. - isoWeek = moveToBeginningOfWeek(cloneDate(d), firstDayOfWeek); - moveToFirstDayOfWeekYear(isoWeek, firstDayOfWeek, firstDayOfWeekYear); - } - while (isoWeek <= d) { - // Doing a very simple walk to get the week number. - setDate(isoWeek, getDate(isoWeek) + 7); - n++; - } - return n; - } - - // Week year helpers - - function getWeekYear(d, localeCode, iso) { - var year, month, firstDayOfWeek, firstDayOfWeekYear, week, loc; - year = getYear(d); - month = getMonth(d); - if (month === 0 || month === 11) { - if (!iso) { - loc = localeManager.get(localeCode); - firstDayOfWeek = loc.getFirstDayOfWeek(localeCode); - firstDayOfWeekYear = loc.getFirstDayOfWeekYear(localeCode); - } - week = getWeekNumber(d, false, firstDayOfWeek, firstDayOfWeekYear); - if (month === 0 && week === 0) { - year -= 1; - } else if (month === 11 && week === 1) { - year += 1; - } - } - return year; - } - - function moveToFirstDayOfWeekYear(d, firstDayOfWeek, firstDayOfWeekYear) { - setUnitAndLowerToEdge(d, MONTH_INDEX); - setDate(d, firstDayOfWeekYear); - moveToBeginningOfWeek(d, firstDayOfWeek); - } - - // Relative helpers - - function dateRelative(d, dRelative, arg1, arg2) { - var adu, format, type, localeCode, fn; - assertDateIsValid(d); - if (isFunction(arg1)) { - fn = arg1; - } else { - localeCode = arg1; - fn = arg2; - } - adu = getAdjustedUnitForDate(d, dRelative); - if (fn) { - format = fn.apply(d, adu.concat(localeManager.get(localeCode))); - if (format) { - return dateFormat(d, format, localeCode); - } - } - // Adjust up if time is in ms, as this doesn't - // look very good for a standard relative date. - if (adu[1] === 0) { - adu[1] = 1; - adu[0] = 1; - } - if (dRelative) { - type = 'duration'; - } else if (adu[2] > 0) { - type = 'future'; - } else { - type = 'past'; - } - return localeManager.get(localeCode).getRelativeFormat(adu, type); - } - - // Gets an "adjusted date unit" which is a way of representing - // the largest possible meaningful unit. In other words, if passed - // 3600000, this will return an array which represents "1 hour". - function getAdjustedUnit(ms, fn) { - var unitIndex = 0, value = 0; - iterateOverDateUnits(function(unit, i) { - value = abs(fn(unit)); - if (value >= 1) { - unitIndex = i; - return false; - } - }); - return [value, unitIndex, ms]; - } - - // Gets the adjusted unit based on simple division by - // date unit multiplier. - function getAdjustedUnitForNumber(ms) { - return getAdjustedUnit(ms, function(unit) { - return trunc(withPrecision(ms / unit.multiplier, 1)); - }); - } - - // Gets the adjusted unit using the unitsFromNow methods, - // which use internal date methods that neatly avoid vaguely - // defined units of time (days in month, leap years, etc). - // Reserving dRelative to allow another date to be relative to. - function getAdjustedUnitForDate(d, dRelative) { - var ms; - if (!dRelative) { - dRelative = getNewDate(); - if (d > dRelative) { - // If our date is greater than the one that we got from getNewDate, it - // means that we are finding the unit for a date that is in the future - // relative to now. However, often the incoming date was created in - // the same cycle as our comparison, but our "now" date will have been - // created an instant after it, creating situations where "5 minutes from - // now" becomes "4 minutes from now" in the same tick. To prevent this, - // subtract a buffer of 10ms to compensate. - dRelative = new Date(dRelative.getTime() - 10); - } - } - ms = d - dRelative; - return getAdjustedUnit(ms, function(u) { - return abs(getTimeDistanceForUnit(d, dRelative, u)); - }); - } - - // Foramtting helpers - - // Formatting tokens - var ldmlTokens, strfTokens; - - function dateFormat(d, format, localeCode) { - assertDateIsValid(d); - format = CoreOutputFormats[format] || format || '{long}'; - return dateFormatMatcher(format, d, localeCode); - } - - function getMeridiemToken(d, localeCode) { - var hours = getHours(d); - return localeManager.get(localeCode).ampm[trunc(hours / 12)] || ''; - } - - function buildDateFormatTokens() { - - function addFormats(target, tokens, fn) { - if (tokens) { - forEach(spaceSplit(tokens), function(token) { - target[token] = fn; - }); - } - } - - function buildLowercase(get) { - return function(d, localeCode) { - return get(d, localeCode).toLowerCase(); - }; - } - - function buildOrdinal(get) { - return function(d, localeCode) { - var n = get(d, localeCode); - return n + localeManager.get(localeCode).getOrdinal(n); - }; - } - - function buildPadded(get, padding) { - return function(d, localeCode) { - return padNumber(get(d, localeCode), padding); - }; - } - - function buildTwoDigits(get) { - return function(d, localeCode) { - return get(d, localeCode) % 100; - }; - } - - function buildAlias(alias) { - return function(d, localeCode) { - return dateFormatMatcher(alias, d, localeCode); - }; - } - - function buildAlternates(f) { - for (var n = 1; n <= 5; n++) { - buildAlternate(f, n); - } - } - - function buildAlternate(f, n) { - var alternate = function(d, localeCode) { - return f.get(d, localeCode, n); - }; - addFormats(ldmlTokens, f.ldml + n, alternate); - if (f.lowerToken) { - ldmlTokens[f.lowerToken + n] = buildLowercase(alternate); - } - } - - function getIdentityFormat(name) { - return function(d, localeCode) { - var loc = localeManager.get(localeCode); - return dateFormatMatcher(loc[name], d, localeCode); - }; - } - - ldmlTokens = {}; - strfTokens = {}; - - forEach(FormatTokensBase, function(f) { - var get = f.get, getPadded; - if (f.lowerToken) { - ldmlTokens[f.lowerToken] = buildLowercase(get); - } - if (f.ordinalToken) { - ldmlTokens[f.ordinalToken] = buildOrdinal(get, f); - } - if (f.ldmlPaddedToken) { - ldmlTokens[f.ldmlPaddedToken] = buildPadded(get, f.ldmlPaddedToken.length); - } - if (f.ldmlTwoDigitToken) { - ldmlTokens[f.ldmlTwoDigitToken] = buildPadded(buildTwoDigits(get), 2); - } - if (f.strfTwoDigitToken) { - strfTokens[f.strfTwoDigitToken] = buildPadded(buildTwoDigits(get), 2); - } - if (f.strfPadding) { - getPadded = buildPadded(get, f.strfPadding); - } - if (f.alias) { - get = buildAlias(f.alias); - } - if (f.allowAlternates) { - buildAlternates(f); - } - addFormats(ldmlTokens, f.ldml, get); - addFormats(strfTokens, f.strf, getPadded || get); - }); - - forEachProperty(CoreOutputFormats, function(src, name) { - addFormats(ldmlTokens, name, buildAlias(src)); - }); - - defineInstanceSimilar(sugarDate, 'short medium long full', function(methods, name) { - var fn = getIdentityFormat(name); - addFormats(ldmlTokens, name, fn); - methods[name] = fn; - }); - - addFormats(ldmlTokens, 'time', getIdentityFormat('time')); - addFormats(ldmlTokens, 'stamp', getIdentityFormat('stamp')); - } - - // Format matcher - - var dateFormatMatcher; - - function buildDateFormatMatcher() { - - function getLdml(d, token, localeCode) { - return getOwn(ldmlTokens, token)(d, localeCode); - } - - function getStrf(d, token, localeCode) { - return getOwn(strfTokens, token)(d, localeCode); - } - - function checkDateToken(ldml, strf) { - return hasOwn(ldmlTokens, ldml) || hasOwn(strfTokens, strf); - } - - // Format matcher for LDML or STRF tokens. - dateFormatMatcher = createFormatMatcher(getLdml, getStrf, checkDateToken); - } - - // Comparison helpers - - function fullCompareDate(date, d, margin) { - var tmp; - if (!dateIsValid(date)) return; - if (isString(d)) { - d = trim(d).toLowerCase(); - switch(true) { - case d === 'future': return date.getTime() > getNewDate().getTime(); - case d === 'past': return date.getTime() < getNewDate().getTime(); - case d === 'today': return compareDay(date); - case d === 'tomorrow': return compareDay(date, 1); - case d === 'yesterday': return compareDay(date, -1); - case d === 'weekday': return getWeekday(date) > 0 && getWeekday(date) < 6; - case d === 'weekend': return getWeekday(date) === 0 || getWeekday(date) === 6; - - case (isDefined(tmp = English.weekdayMap[d])): - return getWeekday(date) === tmp; - case (isDefined(tmp = English.monthMap[d])): - return getMonth(date) === tmp; - } - } - return compareDate(date, d, margin); - } - - function compareDate(date, d, margin, localeCode, options) { - var loMargin = 0, hiMargin = 0, timezoneShift, compareEdges, override, min, max, p, t; - - function getTimezoneShift() { - // If there is any specificity in the date then we're implicitly not - // checking absolute time, so ignore timezone shifts. - if (p.set && p.set.specificity) { - return 0; - } - return (tzOffset(p.date) - tzOffset(date)) * MINUTES; - } - - function addSpecificUnit() { - var unit = DateUnits[p.set.specificity]; - return advanceDate(cloneDate(p.date), unit.name, 1).getTime() - 1; - } - - if (_utc(date)) { - options = options || {}; - options.fromUTC = true; - options.setUTC = true; - } - - p = getExtendedDate(null, d, options, true); - - if (margin > 0) { - loMargin = hiMargin = margin; - override = true; - } - if (!dateIsValid(p.date)) return false; - if (p.set && p.set.specificity) { - if (isDefined(p.set.edge) || isDefined(p.set.shift)) { - compareEdges = true; - moveToBeginningOfUnit(p.date, p.set.specificity, localeCode); - } - if (compareEdges || p.set.specificity === MONTH_INDEX) { - max = moveToEndOfUnit(cloneDate(p.date), p.set.specificity, localeCode).getTime(); - } else { - max = addSpecificUnit(); - } - if (!override && isDefined(p.set.sign) && p.set.specificity) { - // If the time is relative, there can occasionally be an disparity between - // the relative date and "now", which it is being compared to, so set an - // extra margin to account for this. - loMargin = 50; - hiMargin = -50; - } - } - t = date.getTime(); - min = p.date.getTime(); - max = max || min; - timezoneShift = getTimezoneShift(); - // istanbul ignore if - if (timezoneShift) { - min -= timezoneShift; - max -= timezoneShift; - } - return t >= (min - loMargin) && t <= (max + hiMargin); - } - - function compareDay(d, shift) { - var comp = getNewDate(); - if (shift) { - setDate(comp, getDate(comp) + shift); - } - return getYear(d) === getYear(comp) && - getMonth(d) === getMonth(comp) && - getDate(d) === getDate(comp); - } - - // Create helpers - - function createDate(d, options, forceClone) { - return getExtendedDate(null, d, options, forceClone).date; - } - - function createDateWithContext(contextDate, d, options, forceClone) { - return getExtendedDate(contextDate, d, options, forceClone).date; - } - - function getExtendedDate(contextDate, d, opt, forceClone) { - - // Locals - var date, set, loc, afterCallbacks, relative, weekdayDir; - - // Options - var optPrefer, optLocale, optFromUTC, optSetUTC, optParams, optClone; - - afterCallbacks = []; - - setupOptions(opt); - - function setupOptions(opt) { - opt = isString(opt) ? { locale: opt } : opt || {}; - optPrefer = +!!getOwn(opt, 'future') - +!!getOwn(opt, 'past'); - optLocale = getOwn(opt, 'locale'); - optFromUTC = getOwn(opt, 'fromUTC'); - optSetUTC = getOwn(opt, 'setUTC'); - optParams = getOwn(opt, 'params'); - optClone = getOwn(opt, 'clone'); - } - - function parseFormatValues(match, dif) { - var set = optParams || {}; - forEach(dif.to, function(param, i) { - var str = match[i + 1], val; - if (!str) return; - - val = parseIrregular(str, param); - - if (isUndefined(val)) { - val = loc.parseValue(str, param); - } - - set[param] = val; - }); - return set; - } - - function parseIrregular(str, param) { - if (param === 'utc') { - return 1; - } else if (param === 'year') { - var match = str.match(ABBREVIATED_YEAR_REG); - if (match) { - return getYearFromAbbreviation(match[1], date, optPrefer); - } - } - } - - // Force the UTC flags to be true if the source date - // date is UTC, as they will be overwritten later. - function cloneDateByFlag(d, clone) { - if (_utc(d) && !isDefined(optFromUTC)) { - optFromUTC = true; - } - if (_utc(d) && !isDefined(optSetUTC)) { - optSetUTC = true; - } - if (clone) { - d = new Date(d.getTime()); - } - return d; - } - - function afterDateSet(fn) { - afterCallbacks.push(fn); - } - - function fireCallbacks() { - forEach(afterCallbacks, function(fn) { - fn.call(); - }); - } - - function parseStringDate(str) { - - str = str.toLowerCase(); - - // The act of getting the locale will initialize - // if it is missing and add the required formats. - loc = localeManager.get(optLocale); - - for (var i = 0, dif, match; dif = loc.compiledFormats[i]; i++) { - match = str.match(dif.reg); - if (match) { - - // Note that caching the format will modify the compiledFormats array - // which is not a good idea to do inside its for loop, however we - // know at this point that we have a matched format and that we will - // break out below, so simpler to do it here. - loc.cacheFormat(dif, i); - - set = parseFormatValues(match, dif); - - if (isDefined(set.timestamp)) { - date.setTime(set.timestamp); - break; - } - - if (isDefined(set.ampm)) { - handleAmpm(set.ampm); - } - - if (set.utc || isDefined(set.tzHour)) { - handleTimezoneOffset(set.tzHour, set.tzMinute); - } - - if (isDefined(set.shift) && isUndefined(set.unit)) { - // "next january", "next monday", etc - handleUnitlessShift(); - } - - if (isDefined(set.num) && isUndefined(set.unit)) { - // "the second of January", etc - handleUnitlessNum(set.num); - } - - if (set.midday) { - // "noon" and "midnight" - handleMidday(set.midday); - } - - if (isDefined(set.day)) { - // Relative day localizations such as "today" and "tomorrow". - handleRelativeDay(set.day); - } - - if (isDefined(set.unit)) { - // "3 days ago", etc - handleRelativeUnit(set.unit); - } - - if (set.edge) { - // "the end of January", etc - handleEdge(set.edge, set); - } - - break; - } - } - - if (!set) { - // TODO: remove in next major version - // Fall back to native parsing - date = new Date(str); - if (optFromUTC && dateIsValid(date)) { - // Falling back to system date here which cannot be parsed as UTC, - // so if we're forcing UTC then simply add the offset. - date.setTime(date.getTime() + (tzOffset(date) * MINUTES)); - } - } else if (relative) { - updateDate(date, set, false, 1); - } else { - updateDate(date, set, true, 0, optPrefer, weekdayDir, contextDate); - } - fireCallbacks(); - return date; - } - - function handleAmpm(ampm) { - if (ampm === 1 && set.hour < 12) { - // If the time is 1pm-11pm advance the time by 12 hours. - set.hour += 12; - } else if (ampm === 0 && set.hour === 12) { - // If it is 12:00am then set the hour to 0. - set.hour = 0; - } - } - - function handleTimezoneOffset(tzHour, tzMinute) { - // Adjust for timezone offset - _utc(date, true); - - // Sign is parsed as part of the hour, so flip - // the minutes if it's negative. - - if (tzHour < 0) { - tzMinute *= -1; - } - - var offset = tzHour * 60 + (tzMinute || 0); - if (offset) { - set.minute = (set.minute || 0) - offset; - } - } - - function handleUnitlessShift() { - if (isDefined(set.month)) { - // "next January" - set.unit = YEAR_INDEX; - } else if (isDefined(set.weekday)) { - // "next Monday" - set.unit = WEEK_INDEX; - } - } - - function handleUnitlessNum(num) { - if (isDefined(set.weekday)) { - // "The second Tuesday of March" - setOrdinalWeekday(num); - } else if (isDefined(set.month)) { - // "The second of March" - set.date = set.num; - } - } - - function handleMidday(hour) { - set.hour = hour % 24; - if (hour > 23) { - // If the date has hours past 24, we need to prevent it from traversing - // into a new day as that would make it being part of a new week in - // ambiguous dates such as "Monday". - afterDateSet(function() { - advanceDate(date, 'date', trunc(hour / 24)); - }); - } - } - - function handleRelativeDay() { - resetTime(date); - if (isUndefined(set.unit)) { - set.unit = DAY_INDEX; - set.num = set.day; - delete set.day; - } - } - - function handleRelativeUnit(unitIndex) { - var num; - - if (isDefined(set.num)) { - num = set.num; - } else if (isDefined(set.edge) && isUndefined(set.shift)) { - num = 0; - } else { - num = 1; - } - - // If a weekday is defined, there are 3 possible formats being applied: - // - // 1. "the day after monday": unit is days - // 2. "next monday": short for "next week monday", unit is weeks - // 3. "the 2nd monday of next month": unit is months - // - // In the first case, we need to set the weekday up front, as the day is - // relative to it. The second case also needs to be handled up front for - // formats like "next monday at midnight" which will have its weekday reset - // if not set up front. The last case will set up the params necessary to - // shift the weekday and allow separateAbsoluteUnits below to handle setting - // it after the date has been shifted. - if(isDefined(set.weekday)) { - if(unitIndex === MONTH_INDEX) { - setOrdinalWeekday(num); - num = 1; - } else { - updateDate(date, { weekday: set.weekday }, true); - delete set.weekday; - } - } - - if (set.half) { - // Allow localized "half" as a standalone colloquialism. Purposely avoiding - // the locale number system to reduce complexity. The units "month" and - // "week" are purposely excluded in the English date formats below, as - // "half a week" and "half a month" are meaningless as exact dates. - num *= set.half; - } - - if (isDefined(set.shift)) { - // Shift and unit, ie "next month", "last week", etc. - num *= set.shift; - } else if (set.sign) { - // Unit and sign, ie "months ago", "weeks from now", etc. - num *= set.sign; - } - - if (isDefined(set.day)) { - // "the day after tomorrow" - num += set.day; - delete set.day; - } - - // Formats like "the 15th of last month" or "6:30pm of next week" - // contain absolute units in addition to relative ones, so separate - // them here, remove them from the params, and set up a callback to - // set them after the relative ones have been set. - separateAbsoluteUnits(unitIndex); - - // Finally shift the unit. - set[English.units[unitIndex]] = num; - relative = true; - } - - function handleEdge(edge, params) { - var edgeIndex = params.unit, weekdayOfMonth; - if (!edgeIndex) { - // If we have "the end of January", then we need to find the unit index. - iterateOverHigherDateParams(params, function(unitName, val, unit, i) { - if (unitName === 'weekday' && isDefined(params.month)) { - // If both a month and weekday exist, then we have a format like - // "the last tuesday in November, 2012", where the "last" is still - // relative to the end of the month, so prevent the unit "weekday" - // from taking over. - return; - } - edgeIndex = i; - }); - } - if (edgeIndex === MONTH_INDEX && isDefined(params.weekday)) { - // If a weekday in a month exists (as described above), - // then set it up to be set after the date has been shifted. - weekdayOfMonth = params.weekday; - delete params.weekday; - } - afterDateSet(function() { - var stopIndex; - // "edge" values that are at the very edge are "2" so the beginning of the - // year is -2 and the end of the year is 2. Conversely, the "last day" is - // actually 00:00am so it is 1. -1 is reserved but unused for now. - if (edge < 0) { - moveToBeginningOfUnit(date, edgeIndex, optLocale); - } else if (edge > 0) { - if (edge === 1) { - stopIndex = DAY_INDEX; - moveToBeginningOfUnit(date, DAY_INDEX); - } - moveToEndOfUnit(date, edgeIndex, optLocale, stopIndex); - } - if (isDefined(weekdayOfMonth)) { - setWeekday(date, weekdayOfMonth, -edge); - resetTime(date); - } - }); - if (edgeIndex === MONTH_INDEX) { - params.specificity = DAY_INDEX; - } else { - params.specificity = edgeIndex - 1; - } - } - - function setOrdinalWeekday(num) { - // If we have "the 2nd Tuesday of June", then pass the "weekdayDir" - // flag along to updateDate so that the date does not accidentally traverse - // into the previous month. This needs to be independent of the "prefer" - // flag because we are only ensuring that the weekday is in the future, not - // the entire date. - set.weekday = 7 * (num - 1) + set.weekday; - set.date = 1; - weekdayDir = 1; - } - - function separateAbsoluteUnits(unitIndex) { - var params; - - iterateOverDateParams(set, function(name, val, unit, i) { - // If there is a time unit set that is more specific than - // the matched unit we have a string like "5:30am in 2 minutes", - // which is meaningless, so invalidate the date... - if (i >= unitIndex) { - date.setTime(NaN); - return false; - } else if (i < unitIndex) { - // ...otherwise set the params to set the absolute date - // as a callback after the relative date has been set. - params = params || {}; - params[name] = val; - deleteDateParam(set, name); - } - }); - if (params) { - afterDateSet(function() { - updateDate(date, params, true, 0, false, weekdayDir); - if (optParams) { - simpleMerge(optParams, params); - } - }); - if (set.edge) { - // "the end of March of next year" - handleEdge(set.edge, params); - delete set.edge; - } - } - } - - if (contextDate && d) { - // If a context date is passed ("get" and "unitsFromNow"), - // then use it as the starting point. - date = cloneDateByFlag(contextDate, true); - } else { - date = getNewDate(); - } - - _utc(date, optFromUTC); - - if (isString(d)) { - date = parseStringDate(d); - } else if (isDate(d)) { - date = cloneDateByFlag(d, optClone || forceClone); - } else if (isObjectType(d)) { - set = simpleClone(d); - updateDate(date, set, true); - } else if (isNumber(d) || d === null) { - date.setTime(d); - } - // A date created by parsing a string presumes that the format *itself* is - // UTC, but not that the date, once created, should be manipulated as such. In - // other words, if you are creating a date object from a server time - // "2012-11-15T12:00:00Z", in the majority of cases you are using it to create - // a date that will, after creation, be manipulated as local, so reset the utc - // flag here unless "setUTC" is also set. - _utc(date, !!optSetUTC); - return { - set: set, - date: date - }; - } - - // TODO: consolidate arguments into options - function updateDate(d, params, reset, advance, prefer, weekdayDir, contextDate) { - var upperUnitIndex; - - function setUpperUnit(unitName, unitIndex) { - if (prefer && !upperUnitIndex) { - if (unitName === 'weekday') { - upperUnitIndex = WEEK_INDEX; - } else { - upperUnitIndex = getHigherUnitIndex(unitIndex); - } - } - } - - function setSpecificity(unitIndex) { - // Other functions may preemptively set the specificity before arriving - // here so concede to them if they have already set more specific units. - if (unitIndex > params.specificity) { - return; - } - params.specificity = unitIndex; - } - - function canDisambiguate() { - if (!upperUnitIndex || upperUnitIndex > YEAR_INDEX) { - return; - } - - switch(prefer) { - case -1: return d >= (contextDate || getNewDate()); - case 1: return d <= (contextDate || getNewDate()); - } - } - - function disambiguateHigherUnit() { - var unit = DateUnits[upperUnitIndex]; - advance = prefer; - setUnit(unit.name, 1, unit, upperUnitIndex); - } - - function handleFraction(unit, unitIndex, fraction) { - if (unitIndex) { - var lowerUnit = DateUnits[getLowerUnitIndex(unitIndex)]; - var val = round(unit.multiplier / lowerUnit.multiplier * fraction); - params[lowerUnit.name] = val; - } - } - - function monthHasShifted(d, targetMonth) { - if (targetMonth < 0) { - targetMonth = targetMonth % 12 + 12; - } - return targetMonth % 12 !== getMonth(d); - } - - function setUnit(unitName, value, unit, unitIndex) { - var method = unit.method, checkMonth, fraction; - - setUpperUnit(unitName, unitIndex); - setSpecificity(unitIndex); - - fraction = value % 1; - if (fraction) { - handleFraction(unit, unitIndex, fraction); - value = trunc(value); - } - - if (unitName === 'weekday') { - if (!advance) { - // Weekdays are always considered absolute units so simply set them - // here even if it is an "advance" operation. This is to help avoid - // ambiguous meanings in "advance" as well as to neatly allow formats - // like "Wednesday of next week" without more complex logic. - setWeekday(d, value, weekdayDir); - } - return; - } - checkMonth = unitIndex === MONTH_INDEX && getDate(d) > 28; - - // If we are advancing or rewinding, then we need we need to set the - // absolute time if the unit is "hours" or less. This is due to the fact - // that setting by method is ambiguous during DST shifts. For example, - // 1:00am on November 1st 2015 occurs twice in North American timezones - // with DST, the second time being after the clocks are rolled back at - // 2:00am. When springing forward this is automatically handled as there - // is no 2:00am so the date automatically jumps to 3:00am. However, when - // rolling back, setHours(2) will always choose the first "2am" even if - // the date is currently set to the second, causing unintended jumps. - // This ambiguity is unavoidable when setting dates as the notation is - // ambiguous. However when advancing, we clearly want the resulting date - // to be an acutal hour ahead, which can only be accomplished by setting - // the absolute time. Conversely, any unit higher than "hours" MUST use - // the internal set methods, as they are ambiguous as absolute units of - // time. Years may be 365 or 366 days depending on leap years, months are - // all over the place, and even days may be 23-25 hours depending on DST - // shifts. Finally, note that the kind of jumping described above will - // occur when calling ANY "set" method on the date and will occur even if - // the value being set is identical to the one currently set (i.e. - // setHours(2) on a date at 2am may not be a noop). This is precarious, - // so avoiding this situation in callDateSet by checking up front that - // the value is not the same before setting. - if (advance && !unit.ambiguous) { - d.setTime(d.getTime() + (value * advance * unit.multiplier)); - return; - } else if (advance) { - if (unitIndex === WEEK_INDEX) { - value *= 7; - method = DateUnits[DAY_INDEX].method; - } - value = (value * advance) + callDateGet(d, method); - } - callDateSetWithWeek(d, method, value, advance); - if (checkMonth && monthHasShifted(d, value)) { - // As we are setting the units in reverse order, there is a chance that - // our date may accidentally traverse into a new month, such as setting - // { month: 1, date 15 } on January 31st. Check for this here and reset - // the date to the last day of the previous month if this has happened. - setDate(d, 0); - } - } - - if (isNumber(params) && advance) { - // If param is a number and advancing, the number is in milliseconds. - params = { millisecond: params }; - } else if (isNumber(params)) { - // Otherwise just set the timestamp and return. - d.setTime(params); - return d; - } - - iterateOverDateParams(params, setUnit); - - if (reset && params.specificity) { - resetLowerUnits(d, params.specificity); - } - - // If past or future is preferred, then the process of "disambiguation" will - // ensure that an ambiguous time/date ("4pm", "thursday", "June", etc.) will - // be in the past or future. Weeks are only considered ambiguous if there is - // a weekday, i.e. "thursday" is an ambiguous week, but "the 4th" is an - // ambiguous month. - if (canDisambiguate()) { - disambiguateHigherUnit(); - } - return d; - } - - // Locales - - // Locale helpers - var English, localeManager; - - function getEnglishVariant(v) { - return simpleMerge(simpleClone(EnglishLocaleBaseDefinition), v); - } - - function arrayToRegAlternates(arr) { - var joined = arr.join(''); - if (!arr || !arr.length) { - return ''; - } - if (joined.length === arr.length) { - return '[' + joined + ']'; - } - // map handles sparse arrays so no need to compact the array here. - return map(arr, escapeRegExp).join('|'); - } - - function getRegNonCapturing(src, opt) { - if (src.length > 1) { - src = '(?:' + src + ')'; - } - if (opt) { - src += '?'; - } - return src; - } - - function getParsingTokenWithSuffix(field, src, suffix) { - var token = LocalizedParsingTokens[field]; - if (token.requiresSuffix) { - src = getRegNonCapturing(src + getRegNonCapturing(suffix)); - } else if (token.requiresSuffixOr) { - src += getRegNonCapturing(token.requiresSuffixOr + '|' + suffix); - } else { - src += getRegNonCapturing(suffix, true); - } - return src; - } - - function getArrayWithOffset(arr, n, alternate, offset) { - var val; - if (alternate > 1) { - val = arr[n + (alternate - 1) * offset]; - } - return val || arr[n]; - } - - function buildLocales() { - - function LocaleManager(loc) { - this.locales = {}; - this.add(loc); - } - - LocaleManager.prototype = { - - get: function(code, fallback) { - var loc = this.locales[code]; - if (!loc && LazyLoadedLocales[code]) { - loc = this.add(code, LazyLoadedLocales[code]); - } else if (!loc && code) { - loc = this.locales[code.slice(0, 2)]; - } - return loc || fallback === false ? loc : this.current; - }, - - getAll: function() { - return this.locales; - }, - - set: function(code) { - var loc = this.get(code, false); - if (!loc) { - throw new TypeError('Invalid Locale: ' + code); - } - return this.current = loc; - }, - - add: function(code, def) { - if (!def) { - def = code; - code = def.code; - } else { - def.code = code; - } - var loc = def.compiledFormats ? def : getNewLocale(def); - this.locales[code] = loc; - if (!this.current) { - this.current = loc; - } - return loc; - }, - - remove: function(code) { - if (this.current.code === code) { - this.current = this.get('en'); - } - return delete this.locales[code]; - } - - }; - - // Sorry about this guys... - English = getNewLocale(AmericanEnglishDefinition); - localeManager = new LocaleManager(English); - } - - function getNewLocale(def) { - - function Locale(def) { - this.init(def); - } - - Locale.prototype = { - - getMonthName: function(n, alternate) { - if (this.monthSuffix) { - return (n + 1) + this.monthSuffix; - } - return getArrayWithOffset(this.months, n, alternate, 12); - }, - - getWeekdayName: function(n, alternate) { - return getArrayWithOffset(this.weekdays, n, alternate, 7); - }, - - // TODO: rename to parse in next major version - parseValue: function(str, param) { - var map = this[param + 'Map']; - if (hasOwn(map, str)) { - return map[str]; - } - return this.parseNumber(str, param); - }, - - // TODO: analyze performance of parsing first vs checking - // numeralMap first. - parseNumber: function(str, param) { - var val; - - // Simple numerals such as "one" are mapped directly in - // the numeral map so catch up front if there is a match. - if (hasOwn(this.numeralMap, str)) { - val = this.numeralMap[str]; - } - - // TODO: perf test isNaN vs other methods - if (isNaN(val)) { - val = this.parseRegularNumerals(str); - } - - if (isNaN(val)) { - val = this.parseIrregularNumerals(str); - } - - if (param === 'month') { - // Months are the only numeric date field - // whose value is not the same as its number. - val -= 1; - } - - return val; - }, - - // TODO: perf test returning up front if no regular decimals exist - parseRegularNumerals: function(str) { - // Allow decimals as commas and the minus-sign as per ISO-8601. - str = str.replace(/^−/, '-').replace(/,/, '.'); - - // The unary plus operator here shows better performance and handles - // every format that parseFloat does with the exception of trailing - // characters, which are guaranteed not to be in our string at this point. - return +str; - }, - - parseIrregularNumerals: function(str) { - var place = 1, num = 0, lastWasPlace, isPlace, numeral, digit, arr; - - // Note that "numerals" that need to be converted through this method are - // all considered to be single characters in order to handle CJK. This - // method is by no means unique to CJK, but the complexity of handling - // inflections in non-CJK languages adds too much overhead for not enough - // value, so avoiding for now. - arr = str.split(''); - for (var i = arr.length - 1; numeral = arr[i]; i--) { - digit = getOwn(this.numeralMap, numeral); - if (isUndefined(digit)) { - digit = getOwn(fullWidthNumberMap, numeral) || 0; - } - isPlace = digit > 0 && digit % 10 === 0; - if (isPlace) { - if (lastWasPlace) { - num += place; - } - if (i) { - place = digit; - } else { - num += digit; - } - } else { - num += digit * place; - place *= 10; - } - lastWasPlace = isPlace; - } - return num; - }, - - getOrdinal: function(n) { - var suffix = this.ordinalSuffix; - return suffix || getOrdinalSuffix(n); - }, - - getRelativeFormat: function(adu, type) { - return this.convertAdjustedToFormat(adu, type); - }, - - getDuration: function(ms) { - return this.convertAdjustedToFormat(getAdjustedUnitForNumber(max(0, ms)), 'duration'); - }, - - getFirstDayOfWeek: function() { - var val = this.firstDayOfWeek; - return isDefined(val) ? val : ISO_FIRST_DAY_OF_WEEK; - }, - - getFirstDayOfWeekYear: function() { - return this.firstDayOfWeekYear || ISO_FIRST_DAY_OF_WEEK_YEAR; - }, - - convertAdjustedToFormat: function(adu, type) { - var sign, unit, mult, - num = adu[0], - u = adu[1], - ms = adu[2], - format = this[type] || this.relative; - if (isFunction(format)) { - return format.call(this, num, u, ms, type); - } - mult = !this.plural || num === 1 ? 0 : 1; - unit = this.units[mult * 8 + u] || this.units[u]; - sign = this[ms > 0 ? 'fromNow' : 'ago']; - return format.replace(/\{(.*?)\}/g, function(full, match) { - switch(match) { - case 'num': return num; - case 'unit': return unit; - case 'sign': return sign; - } - }); - }, - - cacheFormat: function(dif, i) { - this.compiledFormats.splice(i, 1); - this.compiledFormats.unshift(dif); - }, - - addFormat: function(format) { - var loc = this, src, to; - - function getTokenSrc(token) { - var suffix, src, tmp, - opt = token.match(/\?$/), - nc = token.match(/^(\d+)\??$/), - slice = token.match(/(\d)(?:-(\d))?/), - param = token.replace(/[^a-z]+$/i, ''); - - // Allowing alias tokens such as {time} - if (tmp = getOwn(loc.parsingAliases, param)) { - src = formatToSrc(tmp); - if (opt) { - src = getRegNonCapturing(src, true); - } - return src; - } - - if (nc) { - src = loc.tokens[nc[1]]; - } else if (tmp = getOwn(CoreParsingTokens, param)) { - src = tmp.src; - param = tmp.param || param; - } else { - tmp = getOwn(loc.parsingTokens, param) || getOwn(loc, param); - - // Both the "months" array and the "month" parsing token can be accessed - // by either {month} or {months}, falling back as necessary, however - // regardless of whether or not a fallback occurs, the final field to - // be passed to addRawFormat must be normalized as singular. - param = param.replace(/s$/, ''); - - if (!tmp) { - tmp = getOwn(loc.parsingTokens, param) || getOwn(loc, param + 's'); - } - - if (isString(tmp)) { - src = tmp; - suffix = loc[param + 'Suffix']; - } else { - - // This is a hack to temporarily disallow parsing of single character - // weekdays until the format can be changed to allow for this. - if (param === 'weekday' && loc.code === 'ko') { - tmp = filter(tmp, function(str) { - return str.length > 1; - }); - } - - if (slice) { - tmp = filter(tmp, function(m, i) { - var mod = i % (loc.units ? 8 : tmp.length); - return mod >= slice[1] && mod <= (slice[2] || slice[1]); - }); - } - src = arrayToRegAlternates(tmp); - } - } - if (!src) { - return ''; - } - if (nc) { - // Non-capturing tokens like {0} - src = getRegNonCapturing(src); - } else { - // Capturing group and add to parsed tokens - to.push(param); - src = '(' + src + ')'; - } - if (suffix) { - // Date/time suffixes such as those in CJK - src = getParsingTokenWithSuffix(param, src, suffix); - } - if (opt) { - src += '?'; - } - return src; - } - - function formatToSrc(str) { - - // Make spaces optional - str = str.replace(/ /g, ' ?'); - - str = str.replace(/\{([^,]+?)\}/g, function(match, token) { - var tokens = token.split('|'); - if (tokens.length > 1) { - return getRegNonCapturing(map(tokens, getTokenSrc).join('|')); - } else { - return getTokenSrc(token); - } - }); - - return str; - } - - function parseInputFormat() { - to = []; - src = formatToSrc(format); - } - - parseInputFormat(); - loc.addRawFormat(src, to); - }, - - addRawFormat: function(format, to) { - this.compiledFormats.unshift({ - reg: RegExp('^ *' + format + ' *$', 'i'), - to: to - }); - }, - - init: function(def) { - var loc = this; - - // -- Initialization helpers - - function initFormats() { - loc.compiledFormats = []; - loc.parsingAliases = {}; - loc.parsingTokens = {}; - } - - function initDefinition() { - simpleMerge(loc, def); - } - - function initArrayFields() { - forEach(LOCALE_ARRAY_FIELDS, function(name) { - var val = loc[name]; - if (isString(val)) { - loc[name] = commaSplit(val); - } else if (!val) { - loc[name] = []; - } - }); - } - - // -- Value array build helpers - - function buildValueArray(name, mod, map, fn) { - var field = name, all = [], setMap; - if (!loc[field]) { - field += 's'; - } - if (!map) { - map = {}; - setMap = true; - } - forAllAlternates(field, function(alt, j, i) { - var idx = j * mod + i, val; - val = fn ? fn(i) : i; - map[alt] = val; - map[alt.toLowerCase()] = val; - all[idx] = alt; - }); - loc[field] = all; - if (setMap) { - loc[name + 'Map'] = map; - } - } - - function forAllAlternates(field, fn) { - forEach(loc[field], function(str, i) { - forEachAlternate(str, function(alt, j) { - fn(alt, j, i); - }); - }); - } - - function forEachAlternate(str, fn) { - var arr = map(str.split('+'), function(split) { - return split.replace(/(.+):(.+)$/, function(full, base, suffixes) { - return map(suffixes.split('|'), function(suffix) { - return base + suffix; - }).join('|'); - }); - }).join('|'); - forEach(arr.split('|'), fn); - } - - function buildNumerals() { - var map = {}; - buildValueArray('numeral', 10, map); - buildValueArray('article', 1, map, function() { - return 1; - }); - buildValueArray('placeholder', 4, map, function(n) { - return pow(10, n + 1); - }); - loc.numeralMap = map; - } - - function buildTimeFormats() { - loc.parsingAliases['time'] = getTimeFormat(); - loc.parsingAliases['tzOffset'] = getTZOffsetFormat(); - } - - function getTimeFormat(standalone) { - var src, sep; - sep = getTimeSeparatorSrc(standalone); - if (loc.ampmFront) { - // "ampmFront" exists mostly for CJK locales, which also presume that - // time suffixes exist, allowing this to be a simpler regex. - src = '{ampm?} {hour} (?:{minute} (?::?{second})?)?'; - } else if(loc.ampm.length) { - src = '{hour}(?:'+sep+'{minute?}(?:'+sep+'{second?})? {ampm?}| {ampm})'; - } else { - src = '{hour}(?:'+sep+'{minute?}(?:'+sep+'{second?})?)'; - } - return src; - } - - function getTimeSeparatorSrc() { - if (loc.timeSeparator) { - return '[:' + loc.timeSeparator + ']'; - } else { - return ':'; - } - } - - function getTZOffsetFormat() { - return '(?:{Z}|{GMT?}(?:{tzHour}(?::?{tzMinute}(?: \\([\\w\\s]+\\))?)?)?)?'; - } - - function buildParsingTokens() { - forEachProperty(LocalizedParsingTokens, function(token, name) { - var src = token.base ? getCoreTokensForBase(token.base) : token.src, arr; - if (token.requiresNumerals || loc.numeralUnits) { - src += getNumeralSrc(); - } - arr = loc[name + 's']; - if (arr && arr.length) { - src += '|' + arrayToRegAlternates(arr); - } - loc.parsingTokens[name] = src; - }); - } - - function getCoreTokensForBase(base) { - return map(base.split('|'), function(key) { - return CoreParsingTokens[key].src; - }).join('|'); - } - - function getNumeralSrc() { - var all, src = ''; - all = loc.numerals.concat(loc.placeholders).concat(loc.articles); - if (loc.allowsFullWidth) { - all = all.concat(fullWidthNumbers.split('')); - } - if (all.length) { - src = '|(?:' + arrayToRegAlternates(all) + ')+'; - } - return src; - } - - function buildTimeSuffixes() { - iterateOverDateUnits(function(unit, i) { - var token = loc.timeSuffixes[i]; - if (token) { - loc[(unit.alias || unit.name) + 'Suffix'] = token; - } - }); - } - - function buildModifiers() { - forEach(loc.modifiers, function(modifier) { - var name = modifier.name, mapKey = name + 'Map', map; - map = loc[mapKey] || {}; - forEachAlternate(modifier.src, function(alt, j) { - var token = getOwn(loc.parsingTokens, name), val = modifier.value; - map[alt] = val; - loc.parsingTokens[name] = token ? token + '|' + alt : alt; - if (modifier.name === 'sign' && j === 0) { - // Hooking in here to set the first "fromNow" or "ago" modifier - // directly on the locale, so that it can be reused in the - // relative format. - loc[val === 1 ? 'fromNow' : 'ago'] = alt; - } - }); - loc[mapKey] = map; - }); - } - - // -- Format adding helpers - - function addCoreFormats() { - forEach(CoreParsingFormats, function(df) { - var src = df.src; - if (df.localeCheck && !df.localeCheck(loc)) { - return; - } - if (df.mdy && loc.mdy) { - // Use the mm/dd/yyyy variant if it - // exists and the locale requires it - src = df.mdy; - } - if (df.time) { - // Core formats that allow time require the time - // reg on both sides, so add both versions here. - loc.addFormat(getFormatWithTime(src, true)); - loc.addFormat(getFormatWithTime(src)); - } else { - loc.addFormat(src); - } - }); - loc.addFormat('{time}'); - } - - function addLocaleFormats() { - addFormatSet('parse'); - addFormatSet('timeParse', true); - addFormatSet('timeFrontParse', true, true); - } - - function addFormatSet(field, allowTime, timeFront) { - forEach(loc[field], function(format) { - if (allowTime) { - format = getFormatWithTime(format, timeFront); - } - loc.addFormat(format); - }); - } - - function getFormatWithTime(baseFormat, timeBefore) { - if (timeBefore) { - return getTimeBefore() + baseFormat; - } - return baseFormat + getTimeAfter(); - } - - function getTimeBefore() { - return getRegNonCapturing('{time}[,\\s\\u3000]', true); - } - - function getTimeAfter() { - var markers = ',?[\\s\\u3000]', localized; - localized = arrayToRegAlternates(loc.timeMarkers); - if (localized) { - markers += '| (?:' + localized + ') '; - } - markers = getRegNonCapturing(markers, loc.timeMarkerOptional); - return getRegNonCapturing(markers + '{time}{tzOffset}', true); - } - - initFormats(); - initDefinition(); - initArrayFields(); - - buildValueArray('month', 12); - buildValueArray('weekday', 7); - buildValueArray('unit', 8); - buildValueArray('ampm', 2); - - buildNumerals(); - buildTimeFormats(); - buildParsingTokens(); - buildTimeSuffixes(); - buildModifiers(); - - // The order of these formats is important. Order is reversed so formats - // that are initialized later will take precedence. Generally, this means - // that more specific formats should come later. - addCoreFormats(); - addLocaleFormats(); - - } - - }; - - return new Locale(def); - } - - - /*** - * @method [units]Since(d, [options]) - * @returns Number - * @short Returns the time since [d]. - * @extra [d] will accept a date object, timestamp, or string. If not specified, - * [d] is assumed to be now. `unitsAgo` is provided as an alias to make - * this more readable when [d] is assumed to be the current date. - * [options] can be an object or a locale code as a string. See `create` - * for more. - * - * @set - * millisecondsSince - * secondsSince - * minutesSince - * hoursSince - * daysSince - * weeksSince - * monthsSince - * yearsSince - * - * @example - * - * new Date().millisecondsSince('1 hour ago') -> 3,600,000 - * new Date().daysSince('1 week ago') -> 7 - * new Date().yearsSince('15 years ago') -> 15 - * lastYear.yearsAgo() -> 1 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [units]Ago() - * @returns Number - * @short Returns the time ago in the appropriate unit. - * - * @set - * millisecondsAgo - * secondsAgo - * minutesAgo - * hoursAgo - * daysAgo - * weeksAgo - * monthsAgo - * yearsAgo - * - * @example - * - * lastYear.millisecondsAgo() -> 3,600,000 - * lastYear.daysAgo() -> 7 - * lastYear.yearsAgo() -> 15 - * - *** - * @method [units]Until([d], [options]) - * @returns Number - * @short Returns the time until [d]. - * @extra [d] will accept a date object, timestamp, or string. If not specified, - * [d] is assumed to be now. `unitsFromNow` is provided as an alias to - * make this more readable when [d] is assumed to be the current date. - * [options] can be an object or a locale code as a string. See `create` - * for more. - * - * - * @set - * millisecondsUntil - * secondsUntil - * minutesUntil - * hoursUntil - * daysUntil - * weeksUntil - * monthsUntil - * yearsUntil - * - * @example - * - * new Date().millisecondsUntil('1 hour from now') -> 3,600,000 - * new Date().daysUntil('1 week from now') -> 7 - * new Date().yearsUntil('15 years from now') -> 15 - * nextYear.yearsFromNow() -> 1 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [units]FromNow() - * @returns Number - * @short Returns the time from now in the appropriate unit. - * - * @set - * millisecondsFromNow - * secondsFromNow - * minutesFromNow - * hoursFromNow - * daysFromNow - * weeksFromNow - * monthsFromNow - * yearsFromNow - * - * @example - * - * nextYear.millisecondsFromNow() -> 3,600,000 - * nextYear.daysFromNow() -> 7 - * nextYear.yearsFromNow() -> 15 - * - *** - * @method add[Units](n, [reset] = false) - * @returns Date - * @short Adds `n` units to the date. If [reset] is true, all lower units will - * be reset. - * @extra This method modifies the date! Note that in the case of `addMonths`, - * the date may fall on a date that doesn't exist (i.e. February 30). In - * this case the date will be shifted to the last day of the month. Don't - * use `addMonths` if you need precision. - * - * @set - * addMilliseconds - * addSeconds - * addMinutes - * addHours - * addDays - * addWeeks - * addMonths - * addYears - * - * @example - * - * new Date().addYears(5) -> current time + 5 years - * new Date().addDays(5) -> current time + 5 days - * new Date().addDays(5, true) -> current time + 5 days (time reset) - * - * @param {number} n - * @param {boolean} [reset] - * - *** - * @method isLast[Unit]([localeCode]) - * @returns Boolean - * @short Returns true if the date is last week, month, or year. - * @extra This method takes an optional locale code for `isLastWeek`, which is - * locale dependent. The default locale code is `en`, which places - * Sunday at the beginning of the week. You can pass `en-GB` as a quick - * way to force Monday as the beginning of the week. - * - * @set - * isLastWeek - * isLastMonth - * isLastYear - * - * @example - * - * yesterday.isLastWeek() -> true or false? - * yesterday.isLastMonth() -> probably not... - * yesterday.isLastYear() -> even less likely... - * - * @param {string} [localeCode] - * - *** - * @method isThis[Unit]([localeCode]) - * @returns Boolean - * @short Returns true if the date is this week, month, or year. - * @extra This method takes an optional locale code for `isThisWeek`, which is - * locale dependent. The default locale code is `en`, which places - * Sunday at the beginning of the week. You can pass `en-GB` as a quick - * way to force Monday as the beginning of the week. - * - * @set - * isThisWeek - * isThisMonth - * isThisYear - * - * @example - * - * tomorrow.isThisWeek() -> true or false? - * tomorrow.isThisMonth() -> probably... - * tomorrow.isThisYear() -> signs point to yes... - * - * @param {string} [localeCode] - * - *** - * @method isNext[Unit]([localeCode]) - * @returns Boolean - * @short Returns true if the date is next week, month, or year. - * @extra This method takes an optional locale code for `isNextWeek`, which is - * locale dependent. The default locale code is `en`, which places - * Sunday at the beginning of the week. You can pass `en-GB` as a quick - * way to force Monday as the beginning of the week. - * - * @set - * isNextWeek - * isNextMonth - * isNextYear - * - * @example - * - * tomorrow.isNextWeek() -> true or false? - * tomorrow.isNextMonth() -> probably not... - * tomorrow.isNextYear() -> even less likely... - * - * @param {string} [localeCode] - * - *** - * @method beginningOf[Unit]([localeCode]) - * @returns Date - * @short Sets the date to the beginning of the appropriate unit. - * @extra This method modifies the date! A locale code can be passed for - * `beginningOfWeek`, which is locale dependent. If consistency is - * needed, use `beginningOfISOWeek` instead. - * - * @set - * beginningOfDay - * beginningOfWeek - * beginningOfMonth - * beginningOfYear - * - * @example - * - * new Date().beginningOfDay() -> the beginning of today (resets the time) - * new Date().beginningOfWeek() -> the beginning of the week - * new Date().beginningOfMonth() -> the beginning of the month - * new Date().beginningOfYear() -> the beginning of the year - * - * @param {string} [localeCode] - * - *** - * @method endOf[Unit]([localeCode]) - * @returns Date - * @short Sets the date to the end of the appropriate unit. - * @extra This method modifies the date! A locale code can be passed for - * `endOfWeek`, which is locale dependent. If consistency is needed, use - * `endOfISOWeek` instead. - * - * @set - * endOfDay - * endOfWeek - * endOfMonth - * endOfYear - * - * @example - * - * new Date().endOfDay() -> the end of today (sets the time to 23:59:59.999) - * new Date().endOfWeek() -> the end of the week - * new Date().endOfMonth() -> the end of the month - * new Date().endOfYear() -> the end of the year - * - * @param {string} [localeCode] - * - ***/ - function buildDateUnitMethods() { - - defineInstanceSimilar(sugarDate, DateUnits, function(methods, unit, index) { - var name = unit.name, caps = simpleCapitalize(name); - - if (index > DAY_INDEX) { - forEach(['Last','This','Next'], function(shift) { - methods['is' + shift + caps] = function(d, localeCode) { - return compareDate(d, shift + ' ' + name, 0, localeCode, { locale: 'en' }); - }; - }); - } - if (index > HOURS_INDEX) { - methods['beginningOf' + caps] = function(d, localeCode) { - return moveToBeginningOfUnit(d, index, localeCode); - }; - methods['endOf' + caps] = function(d, localeCode) { - return moveToEndOfUnit(d, index, localeCode); - }; - } - - methods['add' + caps + 's'] = function(d, num, reset) { - return advanceDate(d, name, num, reset); - }; - - var since = function(date, d, options) { - return getTimeDistanceForUnit(date, createDate(d, options, true), unit); - }; - var until = function(date, d, options) { - return getTimeDistanceForUnit(createDate(d, options, true), date, unit); - }; - - methods[name + 'sAgo'] = methods[name + 'sUntil'] = until; - methods[name + 'sSince'] = methods[name + 'sFromNow'] = since; - - }); - - } - - /*** - * @method is[Day]() - * @returns Boolean - * @short Returns true if the date falls on the specified day. - * - * @set - * isToday - * isYesterday - * isTomorrow - * isWeekday - * isWeekend - * isSunday - * isMonday - * isTuesday - * isWednesday - * isThursday - * isFriday - * isSaturday - * - * @example - * - * tomorrow.isToday() -> false - * thursday.isTomorrow() -> ? - * yesterday.isWednesday() -> ? - * today.isWeekend() -> ? - * - *** - * @method isFuture() - * @returns Boolean - * @short Returns true if the date is in the future. - * - * @example - * - * lastWeek.isFuture() -> false - * nextWeek.isFuture() -> true - * - *** - * @method isPast() - * @returns Boolean - * @short Returns true if the date is in the past. - * - * @example - * - * lastWeek.isPast() -> true - * nextWeek.isPast() -> false - * - ***/ - function buildRelativeAliases() { - var special = spaceSplit('Today Yesterday Tomorrow Weekday Weekend Future Past'); - var weekdays = English.weekdays.slice(0, 7); - var months = English.months.slice(0, 12); - var together = special.concat(weekdays).concat(months); - defineInstanceSimilar(sugarDate, together, function(methods, name) { - methods['is'+ name] = function(d) { - return fullCompareDate(d, name); - }; - }); - } - - defineStatic(sugarDate, { - - /*** - * @method create(d, [options]) - * @returns Date - * @static - * @short Alternate date constructor which accepts text formats, a timestamp, - * objects, or another date. - * @extra If no argument is given, the date is assumed to be now. The second - * argument can either be an options object or a locale code as a - * shortcut. For more, see `date parsing`. - * - * @options - * - * locale A locale code to parse the date in. This can also be passed as - * the second argument to this method. Default is the current - * locale, which is `en` if none is set. - * - * past If `true`, ambiguous dates like `Sunday` will be parsed as - * `last Sunday`. Note that non-ambiguous dates are not - * guaranteed to be in the past. - * Default is `false`. - * - * future If `true`, ambiguous dates like `Sunday` will be parsed as - * `next Sunday`. Note that non-ambiguous dates are not - * guaranteed to be in the future. - * Default is `false`. - * - * fromUTC If `true`, dates with no timezone notation will be parsed as - * UTC (no timezone offset). This is useful for server - * timestamps, etc. Note that this flag is not required if the - * timezone is specified in the string, either as an explicit - * value (ex. +0900 or -09:00) or "Z", which is UTC time. - * - * setUTC If `true`, this will set a flag on the date that tells Sugar - * to internally use UTC methods like `getUTCHours` when handling - * it. This flag is the same as calling the `setUTC` method on - * the date after parsing is complete. Note that this is - * different from `fromUTC`, which parses a string as UTC, but - * does not set this flag. - * - * clone If `true` and `d` is a date, it will be cloned. - * - * params An optional object that is populated with properties that are - * parsed from string input. This option is useful when parsed - * properties need to be retained. - * - * @example - * - * Date.create('July') -> July of this year - * Date.create('1776') -> 1776 - * Date.create('today') -> today - * Date.create('Wednesday') -> This wednesday - * Date.create('next Friday') -> Next friday - * Date.create('July 4, 1776') -> July 4, 1776 - * Date.create(-446806800000) -> November 5, 1955 - * Date.create('1776年07月04日', 'ja') -> July 4, 1776 - * Date.create('August', {past: true}) -> August of this or last year - * Date.create('August', {future: true}) -> August of this or next year - * Date.create('Thursday', {fromUTC: true}) -> Thursday at 12:00am UTC time - * - * @param {string|number|Date} d - * @param {DateCreateOptions} [options] - * - * @option {string} [locale] - * @option {boolean} [past] - * @option {boolean} [future] - * @option {boolean} [fromUTC] - * @option {boolean} [setUTC] - * @option {boolean} [clone] - * @option {Object} [params] - * - ***/ - 'create': function(d, options) { - return createDate(d, options); - }, - - /*** - * @method getLocale([localeCode] = current) - * @returns Locale - * @static - * @short Gets the locale object for the given code, or the current locale. - * @extra The locale object has various properties that dictate how dates are - * parsed and formatted for that locale. The locale object is exposed - * here mostly for introspection - it should be uncommon to need to - * maniplate the object itself. For more, see `date locales`. - * - * @example - * - * Date.getLocale() -> Returns the current locale - * Date.getLocale('en') -> Returns the EN locale - * - * @param {string} [localeCode] - * - ***/ - 'getLocale': function(code) { - return localeManager.get(code, !code); - }, - - /*** - * @method getAllLocales() - * @returns Array - * @static - * @short Returns all available locales as an object. - * @extra For more, see `date locales`. - * @example - * - * Date.getAllLocales() - * - ***/ - 'getAllLocales': function() { - return localeManager.getAll(); - }, - - /*** - * @method getAllLocaleCodes() - * @returns string[] - * @static - * @short Returns all available locale codes as an array of strings. - * @extra For more, see `date locales`. - * @example - * - * Date.getAllLocaleCodes() - * - ***/ - 'getAllLocaleCodes': function() { - return getKeys(localeManager.getAll()); - }, - - /*** - * @method setLocale(localeCode) - * @returns Locale - * @static - * @short Sets the current locale to be used with dates. - * @extra Sugar has native support for 17 major locales. In addition, you can - * define a new locale with `addLocale`. For more, see `date locales`. - * @example - * - * Date.setLocale('en') - * - * @param {string} localeCode - * - ***/ - 'setLocale': function(code) { - return localeManager.set(code); - }, - - /*** - * @method addLocale(localeCode, def) - * @returns Locale - * @static - * @short Adds a locale definition to the locales understood by Sugar. - * @extra This method should only be required for adding locale definitions - * that don't already exist. For more, see `date locales`. - * @example - * - * Date.addLocale('eo', {}) - * - * @param {string} localeCode - * @param {Object} def - * - ***/ - 'addLocale': function(code, set) { - return localeManager.add(code, set); - }, - - /*** - * @method removeLocale(localeCode) - * @returns Locale - * @static - * @short Deletes the the locale by `localeCode` from Sugar's known locales. - * @extra For more, see `date locales`. - * @example - * - * Date.removeLocale('foo') - * - * @param {string} localeCode - * - ***/ - 'removeLocale': function(code) { - return localeManager.remove(code); - } - - }); - - defineInstanceWithArguments(sugarDate, { - - /*** - * @method set(set, [reset] = false) - * @returns Date - * @short Sets the date object. - * @extra This method accepts multiple formats including a single number as - * a timestamp, an object, or enumerated arguments. If [reset] is - * `true`, any units more specific than those passed will be reset. - * - * @example - * - * new Date().set({year:2011,month:11,day:31}) -> December 31, 2011 - * new Date().set(2011, 11, 31) -> December 31, 2011 - * new Date().set(86400000) -> 1 day after Jan 1, 1970 - * new Date().set({year:2004,month:6}, true) -> June 1, 2004, 00:00:00.000 - * - * @signature set(milliseconds) - * @signature set(year, month, [day], [hour], [minute], [second], [millliseconds]) - * @param {Object} set - * @param {boolean} [reset] - * @param {number} year - * @param {number} month - * @param {number} [day] - * @param {number} [hour] - * @param {number} [minute] - * @param {number} [second] - * @param {number} [milliseconds] - * - ***/ - 'set': function(d, args) { - args = collectUpdateDateArguments(args); - return updateDate(d, args[0], args[1]); - }, - - /*** - * @method advance(set, [reset] = false) - * @returns Date - * @short Shifts the date forward. - * @extra `set` accepts multiple formats including an object, a string in the - * format "3 days", a single number as milliseconds, or enumerated - * parameters (as with the Date constructor). If [reset] is `true`, any - * units more specific than those passed will be reset. This method - * modifies the date! - * - * @example - * - * new Date().advance({ year: 2 }) -> 2 years in the future - * new Date().advance('2 hours') -> 2 hours in the future - * new Date().advance(0, 2, 3) -> 2 months 3 days in the future - * new Date().advance(86400000) -> 1 day in the future - * - * @signature advance(milliseconds) - * @signature advance(year, month, [day], [hour], [minute], [second], [millliseconds]) - * @param {string|Object} set - * @param {boolean} [reset] - * @param {number} year - * @param {number} month - * @param {number} [day] - * @param {number} [hour] - * @param {number} [minute] - * @param {number} [second] - * @param {number} [milliseconds] - * - ***/ - 'advance': function(d, args) { - return advanceDateWithArgs(d, args, 1); - }, - - /*** - * @method rewind(set, [reset] = false) - * @returns Date - * @short Shifts the date backward. - * @extra [set] accepts multiple formats including an object, a string in the - * format "3 days", a single number as milliseconds, or enumerated - * parameters (as with the Date constructor). If [reset] is `true`, any - * units more specific than those passed will be reset. This method - * modifies the date! - * - * @example - * - * new Date().rewind({ year: 2 }) -> 2 years in the past - * new Date().rewind('2 weeks') -> 2 weeks in the past - * new Date().rewind(0, 2, 3) -> 2 months 3 days in the past - * new Date().rewind(86400000) -> 1 day in the past - * - * @signature advance(milliseconds) - * @signature advance(year, month, [day], [hour], [minute], [second], [millliseconds]) - * @param {string|Object} set - * @param {boolean} [reset] - * @param {number} year - * @param {number} month - * @param {number} [day] - * @param {number} [hour] - * @param {number} [minute] - * @param {number} [second] - * @param {number} [milliseconds] - * - ***/ - 'rewind': function(d, args) { - return advanceDateWithArgs(d, args, -1); - } - - }); - - defineInstance(sugarDate, { - - /*** - * @method get(d, [options]) - * @returns Date - * @short Gets a new date using the current one as a starting point. - * @extra This method is identical to `Date.create`, except that relative - * formats like `next month` are relative to the date instance rather - * than the current date. Accepts a locale code as a string in place - * of [options]. See `create` for more. - * - * @example - * - * nextYear.get('monday') -> monday of the week exactly 1 year from now - * millenium.get('2 years before') -> 2 years before Jan 1, 2000. - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - ***/ - 'get': function(date, d, options) { - return createDateWithContext(date, d, options); - }, - - /*** - * @method setWeekday(dow) - * @short Sets the weekday of the date, starting with Sunday at `0`. - * @extra This method modifies the date! - * - * @example - * - * d = new Date(); d.setWeekday(1); d; -> Monday of this week - * d = new Date(); d.setWeekday(6); d; -> Saturday of this week - * - * @param {number} dow - * - ***/ - 'setWeekday': function(date, dow) { - return setWeekday(date, dow); - }, - - /*** - * @method setISOWeek(num) - * @short Sets the week (of the year) as defined by the ISO8601 standard. - * @extra Note that this standard places Sunday at the end of the week (day 7). - * This method modifies the date! - * - * @example - * - * d = new Date(); d.setISOWeek(15); d; -> 15th week of the year - * - * @param {number} num - * - ***/ - 'setISOWeek': function(date, num) { - return setISOWeekNumber(date, num); - }, - - /*** - * @method getISOWeek() - * @returns Number - * @short Gets the date's week (of the year) as defined by the ISO8601 standard. - * @extra Note that this standard places Sunday at the end of the week (day 7). - * If `utc` is set on the date, the week will be according to UTC time. - * - * @example - * - * new Date().getISOWeek() -> today's week of the year - * - ***/ - 'getISOWeek': function(date) { - return getWeekNumber(date, true); - }, - - /*** - * @method beginningOfISOWeek() - * @returns Date - * @short Set the date to the beginning of week as defined by ISO8601. - * @extra Note that this standard places Monday at the start of the week. - * This method modifies the date! - * - * @example - * - * new Date().beginningOfISOWeek() -> Monday - * - ***/ - 'beginningOfISOWeek': function(date) { - var day = getWeekday(date); - if (day === 0) { - day = -6; - } else if (day !== 1) { - day = 1; - } - setWeekday(date, day); - return resetTime(date); - }, - - /*** - * @method endOfISOWeek() - * @returns Date - * @short Set the date to the end of week as defined by this ISO8601 standard. - * @extra Note that this standard places Sunday at the end of the week. - * This method modifies the date! - * - * @example - * - * new Date().endOfISOWeek() -> Sunday - * - ***/ - 'endOfISOWeek': function(date) { - if (getWeekday(date) !== 0) { - setWeekday(date, 7); - } - return moveToEndOfUnit(date, DAY_INDEX); - }, - - /*** - * @method getUTCOffset([iso] = false) - * @returns String - * @short Returns a string representation of the offset from UTC time. If [iso] - * is true the offset will be in ISO8601 format. - * - * @example - * - * new Date().getUTCOffset() -> "+0900" - * new Date().getUTCOffset(true) -> "+09:00" - * - * @param {boolean} iso - * - ***/ - 'getUTCOffset': function(date, iso) { - return getUTCOffset(date, iso); - }, - - /*** - * @method setUTC([on] = false) - * @returns Date - * @short Controls a flag on the date that tells Sugar to internally use UTC - * methods like `getUTCHours`. - * @extra This flag is most commonly used for output in UTC time with the - * `format` method. Note that this flag only governs which native - * methods are called internally – date native methods like `setHours` - * will still return local non-UTC values. Also note that other date - * operations such as comparison and subtraction still work as normal. - * This effectively makes it not meaningful to use date comparison - * methods like `isBefore` or difference methods like `hoursBefore` - * unless these flags are both the same, as the date is not actually - * in UTC time. If such a usage is required, the timezone offset should - * instead be manually subtracted. This method will modify the date! - * - * @example - * - * new Date().setUTC(true).long() -> formatted with UTC methods - * new Date().setUTC(false).long() -> formatted without UTC methods - * - * @param {boolean} on - * - ***/ - 'setUTC': function(date, on) { - return _utc(date, on); - }, - - /*** - * @method isUTC() - * @returns Boolean - * @short Returns true if the date has no timezone offset. - * @extra This will also return true for dates whose internal utc flag is set - * with `setUTC`. Even if the utc flag is set, `getTimezoneOffset` - * will always report the same thing as Javascript always reports that - * based on the environment's locale. - * - * @example - * - * new Date().isUTC() -> true or false (depends on the local offset) - * new Date().setUTC(true).isUTC() -> true - * - ***/ - 'isUTC': function(date) { - return isUTC(date); - }, - - /*** - * @method isValid() - * @returns Boolean - * @short Returns true if the date is valid. - * - * @example - * - * new Date().isValid() -> true - * new Date('flexor').isValid() -> false - * - ***/ - 'isValid': function(date) { - return dateIsValid(date); - }, - - /*** - * @method isAfter(d, [margin] = 0) - * @returns Boolean - * @short Returns true if the date is after `d`. - * @extra [margin] is to allow extra margin of error in ms. `d` will accept - * a date object, timestamp, or string. If not specified, `d` is - * assumed to be now. See `create` for formats. - * - * @example - * - * today.isAfter('tomorrow') -> false - * today.isAfter('yesterday') -> true - * - * @param {string|number|Date} d - * @param {number} [margin] - * - ***/ - 'isAfter': function(date, d, margin) { - return date.getTime() > createDate(d).getTime() - (margin || 0); - }, - - /*** - * @method isBefore(d, [margin] = 0) - * @returns Boolean - * @short Returns true if the date is before `d`. - * @extra [margin] is to allow extra margin of error in ms. `d` will accept - * a date object, timestamp, or text format. If not specified, `d` is - * assumed to be now. See `create` for formats. - * - * @example - * - * today.isBefore('tomorrow') -> true - * today.isBefore('yesterday') -> false - * - * @param {string|number|Date} d - * @param {number} [margin] - * - ***/ - 'isBefore': function(date, d, margin) { - return date.getTime() < createDate(d).getTime() + (margin || 0); - }, - - /*** - * @method isBetween(d1, d2, [margin] = 0) - * @returns Boolean - * @short Returns true if the date is later or equal to `d1` and before or - * equal to `d2`. - * @extra [margin] is to allow extra margin of error in ms. `d1` and `d2` will - * accept a date object, timestamp, or text format. If not specified, - * they are assumed to be now. See `create` for formats. - * - * @example - * - * new Date().isBetween('yesterday', 'tomorrow') -> true - * new Date().isBetween('last year', '2 years ago') -> false - * - * @param {string|number|Date} d1 - * @param {string|number|Date} d2 - * @param {number} [margin] - * - ***/ - 'isBetween': function(date, d1, d2, margin) { - var t = date.getTime(); - var t1 = createDate(d1).getTime(); - var t2 = createDate(d2).getTime(); - var lo = min(t1, t2); - var hi = max(t1, t2); - margin = margin || 0; - return (lo - margin <= t) && (hi + margin >= t); - }, - - /*** - * @method isLeapYear() - * @returns Boolean - * @short Returns true if the date is a leap year. - * - * @example - * - * millenium.isLeapYear() -> true - * - ***/ - 'isLeapYear': function(date) { - var year = getYear(date); - return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); - }, - - /*** - * @method daysInMonth() - * @returns Number - * @short Returns the number of days in the date's month. - * - * @example - * - * may.daysInMonth() -> 31 - * feb.daysInMonth() -> 28 or 29 - * - ***/ - 'daysInMonth': function(date) { - return getDaysInMonth(date); - }, - - /*** - * @method format([f], [localeCode] = currentLocaleCode) - * @returns String - * @short Returns the date as a string using the format `f`. - * @extra `f` is a string that contains tokens in either LDML format using - * curly braces, or "strftime" format using a percent sign. If `f` is - * not specified, the locale specific `{long}` format is used. [localeCode] - * is a locale code to use (if not specified the current locale is - * used). For more, see `date formatting`. - * - * @example - * - * new Date().format() -> ex. February 13, 2012 11:21 AM - * new Date().format('{Weekday} {d} {Month}') -> ex. Monday July 4 - * new Date().format('{hh}:{mm}') -> ex. 15:57 - * new Date().format('%H:%M') -> ex. 15:57 - * new Date().format('{12hr}:{mm}{tt}') -> ex. 3:57pm - * new Date().format('ISO8601') -> ex. 2011-07-05 12:24:55.528Z - * new Date().format('{Weekday}', 'ja') -> ex. 先週 - * - * @param {string} f - * @param {string} [localeCode] - * - *** - * @method short([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the short format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().short() -> ex. 02/13/2016 - * new Date().short('fi') -> ex. 13.2.2016 - * - * @param {string} [localeCode] - * - *** - * @method medium([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the medium format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().medium() -> ex. February 13, 2016 - * new Date().medium('ja') -> ex. 2016年2月13日 - * - * @param {string} [localeCode] - * - *** - * @method long([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the long format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().long() -> ex. February 13, 2016 6:22 PM - * new Date().long('es') -> ex. 13 de febrero de 2016 18:22 - * - * @param {string} [localeCode] - * - *** - * @method full([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the full format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().full() -> ex. Saturday, February 13, 2016 6:23 PM - * new Date().full('ru') -> ex. суббота, 13 февраля 2016 г., 18:23 - * - * @param {string} [localeCode] - * - ***/ - 'format': function(date, f, localeCode) { - return dateFormat(date, f, localeCode); - }, - - /*** - * @method relative([localeCode] = currentLocaleCode, [relativeFn]) - * @returns String - * @short Returns the date in a text format relative to the current time, - * such as "5 minutes ago". - * @extra [relativeFn] is a function that can be passed to provide more granular - * control over the resulting string. Its return value will be passed - * to `format`. If nothing is returned, the relative format will be - * used. [relativeFn] can be passed as the first argument in place of - * [locale]. For more about formats, see `date formatting`. - * - * @callback relativeFn - * - * num The offset number in `unit`. - * unit A numeric representation of the unit that `num` is in, starting at - * 0 for ms. - * ms The absolute offset in milliseconds. - * loc The locale object, either specified by [locale] or default. - * - * @example - * - * hourAgo.relative() -> 1 hour ago - * jan.relative() -> ex. 5 months ago - * jan.relative('ja') -> 3ヶ月前 - * jan.relative(function(num, unit, ms, loc) { - * // Return an absolute date for anything over 6 months. - * if(unit == 6 && num > 6 || unit > 6) { - * return '{Month} {d}, {yyyy}'; - * } - * }); -> ex. 5 months ago - * - * @signature relative([relativeFn]) - * @param {string} [localeCode] - * @param {relativeFn} [relativeFn] - * @callbackParam {number} num - * @callbackParam {number} unit - * @callbackParam {number} ms - * @callbackParam {Locale} loc - * @callbackReturns {string} relativeFn - * - ***/ - 'relative': function(date, localeCode, relativeFn) { - return dateRelative(date, null, localeCode, relativeFn); - }, - - /*** - * @method relativeTo(d, [localeCode] = currentLocaleCode) - * @returns String - * @short Returns the date in a text format relative to `d`, such as - * "5 minutes". - * @extra `d` will accept a date object, timestamp, or string. [localeCode] - * applies to the method output, not `d`. - * - * @example - * - * jan.relativeTo(jul) -> 5 months - * yesterday.relativeTo('today', 'ja') -> 一日 - * - * @param {string|number|Date} d - * @param {string} localeCode - * - * - ***/ - 'relativeTo': function(date, d, localeCode) { - return dateRelative(date, createDate(d), localeCode); - }, - - /*** - * @method is(d, [margin] = 0) - * @returns Boolean - * @short Returns true if the date matches `d`. - * @extra `d` will accept a date object, timestamp, or text format. In the - * case of objects and text formats, `is` will additionally compare - * based on the precision implied in the input. In the case of text - * formats `d` will use the currently set locale. [margin] allows an - * extra margin of error in milliseconds. See `create` for formats. - * - * @example - * - * new Date().is('July') -> true or false? - * new Date().is('1776') -> false - * new Date().is('today') -> true - * new Date().is('weekday') -> true or false? - * new Date().is('July 4, 1776') -> false - * new Date().is(-6106093200000) -> false - * new Date().is(new Date(1776, 6, 4)) -> false - * - * @param {string|number|Date} d - * @param {number} [margin] - * - ***/ - 'is': function(date, d, margin) { - return fullCompareDate(date, d, margin); - }, - - /*** - * @method reset([unit] = 'day', [localeCode] = currentLocaleCode) - * @returns Date - * @short Resets the date to the beginning of [unit]. - * @extra This method effectively resets all smaller units, pushing the date - * to the beginning of [unit]. Default is `day`, which effectively - * resets the time. [localeCode] is provided for resetting weeks, which - * is locale dependent. This method modifies the date! - * - * @example - * - * new Date().reset('day') -> Beginning of the day - * new Date().reset('month') -> Beginning of the month - * - * @param {string} [unit] - * @param {string} [localeCode] - * - ***/ - 'reset': function(date, unit, localeCode) { - var unitIndex = unit ? getUnitIndexForParamName(unit) : DAY_INDEX; - moveToBeginningOfUnit(date, unitIndex, localeCode); - return date; - }, - - /*** - * @method clone() - * @returns Date - * @short Clones the date. - * @extra Note that the UTC flag will be preserved if set. This flag is - * set via the `setUTC` method or an option on `Date.create`. - * - * @example - * - * new Date().clone() -> Copy of now - * - ***/ - 'clone': function(date) { - return cloneDate(date); - }, - - /*** - * @method iso() - * @alias toISOString - * - ***/ - 'iso': function(date) { - return date.toISOString(); - }, - - /*** - * @method getWeekday() - * @returns Number - * @short Alias for `getDay`. - * - * @example - * - * new Date().getWeekday(); -> (ex.) 3 - * - ***/ - 'getWeekday': function(date) { - return getWeekday(date); - }, - - /*** - * @method getUTCWeekday() - * @returns Number - * @short Alias for `getUTCDay`. - * - * @example - * - * new Date().getUTCWeekday(); -> (ex.) 3 - * - ***/ - 'getUTCWeekday': function(date) { - return date.getUTCDay(); - } - - }); - - - /*** @namespace Number ***/ - - /*** - * @method [dateUnit]() - * @returns Number - * @short Takes the number as a unit of time and converts to milliseconds. - * @extra Method names can be singular or plural. Note that as "a month" is - * ambiguous as a unit of time, `months` will be equivalent to 30.4375 - * days, the average number in a month. Be careful using `months` if you - * need exact precision. - * - * @set - * millisecond - * milliseconds - * second - * seconds - * minute - * minutes - * hour - * hours - * day - * days - * week - * weeks - * month - * months - * year - * years - * - * @example - * - * (5).milliseconds() -> 5 - * (10).hours() -> 36000000 - * (1).day() -> 86400000 - * - *** - * @method [dateUnit]Before(d, [options]) - * @returns Date - * @short Returns a date that is `n` units before [d], where `n` is the number. - * @extra [d] will accept a date object, timestamp, or text format. Note that - * "months" is ambiguous as a unit of time. If the target date falls on a - * day that does not exist (i.e. August 31 -> February 31), the date will - * be shifted to the last day of the month. Be careful using - * `monthsBefore` if you need exact precision. [options] can be an object - * or a locale code as a string. See `create` for more. - * - * - * @set - * millisecondBefore - * millisecondsBefore - * secondBefore - * secondsBefore - * minuteBefore - * minutesBefore - * hourBefore - * hoursBefore - * dayBefore - * daysBefore - * weekBefore - * weeksBefore - * monthBefore - * monthsBefore - * yearBefore - * yearsBefore - * - * @example - * - * (5).daysBefore('tuesday') -> 5 days before tuesday of this week - * (1).yearBefore('January 23, 1997') -> January 23, 1996 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [dateUnit]Ago() - * @returns Date - * @short Returns a date that is `n` units ago. - * @extra Note that "months" is ambiguous as a unit of time. If the target date - * falls on a day that does not exist (i.e. August 31 -> February 31), the - * date will be shifted to the last day of the month. Be careful using - * `monthsAgo` if you need exact precision. - * - * @set - * millisecondAgo - * millisecondsAgo - * secondAgo - * secondsAgo - * minuteAgo - * minutesAgo - * hourAgo - * hoursAgo - * dayAgo - * daysAgo - * weekAgo - * weeksAgo - * monthAgo - * monthsAgo - * yearAgo - * yearsAgo - * - * @example - * - * (5).weeksAgo() -> 5 weeks ago - * (1).yearAgo() -> January 23, 1996 - * - *** - * @method [dateUnit]After(d, [options]) - * @returns Date - * @short Returns a date `n` units after [d], where `n` is the number. - * @extra [d] will accept a date object, timestamp, or text format. Note that - * "months" is ambiguous as a unit of time. If the target date falls on a - * day that does not exist (i.e. August 31 -> February 31), the date will - * be shifted to the last day of the month. Be careful using - * `monthsAfter` if you need exact precision. [options] can be an object - * or a locale code as a string. See `create` for more. - * - * @set - * millisecondAfter - * millisecondsAfter - * secondAfter - * secondsAfter - * minuteAfter - * minutesAfter - * hourAfter - * hoursAfter - * dayAfter - * daysAfter - * weekAfter - * weeksAfter - * monthAfter - * monthsAfter - * yearAfter - * yearsAfter - * - * @example - * - * (5).daysAfter('tuesday') -> 5 days after tuesday of this week - * (1).yearAfter('January 23, 1997') -> January 23, 1998 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [dateUnit]FromNow() - * @returns Date - * @short Returns a date `n` units from now. - * @extra Note that "months" is ambiguous as a unit of time. If the target date - * falls on a day that does not exist (i.e. August 31 -> February 31), the - * date will be shifted to the last day of the month. Be careful using - * `monthsFromNow` if you need exact precision. - * - * @set - * millisecondFromNow - * millisecondsFromNow - * secondFromNow - * secondsFromNow - * minuteFromNow - * minutesFromNow - * hourFromNow - * hoursFromNow - * dayFromNow - * daysFromNow - * weekFromNow - * weeksFromNow - * monthFromNow - * monthsFromNow - * yearFromNow - * yearsFromNow - * - * @example - * - * (5).weeksFromNow() -> 5 weeks ago - * (1).yearFromNow() -> January 23, 1998 - * - ***/ - function buildNumberUnitMethods() { - defineInstanceSimilar(sugarNumber, DateUnits, function(methods, unit) { - var name = unit.name, base, after, before; - base = function(n) { - return round(n * unit.multiplier); - }; - after = function(n, d, options) { - return advanceDate(createDate(d, options, true), name, n); - }; - before = function(n, d, options) { - return advanceDate(createDate(d, options, true), name, -n); - }; - methods[name] = base; - methods[name + 's'] = base; - methods[name + 'Before'] = before; - methods[name + 'sBefore'] = before; - methods[name + 'Ago'] = before; - methods[name + 'sAgo'] = before; - methods[name + 'After'] = after; - methods[name + 'sAfter'] = after; - methods[name + 'FromNow'] = after; - methods[name + 'sFromNow'] = after; - }); - } - - defineInstance(sugarNumber, { - - /*** - * @method duration([localeCode] = currentLocaleCode) - * @returns String - * @short Takes the number as milliseconds and returns a localized string. - * @extra This method is the same as `Date#relative` without the localized - * equivalent of "from now" or "ago". [localeCode] can be passed as the - * first (and only) parameter. Note that this method is only available - * when the dates module is included. - * - * @example - * - * (500).duration() -> '500 milliseconds' - * (1200).duration() -> '1 second' - * (75).minutes().duration() -> '1 hour' - * (75).minutes().duration('es') -> '1 hora' - * - * @param {string} [localeCode] - * - ***/ - 'duration': function(n, localeCode) { - return localeManager.get(localeCode).getDuration(n); - } - - }); - - - var EnglishLocaleBaseDefinition = { - 'code': 'en', - 'plural': true, - 'timeMarkers': 'at', - 'ampm': 'AM|A.M.|a,PM|P.M.|p', - 'units': 'millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s', - 'months': 'Jan:uary|,Feb:ruary|,Mar:ch|,Apr:il|,May,Jun:e|,Jul:y|,Aug:ust|,Sep:tember|t|,Oct:ober|,Nov:ember|,Dec:ember|', - 'weekdays': 'Sun:day|,Mon:day|,Tue:sday|,Wed:nesday|,Thu:rsday|,Fri:day|,Sat:urday|+weekend', - 'numerals': 'zero,one|first,two|second,three|third,four:|th,five|fifth,six:|th,seven:|th,eight:|h,nin:e|th,ten:|th', - 'articles': 'a,an,the', - 'tokens': 'the,st|nd|rd|th,of|in,a|an,on', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{num} {unit} {sign}', - 'duration': '{num} {unit}', - 'modifiers': [ - { 'name': 'half', 'src': 'half', 'value': .5 }, - { 'name': 'midday', 'src': 'noon', 'value': 12 }, - { 'name': 'midday', 'src': 'midnight', 'value': 24 }, - { 'name': 'day', 'src': 'yesterday', 'value': -1 }, - { 'name': 'day', 'src': 'today|tonight', 'value': 0 }, - { 'name': 'day', 'src': 'tomorrow', 'value': 1 }, - { 'name': 'sign', 'src': 'ago|before', 'value': -1 }, - { 'name': 'sign', 'src': 'from now|after|from|in|later', 'value': 1 }, - { 'name': 'edge', 'src': 'first day|first|beginning', 'value': -2 }, - { 'name': 'edge', 'src': 'last day', 'value': 1 }, - { 'name': 'edge', 'src': 'end|last', 'value': 2 }, - { 'name': 'shift', 'src': 'last', 'value': -1 }, - { 'name': 'shift', 'src': 'the|this', 'value': 0 }, - { 'name': 'shift', 'src': 'next', 'value': 1 } - ], - 'parse': [ - '(?:just)? now', - '{shift} {unit:5-7}', - '{months?} {year}', - '{midday} {4?} {day|weekday}', - '{months},?[-.\\/\\s]?{year?}', - '{edge} of (?:day)? {day|weekday}', - '{0} {num}{1?} {weekday} {2} {months},? {year?}', - '{shift?} {day?} {weekday?} (?:at)? {midday}', - '{sign?} {3?} {half} {3?} {unit:3-4|unit:7} {sign?}', - '{0?} {edge} {weekday?} {2} {shift?} {unit:4-7?} {months?},? {year?}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift} {unit:5?} {weekday}', - '{0?} {date}{1?} {2?} {months?}', - '{weekday} {2?} {shift} {unit:5}', - '{0?} {num} {2?} {months}\\.?,? {year?}', - '{num?} {unit:4-5} {sign} {day|weekday}', - '{0|months} {date?}{1?} of {shift} {unit:6-7}', - '{0?} {num}{1?} {weekday} of {shift} {unit:6}', - '{year?}[-.\\/\\s]?{months}[-.\\/\\s]{date}', - '{date}[-.\\/\\s]{months}(?:[-.\\/\\s]{year|yy})?', - '{weekday?}\\.?,? {months}\\.?,? {date}{1?},? {year?}', - '{weekday?}\\.?,? {date} {months} {year}' - ], - 'timeFrontParse': [ - '{sign} {num} {unit}', - '{num} {unit} {sign}', - '{4?} {day|weekday}' - ] - }; - - var AmericanEnglishDefinition = getEnglishVariant({ - 'mdy': true, - 'firstDayOfWeek': 0, - 'firstDayOfWeekYear': 1, - 'short': '{MM}/{dd}/{yyyy}', - 'medium': '{Month} {d}, {yyyy}', - 'long': '{Month} {d}, {yyyy} {time}', - 'full': '{Weekday}, {Month} {d}, {yyyy} {time}', - 'stamp': '{Dow} {Mon} {d} {yyyy} {time}', - 'time': '{h}:{mm} {TT}' - }); - - var BritishEnglishDefinition = getEnglishVariant({ - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} {Month} {yyyy}', - 'long': '{d} {Month} {yyyy} {H}:{mm}', - 'full': '{Weekday}, {d} {Month}, {yyyy} {time}', - 'stamp': '{Dow} {d} {Mon} {yyyy} {time}' - }); - - var CanadianEnglishDefinition = getEnglishVariant({ - 'short': '{yyyy}-{MM}-{dd}', - 'medium': '{d} {Month}, {yyyy}', - 'long': '{d} {Month}, {yyyy} {H}:{mm}', - 'full': '{Weekday}, {d} {Month}, {yyyy} {time}', - 'stamp': '{Dow} {d} {Mon} {yyyy} {time}' - }); - - var LazyLoadedLocales = { - 'en-US': AmericanEnglishDefinition, - 'en-GB': BritishEnglishDefinition, - 'en-AU': BritishEnglishDefinition, - 'en-CA': CanadianEnglishDefinition - }; - - buildLocales(); - buildDateFormatTokens(); - buildDateFormatMatcher(); - buildDateUnitMethods(); - buildNumberUnitMethods(); - buildRelativeAliases(); - setDateChainableConstructor(); - - /*** - * @module String - * @description String manupulation, encoding, truncation, and formatting, and more. - * - ***/ - - // Flag allowing native string methods to be enhanced. - var STRING_ENHANCEMENTS_FLAG = 'enhanceString'; - - // Matches non-punctuation characters except apostrophe for capitalization. - var CAPITALIZE_REG = /[^\u0000-\u0040\u005B-\u0060\u007B-\u007F]+('s)?/g; - - // Regex matching camelCase. - var CAMELIZE_REG = /(^|_)([^_]+)/g; - - // Regex matching any HTML entity. - var HTML_ENTITY_REG = /&#?(x)?([\w\d]{0,5});/gi; - - // Very basic HTML escaping regex. - var HTML_ESCAPE_REG = /[&<>]/g; - - // Special HTML entities. - var HTMLFromEntityMap = { - 'lt': '<', - 'gt': '>', - 'amp': '&', - 'nbsp': ' ', - 'quot': '"', - 'apos': "'" - }; - - var HTMLToEntityMap; - - // Words that should not be capitalized in titles - var DOWNCASED_WORDS = [ - 'and', 'or', 'nor', 'a', 'an', 'the', 'so', 'but', 'to', 'of', 'at', - 'by', 'from', 'into', 'on', 'onto', 'off', 'out', 'in', 'over', - 'with', 'for' - ]; - - // HTML tags that do not have inner content. - var HTML_VOID_ELEMENTS = [ - 'area','base','br','col','command','embed','hr','img', - 'input','keygen','link','meta','param','source','track','wbr' - ]; - - var LEFT_TRIM_REG = RegExp('^['+ TRIM_CHARS +']+'); - var RIGHT_TRIM_REG = RegExp('['+ TRIM_CHARS +']+$'); - var TRUNC_REG = RegExp('(?=[' + TRIM_CHARS + '])'); - - // Reference to native String#includes to enhance later. - var nativeIncludes = String.prototype.includes; - - // Base64 - var encodeBase64, decodeBase64; - - // Format matcher for String#format. - var stringFormatMatcher = createFormatMatcher(deepGetProperty); - - function padString(num, padding) { - return repeatString(isDefined(padding) ? padding : ' ', num); - } - - function truncateString(str, length, from, ellipsis, split) { - var str1, str2, len1, len2; - if (str.length <= length) { - return str.toString(); - } - ellipsis = isUndefined(ellipsis) ? '...' : ellipsis; - switch(from) { - case 'left': - str2 = split ? truncateOnWord(str, length, true) : str.slice(str.length - length); - return ellipsis + str2; - case 'middle': - len1 = ceil(length / 2); - len2 = floor(length / 2); - str1 = split ? truncateOnWord(str, len1) : str.slice(0, len1); - str2 = split ? truncateOnWord(str, len2, true) : str.slice(str.length - len2); - return str1 + ellipsis + str2; - default: - str1 = split ? truncateOnWord(str, length) : str.slice(0, length); - return str1 + ellipsis; - } - } - - function stringEach(str, search, fn) { - var chunks, chunk, reg, result = []; - if (isFunction(search)) { - fn = search; - reg = /[\s\S]/g; - } else if (!search) { - reg = /[\s\S]/g; - } else if (isString(search)) { - reg = RegExp(escapeRegExp(search), 'gi'); - } else if (isRegExp(search)) { - reg = RegExp(search.source, getRegExpFlags(search, 'g')); - } - // Getting the entire array of chunks up front as we need to - // pass this into the callback function as an argument. - chunks = runGlobalMatch(str, reg); - - if (chunks) { - for(var i = 0, len = chunks.length, r; i < len; i++) { - chunk = chunks[i]; - result[i] = chunk; - if (fn) { - r = fn.call(str, chunk, i, chunks); - if (r === false) { - break; - } else if (isDefined(r)) { - result[i] = r; - } - } - } - } - return result; - } - - // "match" in < IE9 has enumable properties that will confuse for..in - // loops, so ensure that the match is a normal array by manually running - // "exec". Note that this method is also slightly more performant. - function runGlobalMatch(str, reg) { - var result = [], match, lastLastIndex; - while ((match = reg.exec(str)) != null) { - if (reg.lastIndex === lastLastIndex) { - reg.lastIndex += 1; - } else { - result.push(match[0]); - } - lastLastIndex = reg.lastIndex; - } - return result; - } - - function eachWord(str, fn) { - return stringEach(trim(str), /\S+/g, fn); - } - - function stringCodes(str, fn) { - var codes = new Array(str.length), i, len; - for(i = 0, len = str.length; i < len; i++) { - var code = str.charCodeAt(i); - codes[i] = code; - if (fn) { - fn.call(str, code, i, str); - } - } - return codes; - } - - function stringUnderscore(str) { - var areg = Inflections.acronyms && Inflections.acronyms.reg; - // istanbul ignore if - if (areg) { - str = str.replace(areg, function(acronym, index) { - return (index > 0 ? '_' : '') + acronym.toLowerCase(); - }) - } - return str - .replace(/[-\s]+/g, '_') - .replace(/([A-Z\d]+)([A-Z][a-z])/g,'$1_$2') - .replace(/([a-z\d])([A-Z])/g,'$1_$2') - .toLowerCase(); - } - - function stringCamelize(str, upper) { - str = stringUnderscore(str); - return str.replace(CAMELIZE_REG, function(match, pre, word, index) { - var cap = upper !== false || index > 0, acronym; - acronym = getAcronym(word); - // istanbul ignore if - if (acronym && cap) { - return acronym; - } - return cap ? stringCapitalize(word, true) : word; - }); - } - - function stringSpacify(str) { - return stringUnderscore(str).replace(/_/g, ' '); - } - - function stringCapitalize(str, downcase, all) { - if (downcase) { - str = str.toLowerCase(); - } - return all ? str.replace(CAPITALIZE_REG, simpleCapitalize) : simpleCapitalize(str); - } - - function stringTitleize(str) { - var fullStopPunctuation = /[.:;!]$/, lastHadPunctuation; - str = runHumanRules(str); - str = stringSpacify(str); - return eachWord(str, function(word, index, words) { - word = getHumanWord(word) || word; - word = getAcronym(word) || word; - var hasPunctuation, isFirstOrLast; - var first = index == 0, last = index == words.length - 1; - hasPunctuation = fullStopPunctuation.test(word); - isFirstOrLast = first || last || hasPunctuation || lastHadPunctuation; - lastHadPunctuation = hasPunctuation; - if (isFirstOrLast || indexOf(DOWNCASED_WORDS, word) === -1) { - return stringCapitalize(word, false, true); - } else { - return word; - } - }).join(' '); - } - - function stringParameterize(str, separator) { - if (separator === undefined) separator = '-'; - str = str.replace(/[^a-z0-9\-_]+/gi, separator); - if (separator) { - var reg = RegExp('^{s}+|{s}+$|({s}){s}+'.split('{s}').join(escapeRegExp(separator)), 'g'); - str = str.replace(reg, '$1'); - } - return encodeURI(str.toLowerCase()); - } - - function reverseString(str) { - return str.split('').reverse().join(''); - } - - function truncateOnWord(str, limit, fromLeft) { - if (fromLeft) { - return reverseString(truncateOnWord(reverseString(str), limit)); - } - var words = str.split(TRUNC_REG); - var count = 0; - return filter(words, function(word) { - count += word.length; - return count <= limit; - }).join(''); - } - - function unescapeHTML(str) { - return str.replace(HTML_ENTITY_REG, function(full, hex, code) { - var special = HTMLFromEntityMap[code]; - return special || chr(hex ? parseInt(code, 16) : +code); - }); - } - - function tagIsVoid(tag) { - return indexOf(HTML_VOID_ELEMENTS, tag.toLowerCase()) !== -1; - } - - function stringReplaceAll(str, f, replace) { - var i = 0, tokens; - if (isString(f)) { - f = RegExp(escapeRegExp(f), 'g'); - } else if (f && !f.global) { - f = RegExp(f.source, getRegExpFlags(f, 'g')); - } - if (!replace) { - replace = ''; - } else { - tokens = replace; - replace = function() { - var t = tokens[i++]; - return t != null ? t : ''; - }; - } - return str.replace(f, replace); - } - - function replaceTags(str, find, replacement, strip) { - var tags = isString(find) ? [find] : find, reg, src; - tags = map(tags || [], function(t) { - return escapeRegExp(t); - }).join('|'); - src = tags.replace('all', '') || '[^\\s>]+'; - src = '<(\\/)?(' + src + ')(\\s+[^<>]*?)?\\s*(\\/)?>'; - reg = RegExp(src, 'gi'); - return runTagReplacements(str.toString(), reg, strip, replacement); - } - - function runTagReplacements(str, reg, strip, replacement, fullString) { - - var match; - var result = ''; - var currentIndex = 0; - var openTagName; - var openTagAttributes; - var openTagCount = 0; - - function processTag(index, tagName, attributes, tagLength, isVoid) { - var content = str.slice(currentIndex, index), s = '', r = ''; - if (isString(replacement)) { - r = replacement; - } else if (replacement) { - r = replacement.call(fullString, tagName, content, attributes, fullString) || ''; - } - if (strip) { - s = r; - } else { - content = r; - } - if (content) { - content = runTagReplacements(content, reg, strip, replacement, fullString); - } - result += s + content + (isVoid ? '' : s); - currentIndex = index + (tagLength || 0); - } - - fullString = fullString || str; - reg = RegExp(reg.source, 'gi'); - - while(match = reg.exec(str)) { - - var tagName = match[2]; - var attributes = (match[3]|| '').slice(1); - var isClosingTag = !!match[1]; - var isSelfClosing = !!match[4]; - var tagLength = match[0].length; - var isVoid = tagIsVoid(tagName); - var isOpeningTag = !isClosingTag && !isSelfClosing && !isVoid; - var isSameAsCurrent = tagName === openTagName; - - if (!openTagName) { - result += str.slice(currentIndex, match.index); - currentIndex = match.index; - } - - if (isOpeningTag) { - if (!openTagName) { - openTagName = tagName; - openTagAttributes = attributes; - openTagCount++; - currentIndex += tagLength; - } else if (isSameAsCurrent) { - openTagCount++; - } - } else if (isClosingTag && isSameAsCurrent) { - openTagCount--; - if (openTagCount === 0) { - processTag(match.index, openTagName, openTagAttributes, tagLength, isVoid); - openTagName = null; - openTagAttributes = null; - } - } else if (!openTagName) { - processTag(match.index, tagName, attributes, tagLength, isVoid); - } - } - if (openTagName) { - processTag(str.length, openTagName, openTagAttributes); - } - result += str.slice(currentIndex); - return result; - } - - function numberOrIndex(str, n, from) { - if (isString(n)) { - n = str.indexOf(n); - if (n === -1) { - n = from ? str.length : 0; - } - } - return n; - } - - function buildBase64() { - var encodeAscii, decodeAscii; - - // istanbul ignore next - function catchEncodingError(fn) { - return function(str) { - try { - return fn(str); - } catch(e) { - return ''; - } - }; - } - - // istanbul ignore if - if (typeof Buffer !== 'undefined') { - encodeBase64 = function(str) { - return Buffer.from(str).toString('base64'); - }; - decodeBase64 = function(str) { - return Buffer.from(str, 'base64').toString('utf8'); - }; - return; - } - - // istanbul ignore if - if (typeof btoa !== 'undefined') { - encodeAscii = catchEncodingError(btoa); - decodeAscii = catchEncodingError(atob); - } else { - var key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - var base64reg = /[^A-Za-z0-9\+\/\=]/g; - encodeAscii = function(str) { - var output = ''; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - do { - chr1 = str.charCodeAt(i++); - chr2 = str.charCodeAt(i++); - chr3 = str.charCodeAt(i++); - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - output += key.charAt(enc1); - output += key.charAt(enc2); - output += key.charAt(enc3); - output += key.charAt(enc4); - chr1 = chr2 = chr3 = ''; - enc1 = enc2 = enc3 = enc4 = ''; - } while (i < str.length); - return output; - }; - decodeAscii = function(input) { - var output = ''; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - if (input.match(base64reg)) { - return ''; - } - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); - do { - enc1 = key.indexOf(input.charAt(i++)); - enc2 = key.indexOf(input.charAt(i++)); - enc3 = key.indexOf(input.charAt(i++)); - enc4 = key.indexOf(input.charAt(i++)); - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - output = output + chr(chr1); - if (enc3 != 64) { - output = output + chr(chr2); - } - if (enc4 != 64) { - output = output + chr(chr3); - } - chr1 = chr2 = chr3 = ''; - enc1 = enc2 = enc3 = enc4 = ''; - } while (i < input.length); - return output; - }; - } - encodeBase64 = function(str) { - return encodeAscii(unescape(encodeURIComponent(str))); - }; - decodeBase64 = function(str) { - return decodeURIComponent(escape(decodeAscii(str))); - }; - } - - function buildEntities() { - HTMLToEntityMap = {}; - forEachProperty(HTMLFromEntityMap, function(val, key) { - HTMLToEntityMap[val] = '&' + key + ';'; - }); - } - - function callIncludesWithRegexSupport(str, search, position) { - if (!isRegExp(search)) { - return nativeIncludes.call(str, search, position); - } - if (position) { - str = str.slice(position); - } - return search.test(str); - } - - defineInstance(sugarString, { - - // Enhancment to String#includes to allow a regex. - 'includes': fixArgumentLength(callIncludesWithRegexSupport) - - }, [ENHANCEMENTS_FLAG, STRING_ENHANCEMENTS_FLAG]); - - defineInstance(sugarString, { - - /*** - * @method at(index, [loop] = false) - * @returns Mixed - * @short Gets the character(s) at a given index. - * @extra When [loop] is true, overshooting the end of the string will begin - * counting from the other end. `index` may be negative. If `index` is - * an array, multiple elements will be returned. - * @example - * - * 'jumpy'.at(0) -> 'j' - * 'jumpy'.at(2) -> 'm' - * 'jumpy'.at(5) -> '' - * 'jumpy'.at(5, true) -> 'j' - * 'jumpy'.at(-1) -> 'y' - * 'lucky charms'.at([2, 4]) -> ['u','k'] - * - * @param {number|Array} index - * @param {boolean} [loop] - * - ***/ - 'at': function(str, index, loop) { - return getEntriesForIndexes(str, index, loop, true); - }, - - /*** - * @method escapeURL([param] = false) - * @returns String - * @short Escapes characters in a string to make a valid URL. - * @extra If [param] is true, it will also escape valid URL characters. Use - * this when the entire string is meant for use in a query string. - * - * @example - * - * 'a, b, and c'.escapeURL() -> 'a,%20b,%20and%20c' - * 'http://foo.com/'.escapeURL(true) -> 'http%3A%2F%2Ffoo.com%2F' - * - * @param {boolean} [param] - * - ***/ - 'escapeURL': function(str, param) { - return param ? encodeURIComponent(str) : encodeURI(str); - }, - - /*** - * @method unescapeURL([partial] = false) - * @returns String - * @short Restores escaped characters in a URL escaped string. - * @extra If [partial] is true, it will only unescape non-valid URL tokens, - * and is included here for completeness, but should be rarely needed. - * - * @example - * - * 'http%3A%2F%2Ffoo.com%2F'.unescapeURL() -> 'http://foo.com/' - * 'http%3A%2F%2Ffoo.com%2F'.unescapeURL(true) -> 'http%3A%2F%2Ffoo.com%2F' - * - * @param {boolean} [partial] - * - ***/ - 'unescapeURL': function(str, param) { - return param ? decodeURI(str) : decodeURIComponent(str); - }, - - /*** - * @method escapeHTML() - * @returns String - * @short Converts HTML characters to their entity equivalents. - * - * @example - * - * '

some text

'.escapeHTML() -> '<p>some text</p>' - * 'one & two'.escapeHTML() -> 'one & two' - * - ***/ - 'escapeHTML': function(str) { - return str.replace(HTML_ESCAPE_REG, function(chr) { - return getOwn(HTMLToEntityMap, chr); - }); - }, - - /*** - * @method unescapeHTML() - * @returns String - * @short Restores escaped HTML characters. - * - * @example - * - * '<p>some text</p>'.unescapeHTML() -> '

some text

' - * 'one & two'.unescapeHTML() -> 'one & two' - * - ***/ - 'unescapeHTML': function(str) { - return unescapeHTML(str); - }, - - /*** - * @method stripTags([tag] = 'all', [replace]) - * @returns String - * @short Strips HTML tags from the string. - * @extra [tag] may be an array of tags or 'all', in which case all tags will - * be stripped. [replace] will replace what was stripped, and may be a - * string or a function of type `replaceFn` to handle replacements. If - * this function returns a string, then it will be used for the - * replacement. If it returns `undefined`, the tags will be stripped normally. - * - * @callback replaceFn - * - * tag The tag name. - * inner The tag content. - * attr The attributes on the tag, if any, as a string. - * outer The entire matched tag string. - * - * @example - * - * '

just some text

'.stripTags() -> 'just some text' - * '

just some text

'.stripTags('p') -> 'just some text' - * '

hi!

'.stripTags('p', function(all, content) { - * return '|'; - * }); -> '|hi!|' - * - * @param {string} tag - * @param {string|replaceFn} replace - * @callbackParam {string} tag - * @callbackParam {string} inner - * @callbackParam {string} attr - * @callbackParam {string} outer - * @callbackReturns {string} replaceFn - * - ***/ - 'stripTags': function(str, tag, replace) { - return replaceTags(str, tag, replace, true); - }, - - /*** - * @method removeTags([tag] = 'all', [replace]) - * @returns String - * @short Removes HTML tags and their contents from the string. - * @extra [tag] may be an array of tags or 'all', in which case all tags will - * be removed. [replace] will replace what was removed, and may be a - * string or a function of type `replaceFn` to handle replacements. If - * this function returns a string, then it will be used for the - * replacement. If it returns `undefined`, the tags will be removed normally. - * - * @callback replaceFn - * - * tag The tag name. - * inner The tag content. - * attr The attributes on the tag, if any, as a string. - * outer The entire matched tag string. - * - * @example - * - * '

just some text

'.removeTags() -> '' - * '

just some text

'.removeTags('b') -> '

just text

' - * '

hi!

'.removeTags('p', function(all, content) { - * return 'bye!'; - * }); -> 'bye!' - * - * @param {string} tag - * @param {string|replaceFn} replace - * @callbackParam {string} tag - * @callbackParam {string} inner - * @callbackParam {string} attr - * @callbackParam {string} outer - * @callbackReturns {string} replaceFn - * - ***/ - 'removeTags': function(str, tag, replace) { - return replaceTags(str, tag, replace, false); - }, - - /*** - * @method encodeBase64() - * @returns String - * @short Encodes the string into base64 encoding. - * @extra This method wraps native methods when available, and uses a custom - * implementation when not available. It can also handle Unicode - * string encodings. - * - * @example - * - * 'gonna get encoded!'.encodeBase64() -> 'Z29ubmEgZ2V0IGVuY29kZWQh' - * 'http://twitter.com/'.encodeBase64() -> 'aHR0cDovL3R3aXR0ZXIuY29tLw==' - * - ***/ - 'encodeBase64': function(str) { - return encodeBase64(str); - }, - - /*** - * @method decodeBase64() - * @returns String - * @short Decodes the string from base64 encoding. - * @extra This method wraps native methods when available, and uses a custom - * implementation when not available. It can also handle Unicode string - * encodings. - * - * @example - * - * 'aHR0cDovL3R3aXR0ZXIuY29tLw=='.decodeBase64() -> 'http://twitter.com/' - * 'anVzdCBnb3QgZGVjb2RlZA=='.decodeBase64() -> 'just got decoded!' - * - ***/ - 'decodeBase64': function(str) { - return decodeBase64(str); - }, - - /*** - * @method forEach([search], [eachFn]) - * @returns Array - * @short Runs callback [eachFn] against every character in the string, or - * every every occurence of [search] if it is provided. - * @extra Returns an array of matches. [search] may be either a string or - * regex, and defaults to every character in the string. If [eachFn] - * returns false at any time it will break out of the loop. - * - * @callback eachFn - * - * match The current match. - * i The current index. - * arr An array of all matches. - * - * @example - * - * 'jumpy'.forEach(log) -> ['j','u','m','p','y'] - * 'jumpy'.forEach(/[r-z]/) -> ['u','y'] - * 'jumpy'.forEach(/mp/) -> ['mp'] - * 'jumpy'.forEach(/[r-z]/, function(m) { - * // Called twice: "u", "y" - * }); - * - * @signature forEach(eachFn) - * @param {string|RegExp} [search] - * @param {eachFn} [eachFn] - * @callbackParam {string} match - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'forEach': function(str, search, eachFn) { - return stringEach(str, search, eachFn); - }, - - /*** - * @method chars([eachCharFn]) - * @returns Array - * @short Runs [eachCharFn] against each character in the string, and returns an array. - * - * @callback eachCharFn - * - * char The current character. - * i The current index. - * arr An array of all characters. - * - * @example - * - * 'jumpy'.chars() -> ['j','u','m','p','y'] - * 'jumpy'.chars(function(c) { - * // Called 5 times: "j","u","m","p","y" - * }); - * - * @param {eachCharFn} [eachCharFn] - * @callbackParam {string} char - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'chars': function(str, search, eachCharFn) { - return stringEach(str, search, eachCharFn); - }, - - /*** - * @method words([eachWordFn]) - * @returns Array - * @short Runs [eachWordFn] against each word in the string, and returns an array. - * @extra A "word" is defined as any sequence of non-whitespace characters. - * - * @callback eachWordFn - * - * word The current word. - * i The current index. - * arr An array of all words. - * - * @example - * - * 'broken wear'.words() -> ['broken','wear'] - * 'broken wear'.words(function(w) { - * // Called twice: "broken", "wear" - * }); - * - * @param {eachWordFn} [eachWordFn] - * @callbackParam {string} word - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'words': function(str, eachWordFn) { - return stringEach(trim(str), /\S+/g, eachWordFn); - }, - - /*** - * @method lines([eachLineFn]) - * @returns Array - * @short Runs [eachLineFn] against each line in the string, and returns an array. - * - * @callback eachLineFn - * - * line The current line. - * i The current index. - * arr An array of all lines. - * - * @example - * - * lineText.lines() -> array of lines - * lineText.lines(function(l) { - * // Called once per line - * }); - * - * @param {eachLineFn} [eachLineFn] - * @callbackParam {string} line - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'lines': function(str, eachLineFn) { - return stringEach(trim(str), /^.*$/gm, eachLineFn); - }, - - /*** - * @method codes([eachCodeFn]) - * @returns Array - * @short Runs callback [eachCodeFn] against each character code in the string. - * Returns an array of character codes. - * - * @callback eachCodeFn - * - * code The current character code. - * i The current index. - * str The string being operated on. - * - * @example - * - * 'jumpy'.codes() -> [106,117,109,112,121] - * 'jumpy'.codes(function(c) { - * // Called 5 times: 106, 117, 109, 112, 121 - * }); - * - * @param {eachCodeFn} [eachCodeFn] - * @callbackParam {number} code - * @callbackParam {number} i - * @callbackParam {string} str - * - ***/ - 'codes': function(str, eachCodeFn) { - return stringCodes(str, eachCodeFn); - }, - - /*** - * @method shift(n) - * @returns Array - * @short Shifts each character in the string `n` places in the character map. - * - * @example - * - * 'a'.shift(1) -> 'b' - * 'ク'.shift(1) -> 'グ' - * - * @param {number} n - * - ***/ - 'shift': function(str, n) { - var result = ''; - n = n || 0; - stringCodes(str, function(c) { - result += chr(c + n); - }); - return result; - }, - - /*** - * @method isBlank() - * @returns Boolean - * @short Returns true if the string has length 0 or contains only whitespace. - * - * @example - * - * ''.isBlank() -> true - * ' '.isBlank() -> true - * 'noway'.isBlank() -> false - * - ***/ - 'isBlank': function(str) { - return trim(str).length === 0; - }, - - /*** - * @method isEmpty() - * @returns Boolean - * @short Returns true if the string has length 0. - * - * @example - * - * ''.isEmpty() -> true - * 'a'.isBlank() -> false - * ' '.isBlank() -> false - * - ***/ - 'isEmpty': function(str) { - return str.length === 0; - }, - - /*** - * @method insert(str, [index] = length) - * @returns String - * @short Adds `str` at [index]. Allows negative values. - * - * @example - * - * 'dopamine'.insert('e', 3) -> dopeamine - * 'spelling eror'.insert('r', -3) -> spelling error - * - * @param {string} str - * @param {number} [index] - * - ***/ - 'insert': function(str, substr, index) { - index = isUndefined(index) ? str.length : index; - return str.slice(0, index) + substr + str.slice(index); - }, - - /*** - * @method remove(f) - * @returns String - * @short Removes the first occurrence of `f` in the string. - * @extra `f` can be a either case-sensitive string or a regex. In either case - * only the first match will be removed. To remove multiple occurrences, - * use `removeAll`. - * - * @example - * - * 'schfifty five'.remove('f') -> 'schifty five' - * 'schfifty five'.remove(/[a-f]/g) -> 'shfifty five' - * - * @param {string|RegExp} f - * - ***/ - 'remove': function(str, f) { - return str.replace(f, ''); - }, - - /*** - * @method removeAll(f) - * @returns String - * @short Removes any occurences of `f` in the string. - * @extra `f` can be either a case-sensitive string or a regex. In either case - * all matches will be removed. To remove only a single occurence, use - * `remove`. - * - * @example - * - * 'schfifty five'.removeAll('f') -> 'schity ive' - * 'schfifty five'.removeAll(/[a-f]/) -> 'shity iv' - * - * @param {string|RegExp} f - * - ***/ - 'removeAll': function(str, f) { - return stringReplaceAll(str, f); - }, - - /*** - * @method reverse() - * @returns String - * @short Reverses the string. - * - * @example - * - * 'jumpy'.reverse() -> 'ypmuj' - * 'lucky charms'.reverse() -> 'smrahc ykcul' - * - ***/ - 'reverse': function(str) { - return reverseString(str); - }, - - /*** - * @method compact() - * @returns String - * @short Compacts whitespace in the string to a single space and trims the ends. - * - * @example - * - * 'too \n much \n space'.compact() -> 'too much space' - * 'enough \n '.compact() -> 'enought' - * - ***/ - 'compact': function(str) { - return trim(str).replace(/([\r\n\s ])+/g, function(match, whitespace) { - return whitespace === ' ' ? whitespace : ' '; - }); - }, - - /*** - * @method from([index] = 0) - * @returns String - * @short Returns a section of the string starting from [index]. - * - * @example - * - * 'lucky charms'.from() -> 'lucky charms' - * 'lucky charms'.from(7) -> 'harms' - * - * @param {number} [index] - * - ***/ - 'from': function(str, from) { - return str.slice(numberOrIndex(str, from, true)); - }, - - /*** - * @method to([index] = end) - * @returns String - * @short Returns a section of the string ending at [index]. - * - * @example - * - * 'lucky charms'.to() -> 'lucky charms' - * 'lucky charms'.to(7) -> 'lucky ch' - * - * @param {number} [index] - * - ***/ - 'to': function(str, to) { - if (isUndefined(to)) to = str.length; - return str.slice(0, numberOrIndex(str, to)); - }, - - /*** - * @method dasherize() - * @returns String - * @short Converts underscores and camel casing to hypens. - * - * @example - * - * 'a_farewell_to_arms'.dasherize() -> 'a-farewell-to-arms' - * 'capsLock'.dasherize() -> 'caps-lock' - * - ***/ - 'dasherize': function(str) { - return stringUnderscore(str).replace(/_/g, '-'); - }, - - /*** - * @method underscore() - * @returns String - * @short Converts hyphens and camel casing to underscores. - * - * @example - * - * 'a-farewell-to-arms'.underscore() -> 'a_farewell_to_arms' - * 'capsLock'.underscore() -> 'caps_lock' - * - ***/ - 'underscore': function(str) { - return stringUnderscore(str); - }, - - /*** - * @method camelize([upper] = true) - * @returns String - * @short Converts underscores and hyphens to camel case. - * @extra If [upper] is true, the string will be UpperCamelCase. If the - * inflections module is included, acronyms can also be defined that - * will be used when camelizing. - * - * @example - * - * 'caps_lock'.camelize() -> 'CapsLock' - * 'moz-border-radius'.camelize() -> 'MozBorderRadius' - * 'moz-border-radius'.camelize(false) -> 'mozBorderRadius' - * 'http-method'.camelize() -> 'HTTPMethod' - * - * @param {boolean} [upper] - * - ***/ - 'camelize': function(str, upper) { - return stringCamelize(str, upper); - }, - - /*** - * @method spacify() - * @returns String - * @short Converts camelcase, underscores, and hyphens to spaces. - * - * @example - * - * 'camelCase'.spacify() -> 'camel case' - * 'an-ugly-string'.spacify() -> 'an ugly string' - * 'oh-no_youDid-not'.spacify().capitalize(true) -> 'something else' - * - ***/ - 'spacify': function(str) { - return stringSpacify(str); - }, - - /*** - * @method titleize() - * @returns String - * @short Creates a title version of the string. - * @extra Capitalizes all the words and replaces some characters in the string - * to create a nicer looking title. String#titleize is meant for - * creating pretty output. - * - * @example - * - * 'man from the boondocks'.titleize() -> 'Man from the Boondocks' - * 'x-men: apocalypse'.titleize() -> 'X Men: Apocalypse' - * 'TheManWithoutAPast'.titleize() -> 'The Man Without a Past' - * 'raiders_of_the_lost_ark'.titleize() -> 'Raiders of the Lost Ark' - * - ***/ - 'titleize': function(str) { - return stringTitleize(str); - }, - - /*** - * @method parameterize() - * @returns String - * @short Replaces special characters in a string so that it may be used as - * part of a pretty URL. - * - * @example - * - * 'hell, no!'.parameterize() -> 'hell-no' - * - ***/ - 'parameterize': function(str, separator) { - return stringParameterize(str, separator); - }, - - /*** - * @method truncate(length, [from] = 'right', [ellipsis] = '...') - * @returns String - * @short Truncates a string. - * @extra [from] can be `'right'`, `'left'`, or `'middle'`. If the string is - * shorter than `length`, [ellipsis] will not be added. - * - * @example - * - * 'sittin on the dock'.truncate(10) -> 'sittin on ...' - * 'sittin on the dock'.truncate(10, 'left') -> '...n the dock' - * 'sittin on the dock'.truncate(10, 'middle') -> 'sitti... dock' - * - * @param {number} length - * @param {string} [from] - * @param {string} [ellipsis] - * - ***/ - 'truncate': function(str, length, from, ellipsis) { - return truncateString(str, length, from, ellipsis); - }, - - /*** - * @method truncateOnWord(length, [from] = 'right', [ellipsis] = '...') - * @returns String - * @short Truncates a string without splitting up words. - * @extra [from] can be `'right'`, `'left'`, or `'middle'`. If the string is - * shorter than `length`, [ellipsis] will not be added. A "word" is - * defined as any sequence of non-whitespace characters. - * - * @example - * - * 'here we go'.truncateOnWord(5) -> 'here...' - * 'here we go'.truncateOnWord(5, 'left') -> '...we go' - * - * @param {number} length - * @param {string} [from] - * @param {string} [ellipsis] - * - ***/ - 'truncateOnWord': function(str, length, from, ellipsis) { - return truncateString(str, length, from, ellipsis, true); - }, - - /*** - * @method pad(num, [padding] = ' ') - * @returns String - * @short Pads the string out with [padding] to be exactly `num` characters. - * - * @example - * - * 'wasabi'.pad(8) -> ' wasabi ' - * 'wasabi'.pad(8, '-') -> '-wasabi-' - * - * @param {number} num - * @param {string} [padding] - * - ***/ - 'pad': function(str, num, padding) { - var half, front, back; - num = coercePositiveInteger(num); - half = max(0, num - str.length) / 2; - front = floor(half); - back = ceil(half); - return padString(front, padding) + str + padString(back, padding); - }, - - /*** - * @method padLeft(num, [padding] = ' ') - * @returns String - * @short Pads the string out from the left with [padding] to be exactly - * `num` characters. - * - * @example - * - * 'wasabi'.padLeft(8) -> ' wasabi' - * 'wasabi'.padLeft(8, '-') -> '--wasabi' - * - * @param {number} num - * @param {string} [padding] - * - ***/ - 'padLeft': function(str, num, padding) { - num = coercePositiveInteger(num); - return padString(max(0, num - str.length), padding) + str; - }, - - /*** - * @method padRight(num, [padding] = ' ') - * @returns String - * @short Pads the string out from the right with [padding] to be exactly - * `num` characters. - * - * @example - * - * 'wasabi'.padRight(8) -> 'wasabi ' - * 'wasabi'.padRight(8, '-') -> 'wasabi--' - * - * @param {number} num - * @param {string} [padding] - * - ***/ - 'padRight': function(str, num, padding) { - num = coercePositiveInteger(num); - return str + padString(max(0, num - str.length), padding); - }, - - /*** - * @method first([n] = 1) - * @returns String - * @short Returns the first [n] characters of the string. - * - * @example - * - * 'lucky charms'.first() -> 'l' - * 'lucky charms'.first(3) -> 'luc' - * - * @param {number} [n] - * - ***/ - 'first': function(str, num) { - if (isUndefined(num)) num = 1; - return str.substr(0, num); - }, - - /*** - * @method last([n] = 1) - * @returns String - * @short Returns the last [n] characters of the string. - * - * @example - * - * 'lucky charms'.last() -> 's' - * 'lucky charms'.last(3) -> 'rms' - * - * @param {number} [n] - * - ***/ - 'last': function(str, num) { - if (isUndefined(num)) num = 1; - var start = str.length - num < 0 ? 0 : str.length - num; - return str.substr(start); - }, - - /*** - * @method toNumber([base] = 10) - * @returns Number - * @short Converts the string into a number. - * @extra Any value with a "." fill be converted to a floating point value, - * otherwise an integer. - * - * @example - * - * '153'.toNumber() -> 153 - * '12,000'.toNumber() -> 12000 - * '10px'.toNumber() -> 10 - * 'ff'.toNumber(16) -> 255 - * - * @param {number} [base] - * - ***/ - 'toNumber': function(str, base) { - return stringToNumber(str, base); - }, - - /*** - * @method capitalize([lower] = false, [all] = false) - * @returns String - * @short Capitalizes the first character of the string. - * @extra If [lower] is true, the remainder of the string will be downcased. - * If [all] is true, all words in the string will be capitalized. - * - * @example - * - * 'hello'.capitalize() -> 'Hello' - * 'HELLO'.capitalize(true) -> 'Hello' - * 'hello kitty'.capitalize() -> 'Hello kitty' - * 'hEllO kItTy'.capitalize(true, true) -> 'Hello Kitty' - * - * @param {boolean} [lower] - * @param {boolean} [all] - * - ***/ - 'capitalize': function(str, lower, all) { - return stringCapitalize(str, lower, all); - }, - - /*** - * @method trimLeft() - * @returns String - * @short Removes leading whitespace from the string. - * @extra Whitespace is defined as line breaks, tabs, and any character in the - * "Space, Separator" Unicode category, conforming to the the ES5 `trim` - * spec. - * - * @example - * - * ' wasabi '.trimLeft() -> 'wasabi ' - * - ***/ - 'trimLeft': function(str) { - return str.replace(LEFT_TRIM_REG, ''); - }, - - /*** - * @method trimRight() - * @returns String - * @short Removes trailing whitespace from the string. - * @extra Whitespace is defined as line breaks, tabs, and any character in the - * "Space, Separator" Unicode category, conforming to the the ES5 `trim` - * spec. - * - * @example - * - * ' wasabi '.trimRight() -> ' wasabi' - * - ***/ - 'trimRight': function(str) { - return str.replace(RIGHT_TRIM_REG, ''); - } - - }); - - defineInstanceWithArguments(sugarString, { - - /*** - * @method replaceAll(f, [str1], [str2], ...) - * @returns String - * @short Replaces all occurences of `f` with arguments passed. - * @extra This method is intended to be a quick way to perform multiple string - * replacements quickly when the replacement token differs depending on - * position. `f` can be either a case-sensitive string or a regex. - * In either case all matches will be replaced. - * - * @example - * - * '-x -y -z'.replaceAll('-', 1, 2, 3) -> '1x 2y 3z' - * 'one and two'.replaceAll(/one|two/, '1st', '2nd') -> '1st and 2nd' - * - * @param {string|RegExp} f - * @param {string} [str1] - * @param {string} [str2] - * - ***/ - 'replaceAll': function(str, f, args) { - return stringReplaceAll(str, f, args); - }, - - /*** - * @method format(obj1, [obj2], ...) - * @returns String - * @short Replaces `{}` tokens in the string with arguments or properties. - * @extra Tokens support `deep properties`. If a single object is passed, its - * properties can be accessed by keywords such as `{name}`. If multiple - * objects or a non-object are passed, they can be accessed by the - * argument position like `{0}`. Literal braces in the string can be - * escaped by repeating them. - * - * @example - * - * 'Welcome, {name}.'.format({ name: 'Bill' }) -> 'Welcome, Bill.' - * 'You are {0} years old today.'.format(5) -> 'You are 5 years old today.' - * '{0.name} and {1.name}'.format(users) -> logs first two users' names - * '${currencies.usd.balance}'.format(Harry) -> "$500" - * '{{Hello}}'.format('Hello') -> "{Hello}" - * - * @param {any} [obj1] - * @param {any} [obj2] - * - ***/ - 'format': function(str, args) { - var arg1 = args[0] && args[0].valueOf(); - // Unwrap if a single object is passed in. - if (args.length === 1 && isObjectType(arg1)) { - args = arg1; - } - return stringFormatMatcher(str, args); - } - - }); - - buildBase64(); - buildEntities(); - - /*** - * @module Array - * @description Array manipulation and traversal, alphanumeric sorting and collation. - * - ***/ - - var HALF_WIDTH_NINE = 0x39; - var FULL_WIDTH_NINE = 0xff19; - - // Undefined array elements in < IE8 will not be visited by concat - // and so will not be copied. This means that non-sparse arrays will - // become sparse, so detect for this here. - var HAS_CONCAT_BUG = !('0' in [].concat(undefined).concat()); - - var ARRAY_OPTIONS = { - 'sortIgnore': null, - 'sortNatural': true, - 'sortIgnoreCase': true, - 'sortOrder': getSortOrder(), - 'sortCollate': collateStrings, - 'sortEquivalents': getSortEquivalents() - }; - - /*** - * @method getOption(name) - * @returns Mixed - * @accessor - * @short Gets an option used internally by Array. - * @extra Options listed below. Current options are for sorting strings with - * `sortBy`. - * - * @example - * - * Sugar.Array.getOption('sortNatural') - * - * @param {string} name - * - *** - * @method setOption(name, value) - * @accessor - * @short Sets an option used internally by Array. - * @extra Options listed below. Current options are for sorting strings with - * `sortBy`. If `value` is `null`, the default value will be restored. - * - * @options - * - * sortIgnore A regex to ignore when sorting. An example usage of this - * option would be to ignore numbers in a list to instead - * sort by the first text that appears. Default is `null`. - * - * sortIgnoreCase A boolean that ignores case when sorting. - * Default is `true`. - * - * sortNatural A boolean that turns on natural sorting. "Natural" means - * that numerals like "10" will be sorted after "9" instead - * of after "1". Default is `true`. - * - * sortOrder A string of characters to use as the base sort order. The - * default is an order natural to most major world languages. - * - * sortEquivalents A table of equivalent characters used when sorting. The - * default produces a natural sort order for most world - * languages, however can be modified for others. For - * example, setting "ä" and "ö" to `null` in the table would - * produce a Scandanavian sort order. Note that setting this - * option to `null` will restore the default table, but any - * mutations made to that table will persist. - * - * sortCollate The collation function used when sorting strings. The - * default function produces a natural sort order that can - * be customized with the other "sort" options. Overriding - * the function directly here will also override these - * options. - * - * @example - * - * Sugar.Array.setOption('sortIgnore', /^\d+\./) - * Sugar.Array.setOption('sortIgnoreCase', false) - * - * @signature setOption(options) - * @param {ArrayOptions} options - * @param {string} name - * @param {any} value - * @option {RegExp} [sortIgnore] - * @option {boolean} [sortIgnoreCase] - * @option {boolean} [sortNatural] - * @option {string} [sortOrder] - * @option {Object} [sortEquivalents] - * @option {Function} [sortCollate] - * - ***/ - var _arrayOptions = defineOptionsAccessor(sugarArray, ARRAY_OPTIONS); - - - function setArrayChainableConstructor() { - setChainableConstructor(sugarArray, arrayCreate); - } - - function isArrayOrInherited(obj) { - return obj && obj.constructor && isArray(obj.constructor.prototype); - } - - function arrayCreate(obj, clone) { - var arr; - if (isArrayOrInherited(obj)) { - arr = clone ? arrayClone(obj) : obj; - } else if (isObjectType(obj) || isString(obj)) { - arr = Array.from(obj); - } else if (isDefined(obj)) { - arr = [obj]; - } - return arr || []; - } - - function arrayClone(arr) { - var clone = new Array(arr.length); - forEach(arr, function(el, i) { - clone[i] = el; - }); - return clone; - } - - function arrayConcat(arr1, arr2) { - // istanbul ignore if - if (HAS_CONCAT_BUG) { - return arraySafeConcat(arr1, arr2); - } - return arr1.concat(arr2); - } - - // Avoids issues with [undefined] in < IE9 - function arrayWrap(obj) { - var arr = []; - arr.push(obj); - return arr; - } - - // Avoids issues with concat in < IE8 - // istanbul ignore next - function arraySafeConcat(arr, arg) { - var result = arrayClone(arr), len = result.length, arr2; - arr2 = isArray(arg) ? arg : [arg]; - result.length += arr2.length; - forEach(arr2, function(el, i) { - result[len + i] = el; - }); - return result; - } - - - function arrayAppend(arr, el, index) { - var spliceArgs; - index = +index; - if (isNaN(index)) { - index = arr.length; - } - spliceArgs = [index, 0]; - if (isDefined(el)) { - spliceArgs = spliceArgs.concat(el); - } - arr.splice.apply(arr, spliceArgs); - return arr; - } - - function arrayRemove(arr, f) { - var matcher = getMatcher(f), i = 0; - while(i < arr.length) { - if (matcher(arr[i], i, arr)) { - arr.splice(i, 1); - } else { - i++; - } - } - return arr; - } - - function arrayExclude(arr, f) { - var result = [], matcher = getMatcher(f); - for (var i = 0; i < arr.length; i++) { - if (!matcher(arr[i], i, arr)) { - result.push(arr[i]); - } - } - return result; - } - - function arrayUnique(arr, map) { - var result = [], obj = {}, refs = []; - forEach(arr, function(el, i) { - var transformed = map ? mapWithShortcuts(el, map, arr, [el, i, arr]) : el; - var key = serializeInternal(transformed, refs); - if (!hasOwn(obj, key)) { - result.push(el); - obj[key] = true; - } - }); - return result; - } - - function arrayFlatten(arr, level, current) { - var result = []; - level = level || Infinity; - current = current || 0; - forEach(arr, function(el) { - if (isArray(el) && current < level) { - result = result.concat(arrayFlatten(el, level, current + 1)); - } else { - result.push(el); - } - }); - return result; - } - - function arrayCompact(arr, all) { - return filter(arr, function(el) { - return el || (!all && el != null && el.valueOf() === el.valueOf()); - }); - } - - function arrayShuffle(arr) { - arr = arrayClone(arr); - var i = arr.length, j, x; - while(i) { - j = (Math.random() * i) | 0; - x = arr[--i]; - arr[i] = arr[j]; - arr[j] = x; - } - return arr; - } - - function arrayGroupBy(arr, map, fn) { - var result = {}, key; - forEach(arr, function(el, i) { - key = mapWithShortcuts(el, map, arr, [el, i, arr]); - if (!hasOwn(result, key)) { - result[key] = []; - } - result[key].push(el); - }); - if (fn) { - forEachProperty(result, fn); - } - return result; - } - - function arrayIntersectOrSubtract(arr1, arr2, subtract) { - var result = [], obj = {}, refs = []; - if (!isArray(arr2)) { - arr2 = arrayWrap(arr2); - } - forEach(arr2, function(el) { - obj[serializeInternal(el, refs)] = true; - }); - forEach(arr1, function(el) { - var key = serializeInternal(el, refs); - if (hasOwn(obj, key) !== subtract) { - delete obj[key]; - result.push(el); - } - }); - return result; - } - - // Collation helpers - - function compareValue(aVal, bVal) { - var cmp, i, collate; - if (isString(aVal) && isString(bVal)) { - collate = _arrayOptions('sortCollate'); - return collate(aVal, bVal); - } else if (isArray(aVal) && isArray(bVal)) { - if (aVal.length < bVal.length) { - return -1; - } else if (aVal.length > bVal.length) { - return 1; - } else { - for(i = 0; i < aVal.length; i++) { - cmp = compareValue(aVal[i], bVal[i]); - if (cmp !== 0) { - return cmp; - } - } - return 0; - } - } - return aVal < bVal ? -1 : aVal > bVal ? 1 : 0; - } - - function codeIsNumeral(code) { - return (code >= HALF_WIDTH_ZERO && code <= HALF_WIDTH_NINE) || - (code >= FULL_WIDTH_ZERO && code <= FULL_WIDTH_NINE); - } - - function collateStrings(a, b) { - var aValue, bValue, aChar, bChar, aEquiv, bEquiv, index = 0, tiebreaker = 0; - - var sortOrder = _arrayOptions('sortOrder'); - var sortIgnore = _arrayOptions('sortIgnore'); - var sortNatural = _arrayOptions('sortNatural'); - var sortIgnoreCase = _arrayOptions('sortIgnoreCase'); - var sortEquivalents = _arrayOptions('sortEquivalents'); - - a = getCollationReadyString(a, sortIgnore, sortIgnoreCase); - b = getCollationReadyString(b, sortIgnore, sortIgnoreCase); - - do { - - aChar = getCollationCharacter(a, index, sortEquivalents); - bChar = getCollationCharacter(b, index, sortEquivalents); - aValue = getSortOrderIndex(aChar, sortOrder); - bValue = getSortOrderIndex(bChar, sortOrder); - - if (aValue === -1 || bValue === -1) { - aValue = a.charCodeAt(index) || null; - bValue = b.charCodeAt(index) || null; - if (sortNatural && codeIsNumeral(aValue) && codeIsNumeral(bValue)) { - aValue = stringToNumber(a.slice(index)); - bValue = stringToNumber(b.slice(index)); - } - } else { - aEquiv = aChar !== a.charAt(index); - bEquiv = bChar !== b.charAt(index); - if (aEquiv !== bEquiv && tiebreaker === 0) { - tiebreaker = aEquiv - bEquiv; - } - } - index += 1; - } while(aValue != null && bValue != null && aValue === bValue); - if (aValue === bValue) return tiebreaker; - return aValue - bValue; - } - - function getCollationReadyString(str, sortIgnore, sortIgnoreCase) { - if (sortIgnoreCase) { - str = str.toLowerCase(); - } - if (sortIgnore) { - str = str.replace(sortIgnore, ''); - } - return str; - } - - function getCollationCharacter(str, index, sortEquivalents) { - var chr = str.charAt(index); - return getOwn(sortEquivalents, chr) || chr; - } - - function getSortOrderIndex(chr, sortOrder) { - if (!chr) { - return null; - } else { - return sortOrder.indexOf(chr); - } - } - - function getSortOrder() { - var order = 'AÁÀÂÃĄBCĆČÇDĎÐEÉÈĚÊËĘFGĞHıIÍÌİÎÏJKLŁMNŃŇÑOÓÒÔPQRŘSŚŠŞTŤUÚÙŮÛÜVWXYÝZŹŻŽÞÆŒØÕÅÄÖ'; - return map(order.split(''), function(str) { - return str + str.toLowerCase(); - }).join(''); - } - - function getSortEquivalents() { - var equivalents = {}; - forEach(spaceSplit('AÁÀÂÃÄ CÇ EÉÈÊË IÍÌİÎÏ OÓÒÔÕÖ Sß UÚÙÛÜ'), function(set) { - var first = set.charAt(0); - forEach(set.slice(1).split(''), function(chr) { - equivalents[chr] = first; - equivalents[chr.toLowerCase()] = first.toLowerCase(); - }); - }); - return equivalents; - } - - defineStatic(sugarArray, { - - /*** - * - * @method create([obj], [clone] = false) - * @returns Array - * @static - * @short Creates an array from an unknown object. - * @extra This method is similar to native `Array.from` but is faster when - * `obj` is already an array. When [clone] is true, the array will be - * shallow cloned. Additionally, it will not fail on `undefined`, - * `null`, or numbers, producing an empty array in the case of - * `undefined` and wrapping `obj` otherwise. - * - * @example - * - * Array.create() -> [] - * Array.create(8) -> [8] - * Array.create('abc') -> ['a','b','c'] - * Array.create([1,2,3]) -> [1, 2, 3] - * Array.create(undefined) -> [] - * - * @param {number|ArrayLike} [obj] - * @param {boolean} [clone] - * - ***/ - 'create': function(obj, clone) { - return arrayCreate(obj, clone); - }, - - /*** - * - * @method construct(n, indexMapFn) - * @returns Array - * @static - * @short Constructs an array of `n` length from the values of `indexMapFn`. - * @extra This function is essentially a shortcut for using `Array.from` with - * `new Array(n)`. - * - * @callback indexMapFn - * - * i The index of the current iteration. - * - * @example - * - * Array.construct(4, function(i) { - * return i * i; - * }); -> [0, 1, 4] - * - * @param {number} n - * @param {indexMapFn} indexMapFn - * @callbackParam {number} i - * @callbackReturns {ArrayElement} indexMapFn - * - ***/ - 'construct': function(n, indexMapFn) { - n = coercePositiveInteger(n); - return Array.from(new Array(n), function(el, i) { - return indexMapFn && indexMapFn(i); - }); - } - - }); - - defineInstance(sugarArray, { - - /*** - * @method isEmpty() - * @returns Boolean - * @short Returns true if the array has a length of zero. - * - * @example - * - * [].isEmpty() -> true - * ['a'].isEmpty() -> false - * - ***/ - 'isEmpty': function(arr) { - return arr.length === 0; - }, - - /*** - * @method isEqual(arr) - * @returns Boolean - * @short Returns true if the array is equal to `arr`. - * @extra Objects in the array are considered equal if they are not observably - * distinguishable. This method is an instance alias for - * `Object.isEqual()`. - * - * @example - * - * ['a','b'].isEqual(['a','b']) -> true - * ['a','b'].isEqual(['a','c']) -> false - * [{a:'a'}].isEqual([{a:'a'}]) -> true - * [5].isEqual([Object(5)]) -> false - * - * @param {Array} arr - * - ***/ - 'isEqual': function(a, b) { - return isEqual(a, b); - }, - - /*** - * @method clone() - * @returns Array - * @short Creates a shallow clone of the array. - * - * @example - * - * [1,2,3].clone() -> [1,2,3] - * - ***/ - 'clone': function(arr) { - return arrayClone(arr); - }, - - /*** - * @method at(index, [loop] = false) - * @returns ArrayElement - * @short Gets the element(s) at `index`. - * @extra When [loop] is true, overshooting the end of the array will begin - * counting from the other end. `index` can be negative. If `index` is - * an array, multiple elements will be returned. - * - * @example - * - * [1,2,3].at(0) -> 1 - * [1,2,3].at(2) -> 3 - * [1,2,3].at(4) -> undefined - * [1,2,3].at(4, true) -> 2 - * [1,2,3].at(-1) -> 3 - * [1,2,3].at([0, 1]) -> [1, 2] - * - * @param {number|number[]} index - * @param {boolean} [loop] - * - ***/ - 'at': function(arr, index, loop) { - return getEntriesForIndexes(arr, index, loop); - }, - - /*** - * @method add(item, [index]) - * @returns Array - * @short Adds `item` to the array and returns the result as a new array. - * @extra If `item` is also an array, it will be concatenated instead of - * inserted. [index] will control where `item` is added. Use `append` - * to modify the original array. - * - * @example - * - * [1,2,3,4].add(5) -> [1,2,3,4,5] - * [1,2,3,4].add(8, 1) -> [1,8,2,3,4] - * [1,2,3,4].add([5,6,7]) -> [1,2,3,4,5,6,7] - * - * @param {ArrayElement|Array} item - * @param {number} [index] - * - ***/ - 'add': function(arr, item, index) { - return arrayAppend(arrayClone(arr), item, index); - }, - - /*** - * @method subtract(item) - * @returns Array - * @short Subtracts `item` from the array and returns the result as a new array. - * @extra If `item` is also an array, all elements in it will be removed. In - * addition to primitives, this method will also deep-check objects for - * equality. - * - * @example - * - * [1,3,5].subtract([5,7,9]) -> [1,3] - * ['a','b'].subtract(['b','c']) -> ['a'] - * [1,2,3].subtract(2) -> [1,3] - * - * @param {ArrayElement|Array} item - * - ***/ - 'subtract': function(arr, item) { - return arrayIntersectOrSubtract(arr, item, true); - }, - - /*** - * @method append(item, [index]) - * @returns Array - * @short Appends `item` to the array. - * @extra If `item` is also an array, it will be concatenated instead of - * inserted. This method modifies the array! Use `add` to create a new - * array. Additionally, `insert` is provided as an alias that reads - * better when using an index. - * - * @example - * - * [1,2,3,4].append(5) -> [1,2,3,4,5] - * [1,2,3,4].append([5,6,7]) -> [1,2,3,4,5,6,7] - * [1,2,3,4].append(8, 1) -> [1,8,2,3,4] - * - * @param {ArrayElement|Array} item - * @param {number} index - * - ***/ - 'append': function(arr, item, index) { - return arrayAppend(arr, item, index); - }, - - /*** - * @method removeAt(start, [end]) - * @returns Array - * @short Removes element at `start`. If [end] is specified, removes the range - * between `start` and [end]. This method will modify the array! - * - * @example - * - * ['a','b','c'].removeAt(0) -> ['b','c'] - * [1,2,3,4].removeAt(1, 2) -> [1, 4] - * - * @param {number} start - * @param {number} [end] - * - ***/ - 'removeAt': function(arr, start, end) { - if (isUndefined(start)) return arr; - if (isUndefined(end)) end = start; - arr.splice(start, end - start + 1); - return arr; - }, - - /*** - * @method unique([map]) - * @returns Array - * @short Removes all duplicate elements in the array. - * @extra [map] can be a string or callback type `mapFn` that returns the value - * to be uniqued or a string acting as a shortcut. This is most commonly - * used when you only need to check a single field that can ensure the - * object's uniqueness (such as an `id` field). If [map] is not passed, - * then objects will be deep checked for equality. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,2,3].unique() -> [1,2,3] - * [{a:'a'},{a:'a'}].unique() -> [{a:'a'}] - * - * users.unique(function(user) { - * return user.id; - * }); -> users array uniqued by id - * - * users.unique('id') -> users array uniqued by id - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'unique': function(arr, map) { - return arrayUnique(arr, map); - }, - - /*** - * @method flatten([limit] = Infinity) - * @returns Array - * @short Returns a flattened, one-dimensional copy of the array. - * @extra You can optionally specify a [limit], which will only flatten to - * that depth. - * - * @example - * - * [[1], 2, [3]].flatten() -> [1,2,3] - * [[1],[],2,3].flatten() -> [1,2,3] - * - * @param {number} [limit] - * - ***/ - 'flatten': function(arr, limit) { - return arrayFlatten(arr, limit); - }, - - /*** - * @method first([num] = 1) - * @returns Mixed - * @short Returns the first element(s) in the array. - * @extra When `num` is passed, returns the first `num` elements in the array. - * - * @example - * - * [1,2,3].first() -> 1 - * [1,2,3].first(2) -> [1,2] - * - * @param {number} [num] - * - ***/ - 'first': function(arr, num) { - if (isUndefined(num)) return arr[0]; - if (num < 0) num = 0; - return arr.slice(0, num); - }, - - /*** - * @method last([num] = 1) - * @returns Mixed - * @short Returns the last element(s) in the array. - * @extra When `num` is passed, returns the last `num` elements in the array. - * - * @example - * - * [1,2,3].last() -> 3 - * [1,2,3].last(2) -> [2,3] - * - * @param {number} [num] - * - ***/ - 'last': function(arr, num) { - if (isUndefined(num)) return arr[arr.length - 1]; - var start = arr.length - num < 0 ? 0 : arr.length - num; - return arr.slice(start); - }, - - /*** - * @method from(index) - * @returns Array - * @short Returns a slice of the array from `index`. - * - * @example - * - * ['a','b','c'].from(1) -> ['b','c'] - * ['a','b','c'].from(2) -> ['c'] - * - * @param {number} [index] - * - ***/ - 'from': function(arr, num) { - return arr.slice(num); - }, - - /*** - * @method to(index) - * @returns Array - * @short Returns a slice of the array up to `index`. - * - * @example - * - * ['a','b','c'].to(1) -> ['a'] - * ['a','b','c'].to(2) -> ['a','b'] - * - * @param {number} [index] - * - ***/ - 'to': function(arr, num) { - if (isUndefined(num)) num = arr.length; - return arr.slice(0, num); - }, - - /*** - * @method compact([all] = false) - * @returns Array - * @short Removes all instances of `undefined`, `null`, and `NaN` from the array. - * @extra If [all] is `true`, all "falsy" elements will be removed. This - * includes empty strings, `0`, and `false`. - * - * @example - * - * [1,null,2,undefined,3].compact() -> [1,2,3] - * [1,'',2,false,3].compact() -> [1,'',2,false,3] - * [1,'',2,false,3].compact(true) -> [1,2,3] - * [null, [null, 'bye']].compact() -> ['hi', [null, 'bye']] - * - * @param {boolean} [all] - * - ***/ - 'compact': function(arr, all) { - return arrayCompact(arr, all); - }, - - /*** - * @method groupBy(map, [groupFn]) - * @returns Object - * @short Groups the array by `map`. - * @extra Will return an object whose keys are the mapped from `map`, which - * can be a callback of type `mapFn`, or a string acting as a shortcut. - * `map` supports `deep properties`. Optionally calls [groupFn] for each group. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @callback groupFn - * - * arr The current group as an array. - * key The unique key of the current group. - * obj A reference to the object. - * - * @example - * - * ['a','aa','aaa'].groupBy('length') -> { 1: ['a'], 2: ['aa'], 3: ['aaa'] } - * - * users.groupBy(function(n) { - * return n.age; - * }); -> users array grouped by age - * - * users.groupBy('age', function(age, users) { - * // iterates each grouping - * }); - * - * @param {string|mapFn} map - * @param {groupFn} groupFn - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'groupBy': function(arr, map, groupFn) { - return arrayGroupBy(arr, map, groupFn); - }, - - /*** - * @method inGroups(num, [padding]) - * @returns Array - * @short Groups the array into `num` arrays. - * @extra If specified, [padding] will be added to the last array to be of - * equal length. - * - * @example - * - * [1,2,3,4,5,6,7].inGroups(3) -> [[1,2,3],[4,5,6],[7]] - * [1,2,3,4,5,6,7].inGroups(3, 0) -> [[1,2,3],[4,5,6],[7,0,0]] - * - * @param {number} num - * @param {any} [padding] - * - ***/ - 'inGroups': function(arr, num, padding) { - var pad = isDefined(padding); - var result = new Array(num); - var divisor = ceil(arr.length / num); - simpleRepeat(num, function(i) { - var index = i * divisor; - var group = arr.slice(index, index + divisor); - if (pad && group.length < divisor) { - simpleRepeat(divisor - group.length, function() { - group.push(padding); - }); - } - result[i] = group; - }); - return result; - }, - - /*** - * @method inGroupsOf(num, [padding] = null) - * @returns Array - * @short Groups the array into arrays of `num` elements each. - * @extra [padding] will be added to the last array to be of equal length. - * - * @example - * - * [1,2,3,4,5,6,7].inGroupsOf(4) -> [ [1,2,3,4], [5,6,7] ] - * [1,2,3,4,5,6,7].inGroupsOf(4, 0) -> [ [1,2,3,4], [5,6,7,0] ] - * - * @param {number} num - * @param {any} [padding] - * - ***/ - 'inGroupsOf': function(arr, num, padding) { - var result = [], len = arr.length, group; - if (len === 0 || num === 0) return arr; - if (isUndefined(num)) num = 1; - if (isUndefined(padding)) padding = null; - simpleRepeat(ceil(len / num), function(i) { - group = arr.slice(num * i, num * i + num); - while(group.length < num) { - group.push(padding); - } - result.push(group); - }); - return result; - }, - - /*** - * @method shuffle() - * @returns Array - * @short Returns a copy of the array with the elements randomized. - * @extra Uses Fisher-Yates algorithm. - * - * @example - * - * [1,2,3,4].shuffle() -> [?,?,?,?] - * - ***/ - 'shuffle': function(arr) { - return arrayShuffle(arr); - }, - - /*** - * @method sample([num] = 1, [remove] = false) - * @returns Mixed - * @short Returns a random element from the array. - * @extra If [num] is passed, will return an array of [num] elements. If - * [remove] is true, sampled elements will also be removed from the - * array. [remove] can also be passed in place of [num]. - * - * @example - * - * [1,2,3,4,5].sample() -> // Random element - * [1,2,3,4,5].sample(1) -> // Array of 1 random element - * [1,2,3,4,5].sample(3) -> // Array of 3 random elements - * - * @param {number} [num] - * @param {boolean} [remove] - * - ***/ - 'sample': function(arr, arg1, arg2) { - var result = [], num, remove, single; - if (isBoolean(arg1)) { - remove = arg1; - } else { - num = arg1; - remove = arg2; - } - if (isUndefined(num)) { - num = 1; - single = true; - } - if (!remove) { - arr = arrayClone(arr); - } - num = min(num, arr.length); - for (var i = 0, index; i < num; i++) { - index = trunc(Math.random() * arr.length); - result.push(arr[index]); - arr.splice(index, 1); - } - return single ? result[0] : result; - }, - - /*** - * @method sortBy([map], [desc] = false) - * @returns Array - * @short Enhanced sorting function that will sort the array by `map`. - * @extra `map` can be a function of type `sortMapFn`, a string acting as a - * shortcut, an array (comparison by multiple values), or blank (direct - * comparison of array values). `map` supports `deep properties`. - * [desc] will sort the array in descending order. When the field being - * sorted on is a string, the resulting order will be determined by an - * internal collation algorithm that is optimized for major Western - * languages, but can be customized using sorting accessors such as - * `sortIgnore`. This method will modify the array! - * - * @callback sortMapFn - * - * el An array element. - * - * @example - * - * ['world','a','new'].sortBy('length') -> ['a','new','world'] - * ['world','a','new'].sortBy('length', true) -> ['world','new','a'] - * users.sortBy(function(n) { - * return n.age; - * }); -> users array sorted by age - * users.sortBy('age') -> users array sorted by age - * - * @param {string|sortMapFn} [map] - * @param {boolean} [desc] - * @callbackParam {ArrayElement} el - * @callbackReturns {NewArrayElement} sortMapFn - * - ***/ - 'sortBy': function(arr, map, desc) { - arr.sort(function(a, b) { - var aProperty = mapWithShortcuts(a, map, arr, [a]); - var bProperty = mapWithShortcuts(b, map, arr, [b]); - return compareValue(aProperty, bProperty) * (desc ? -1 : 1); - }); - return arr; - }, - - /*** - * @method remove(search) - * @returns Array - * @short Removes any element in the array that matches `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * This method will modify the array! Use `exclude` for a - * non-destructive alias. This method implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].remove(3) -> [1,2] - * ['a','b','c'].remove(/b/) -> ['a','c'] - * [{a:1},{b:2}].remove(function(n) { - * return n['a'] == 1; - * }); -> [{b:2}] - * - * @param {ArrayElement|searchFn} search - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'remove': function(arr, f) { - return arrayRemove(arr, f); - }, - - /*** - * @method exclude(search) - * @returns Array - * @short Returns a new array with every element that does not match `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * This method can be thought of as the inverse of `Array#filter`. It - * will not modify the original array, Use `remove` to modify the - * array in place. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].exclude(3) -> [1,2] - * ['a','b','c'].exclude(/b/) -> ['a','c'] - * [{a:1},{b:2}].exclude(function(n) { - * return n['a'] == 1; - * }); -> [{b:2}] - * - * @param {ArrayElement|searchFn} search - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'exclude': function(arr, f) { - return arrayExclude(arr, f); - }, - - /*** - * @method union(arr) - * @returns Array - * @short Returns a new array containing elements in both arrays with - * duplicates removed. - * @extra In addition to primitives, this method will also deep-check objects - * for equality. - * - * @example - * - * [1,3,5].union([5,7,9]) -> [1,3,5,7,9] - * ['a','b'].union(['b','c']) -> ['a','b','c'] - * - * @param {Array} arr - * - ***/ - 'union': function(arr1, arr2) { - return arrayUnique(arrayConcat(arr1, arr2)); - }, - - /*** - * @method intersect(arr) - * @returns Array - * @short Returns a new array containing any elements that both arrays have in - * common. - * @extra In addition to primitives, this method will also deep-check objects - * for equality. - * - * @example - * - * [1,3,5].intersect([5,7,9]) -> [5] - * ['a','b'].intersect(['b','c']) -> ['b'] - * - * @param {Array} arr - * - ***/ - 'intersect': function(arr1, arr2) { - return arrayIntersectOrSubtract(arr1, arr2, false); - } - - }); - - defineInstanceWithArguments(sugarArray, { - - /*** - * @method zip([arr1], [arr2], ...) - * @returns Array - * @short Merges multiple arrays together. - * @extra This method "zips up" smaller arrays into one large whose elements - * are "all elements at index 0", "all elements at index 1", etc. - * Useful when you have associated data that is split over separated - * arrays. If the arrays passed have more elements than the original - * array, they will be discarded. If they have fewer elements, the - * missing elements will filled with `null`. - * - * @example - * - * [1,2,3].zip([4,5,6]) -> [[1,2], [3,4], [5,6]] - * - * @param {Array} arr1 - * @param {Array} arr2 - * - ***/ - 'zip': function(arr, args) { - return map(arr, function(el, i) { - return [el].concat(map(args, function(k) { - return (i in k) ? k[i] : null; - })); - }); - } - - }); - - /*** - * @method insert(item, [index]) - * @returns Array - * @short Appends `item` to the array at [index]. - * @extra This method is simply a more readable alias for `append` when passing - * an index. If `el` is an array it will be joined. This method modifies - * the array! Use `add` as a non-destructive alias. - * - * @example - * - * [1,3,4,5].insert(2, 1) -> [1,2,3,4,5] - * [1,4,5,6].insert([2,3], 1) -> [1,2,3,4,5,6] - * - * @param {ArrayElement|Array} item - * @param {number} [index] - * - ***/ - alias(sugarArray, 'insert', 'append'); - - setArrayChainableConstructor(); - - /*** - * @module Object - * @description Object creation, manipulation, comparison, type checking, and more. - * - * Much thanks to kangax for his informative aricle about how problems with - * instanceof and constructor: http://bit.ly/1Qds27W - * - ***/ - - // Matches bracket-style query strings like user[name] - var DEEP_QUERY_STRING_REG = /^(.+?)(\[.*\])$/; - - // Matches any character not allowed in a decimal number. - var NON_DECIMAL_REG = /[^\d.-]/; - - // Native methods for merging by descriptor when available. - var getOwnPropertyNames = Object.getOwnPropertyNames; - var getOwnPropertySymbols = Object.getOwnPropertySymbols; - var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - - // Basic Helpers - - function isArguments(obj, className) { - className = className || classToString(obj); - // .callee exists on Arguments objects in < IE8 - return hasProperty(obj, 'length') && (className === '[object Arguments]' || !!obj.callee); - } - - // Query Strings | Creating - - function toQueryStringWithOptions(obj, opts) { - opts = opts || {}; - if (isUndefined(opts.separator)) { - opts.separator = '_'; - } - return toQueryString(obj, opts.deep, opts.transform, opts.prefix || '', opts.separator); - } - - function toQueryString(obj, deep, transform, prefix, separator) { - if (isArray(obj)) { - return collectArrayAsQueryString(obj, deep, transform, prefix, separator); - } else if (isObjectType(obj) && obj.toString === internalToString) { - return collectObjectAsQueryString(obj, deep, transform, prefix, separator); - } else if (prefix) { - return getURIComponentValue(obj, prefix, transform); - } - return ''; - } - - function collectArrayAsQueryString(arr, deep, transform, prefix, separator) { - var el, qc, key, result = []; - // Intentionally treating sparse arrays as dense here by avoiding map, - // otherwise indexes will shift during the process of serialization. - for (var i = 0, len = arr.length; i < len; i++) { - el = arr[i]; - key = prefix + (prefix && deep ? '[]' : ''); - if (!key && !isObjectType(el)) { - // If there is no key, then the values of the array should be - // considered as null keys, so use them instead; - qc = sanitizeURIComponent(el); - } else { - qc = toQueryString(el, deep, transform, key, separator); - } - result.push(qc); - } - return result.join('&'); - } - - function collectObjectAsQueryString(obj, deep, transform, prefix, separator) { - var result = []; - forEachProperty(obj, function(val, key) { - var fullKey; - if (prefix && deep) { - fullKey = prefix + '[' + key + ']'; - } else if (prefix) { - fullKey = prefix + separator + key; - } else { - fullKey = key; - } - result.push(toQueryString(val, deep, transform, fullKey, separator)); - }); - return result.join('&'); - } - - function getURIComponentValue(obj, prefix, transform) { - var value; - if (transform) { - value = transform(obj, prefix); - } else if (isDate(obj)) { - value = obj.getTime(); - } else { - value = obj; - } - return sanitizeURIComponent(prefix) + '=' + sanitizeURIComponent(value); - } - - function sanitizeURIComponent(obj) { - // undefined, null, and NaN are represented as a blank string, - // while false and 0 are stringified. - return !obj && obj !== false && obj !== 0 ? '' : encodeURIComponent(obj); - } - - - // Query Strings | Parsing - - function fromQueryStringWithOptions(obj, opts) { - var str = String(obj || '').replace(/^.*?\?/, ''), result = {}, auto; - opts = opts || {}; - if (str) { - forEach(str.split('&'), function(p) { - var split = p.split('='); - var key = decodeURIComponent(split[0]); - var val = split.length === 2 ? decodeURIComponent(split[1]) : ''; - auto = opts.auto !== false; - parseQueryComponent(result, key, val, opts.deep, auto, opts.separator, opts.transform); - }); - } - return result; - } - - function parseQueryComponent(obj, key, val, deep, auto, separator, transform) { - var match; - if (separator) { - key = mapQuerySeparatorToKeys(key, separator); - deep = true; - } - if (deep === true && (match = key.match(DEEP_QUERY_STRING_REG))) { - parseDeepQueryComponent(obj, match, val, deep, auto, separator, transform); - } else { - setQueryProperty(obj, key, val, auto, transform); - } - } - - function parseDeepQueryComponent(obj, match, val, deep, auto, separator, transform) { - var key = match[1]; - var inner = match[2].slice(1, -1).split(']['); - forEach(inner, function(k) { - if (!hasOwn(obj, key)) { - obj[key] = k ? {} : []; - } - obj = getOwn(obj, key); - key = k ? k : obj.length.toString(); - }); - setQueryProperty(obj, key, val, auto, transform); - } - - function mapQuerySeparatorToKeys(key, separator) { - var split = key.split(separator), result = split[0]; - for (var i = 1, len = split.length; i < len; i++) { - result += '[' + split[i] + ']'; - } - return result; - } - - function setQueryProperty(obj, key, val, auto, transform) { - var fnValue; - if (transform) { - fnValue = transform(val, key, obj); - } - if (isDefined(fnValue)) { - val = fnValue; - } else if (auto) { - val = getQueryValueAuto(obj, key, val); - } - obj[key] = val; - } - - function getQueryValueAuto(obj, key, val) { - if (!val) { - return null; - } else if (val === 'true') { - return true; - } else if (val === 'false') { - return false; - } - var num = +val; - if (!isNaN(num) && stringIsDecimal(val)) { - return num; - } - var existing = getOwn(obj, key); - if (val && existing) { - return isArray(existing) ? existing.concat(val) : [existing, val]; - } - return val; - } - - function stringIsDecimal(str) { - return str !== '' && !NON_DECIMAL_REG.test(str); - } - - - // Object Merging - - function mergeWithOptions(target, source, opts) { - opts = opts || {}; - return objectMerge(target, source, opts.deep, opts.resolve, opts.hidden, opts.descriptor); - } - - function defaults(target, sources, opts) { - opts = opts || {}; - opts.resolve = opts.resolve || false; - return mergeAll(target, sources, opts); - } - - function mergeAll(target, sources, opts) { - if (!isArray(sources)) { - sources = [sources]; - } - forEach(sources, function(source) { - return mergeWithOptions(target, source, opts); - }); - return target; - } - - function iterateOverProperties(hidden, obj, fn) { - if (getOwnPropertyNames && hidden) { - iterateOverKeys(getOwnPropertyNames, obj, fn, hidden); - } else { - forEachProperty(obj, fn); - } - if (getOwnPropertySymbols) { - iterateOverKeys(getOwnPropertySymbols, obj, fn, hidden); - } - } - - // "keys" may include symbols - function iterateOverKeys(getFn, obj, fn, hidden) { - var keys = getFn(obj), desc; - for (var i = 0, key; key = keys[i]; i++) { - desc = getOwnPropertyDescriptor(obj, key); - if (desc.enumerable || hidden) { - fn(obj[key], key); - } - } - } - - function mergeByPropertyDescriptor(target, source, prop, sourceVal) { - var descriptor = getOwnPropertyDescriptor(source, prop); - if (isDefined(descriptor.value)) { - descriptor.value = sourceVal; - } - defineProperty(target, prop, descriptor); - } - - function objectMerge(target, source, deep, resolve, hidden, descriptor) { - var resolveByFunction = isFunction(resolve), resolveConflicts = resolve !== false; - - if (isUndefined(target)) { - target = getNewObjectForMerge(source); - } else if (resolveConflicts && isDate(target) && isDate(source)) { - // A date's timestamp is a property that can only be reached through its - // methods, so actively set it up front if both are dates. - target.setTime(source.getTime()); - } - - if (isPrimitive(target)) { - // Will not merge into a primitive type, so simply override. - return source; - } - - // If the source object is a primitive - // type then coerce it into an object. - if (isPrimitive(source)) { - source = coercePrimitiveToObject(source); - } - - iterateOverProperties(hidden, source, function(val, key) { - var sourceVal, targetVal, resolved, goDeep, result; - - sourceVal = source[key]; - - // We are iterating over properties of the source, so hasOwnProperty on - // it is guaranteed to always be true. However, the target may happen to - // have properties in its prototype chain that should not be considered - // as conflicts. - targetVal = getOwn(target, key); - - if (resolveByFunction) { - result = resolve(key, targetVal, sourceVal, target, source); - if (isUndefined(result)) { - // Result is undefined so do not merge this property. - return; - } else if (isDefined(result) && result !== Sugar) { - // If the source returns anything except undefined, then the conflict - // has been resolved, so don't continue traversing into the object. If - // the returned value is the Sugar global object, then allowing Sugar - // to resolve the conflict, so continue on. - sourceVal = result; - resolved = true; - } - } else if (isUndefined(sourceVal)) { - // Will not merge undefined. - return; - } - - // Regex properties are read-only, so intentionally disallowing deep - // merging for now. Instead merge by reference even if deep. - goDeep = !resolved && deep && isObjectType(sourceVal) && !isRegExp(sourceVal); - - if (!goDeep && !resolveConflicts && isDefined(targetVal)) { - return; - } - - if (goDeep) { - sourceVal = objectMerge(targetVal, sourceVal, deep, resolve, hidden, descriptor); - } - - // getOwnPropertyNames is standing in as - // a test for property descriptor support - if (getOwnPropertyNames && descriptor) { - mergeByPropertyDescriptor(target, source, key, sourceVal); - } else { - target[key] = sourceVal; - } - - }); - return target; - } - - function getNewObjectForMerge(source) { - var klass = classToString(source); - // Primitive types, dates, and regexes have no "empty" state. If they exist - // at all, then they have an associated value. As we are only creating new - // objects when they don't exist in the target, these values can come alone - // for the ride when created. - if (isArray(source, klass)) { - return []; - } else if (isPlainObject(source, klass)) { - return {}; - } else if (isDate(source, klass)) { - return new Date(source.getTime()); - } else if (isRegExp(source, klass)) { - return RegExp(source.source, getRegExpFlags(source)); - } else if (isPrimitive(source && source.valueOf())) { - return source; - } - // If the object is not of a known type, then simply merging its - // properties into a plain object will result in something different - // (it will not respond to instanceof operator etc). Similarly we don't - // want to call a constructor here as we can't know for sure what the - // original constructor was called with (Events etc), so throw an - // error here instead. Non-standard types can be handled if either they - // already exist and simply have their properties merged, if the merge - // is not deep so their references will simply be copied over, or if a - // resolve function is used to assist the merge. - throw new TypeError('Must be a basic data type'); - } - - function clone(source, deep) { - var target = getNewObjectForMerge(source); - return objectMerge(target, source, deep, true, true, true); - } - - - // Keys/Values - - function objectSize(obj) { - return getKeysWithObjectCoercion(obj).length; - } - - function getKeysWithObjectCoercion(obj) { - return getKeys(coercePrimitiveToObject(obj)); - } - - function getValues(obj) { - var values = []; - forEachProperty(obj, function(val) { - values.push(val); - }); - return values; - } - - function tap(obj, arg) { - var fn = arg; - if (!isFunction(arg)) { - fn = function() { - if (arg) obj[arg](); - }; - } - fn.call(obj, obj); - return obj; - } - - // Select/Reject - - function objectSelect(obj, f) { - return selectFromObject(obj, f, true); - } - - function objectReject(obj, f) { - return selectFromObject(obj, f, false); - } - - function selectFromObject(obj, f, select) { - var match, result = {}; - f = [].concat(f); - forEachProperty(obj, function(val, key) { - match = false; - for (var i = 0; i < f.length; i++) { - if (matchInObject(f[i], key)) { - match = true; - } - } - if (match === select) { - result[key] = val; - } - }); - return result; - } - - function matchInObject(match, key) { - if (isRegExp(match)) { - return match.test(key); - } else if (isObjectType(match)) { - return key in match; - } else { - return key === String(match); - } - } - - // Remove/Exclude - - function objectRemove(obj, f) { - var matcher = getMatcher(f); - forEachProperty(obj, function(val, key) { - if (matcher(val, key, obj)) { - delete obj[key]; - } - }); - return obj; - } - - function objectExclude(obj, f) { - var result = {}; - var matcher = getMatcher(f); - forEachProperty(obj, function(val, key) { - if (!matcher(val, key, obj)) { - result[key] = val; - } - }); - return result; - } - - function objectIntersectOrSubtract(obj1, obj2, subtract) { - if (!isObjectType(obj1)) { - return subtract ? obj1 : {}; - } - obj2 = coercePrimitiveToObject(obj2); - function resolve(key, val, val1) { - var exists = key in obj2 && isEqual(val1, obj2[key]); - if (exists !== subtract) { - return val1; - } - } - return objectMerge({}, obj1, false, resolve); - } - - /*** - * @method is[Type]() - * @returns Boolean - * @short Returns true if the object is an object of that type. - * - * @set - * isArray - * isBoolean - * isDate - * isError - * isFunction - * isMap - * isNumber - * isRegExp - * isSet - * isString - * - * @example - * - * Object.isArray([3]) -> true - * Object.isNumber(3) -> true - * Object.isString(8) -> false - * - ***/ - function buildClassCheckMethods() { - var checks = [isBoolean, isNumber, isString, isDate, isRegExp, isFunction, isArray, isError, isSet, isMap]; - defineInstanceAndStaticSimilar(sugarObject, NATIVE_TYPES, function(methods, name, i) { - methods['is' + name] = checks[i]; - }); - } - - defineStatic(sugarObject, { - - /*** - * @method fromQueryString(str, [options]) - * @returns Object - * @static - * @short Converts the query string of a URL into an object. - * @extra Options can be passed with [options] for more control over the result. - * - * @options - * - * deep If the string contains "deep" syntax `foo[]`, this will - * be automatically converted to an array. (Default `false`) - * - * auto If `true`, booleans `"true"` and `"false"`, numbers, and arrays - * (repeated keys) will be automatically cast to native - * values. (Default `true`) - * - * transform A function of type `transformFn` whose return value becomes - * the final value. If the function returns `undefined`, then the - * original value will be used. This allows the function to - * intercept only certain keys or values. (Default `undefined`) - * - * separator If passed, keys will be split on this string to extract - * deep values. (Default `''`) - * - * @callback transformFn - * - * key The key component of the query string (before `=`). - * val The value component of the query string (after `=`). - * obj A reference to the object being built. - * - * @example - * - * Object.fromQueryString('a=1&b=2') -> {a:1,b:2} - * Object.fromQueryString('a[]=1&a[]=2',{deep:true}) -> {a:['1','2']} - * Object.fromQueryString('a_b=c',{separator:'_'}) -> {a:{b:'c'}} - * Object.fromQueryString('id=123', {transform:idToNumber}); - * - * @param {string} str - * @param {QueryStringParseOptions} options - * @callbackParam {string} key - * @callbackParam {Property} val - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} transformFn - * @option {boolean} [deep] - * @option {boolean} [auto] - * @option {string} [separator] - * @option {transformFn} [transform] - * - ***/ - 'fromQueryString': function(obj, options) { - return fromQueryStringWithOptions(obj, options); - } - - }); - - defineInstanceAndStatic(sugarObject, { - - /*** - * @method has(key, [inherited] = false) - * @returns Boolean - * @short Checks if the object has property `key`. - * @extra Supports `deep properties`. If [inherited] is `true`, - * properties defined in the prototype chain will also return `true`. - * The default of `false` for this argument makes this method suited - * to working with objects as data stores by default. - * - * @example - * - * Object.has(usersByName, 'Harry') -> true - * Object.has(data, 'users[1].profile') -> true - * Object.has([], 'forEach') -> false - * Object.has([], 'forEach', true) -> true - * - * @param {string} key - * @param {boolean} [inherited] - * - ***/ - 'has': function(obj, key, any) { - return deepHasProperty(obj, key, any); - }, - - /*** - * @method get(key, [inherited] = false) - * @returns Mixed - * @short Gets a property of the object. - * @extra Supports `deep properties`. If [inherited] is `true`, - * properties defined in the prototype chain will also be returned. - * The default of `false` for this argument makes this method suited - * to working with objects as data stores by default. - * - * @example - * - * Object.get(Harry, 'name'); -> 'Harry' - * Object.get(Harry, 'profile.likes'); -> Harry's likes - * Object.get(data, 'users[3].name') -> User 3's name - * Object.get(data, 'users[1..2]') -> Users 1 and 2 - * Object.get(data, 'users[1..2].name') -> Names of users 1 and 2 - * Object.get(data, 'users[-2..-1]') -> Last 2 users - * - * @param {string} key - * @param {boolean} [inherited] - * - ***/ - 'get': function(obj, key, any) { - return deepGetProperty(obj, key, any); - }, - - /*** - * @method set(key, val) - * @returns Object - * @short Sets a property on the object. - * @extra Using a dot or square bracket in `key` is considered "deep" syntax, - * and will attempt to traverse into the object to set the property, - * creating properties that do not exist along the way. If the missing - * property is referenced using square brackets, an empty array will be - * created, otherwise an empty object. A special `[]` carries the - * meaning of "the last index + 1", and will effectively push `val` - * onto the end of the array. Lastly, a `..` separator inside the - * brackets is "range" notation, and will set properties on all - * elements in the specified range. Range members may be negative, - * which will be offset from the end of the array. - * - * @example - * - * Object.set({}, 'name', 'Harry'); -> {name:'Harry'} - * Object.set({}, 'user.name', 'Harry'); -> {user:{name:'Harry'}} - * Object.set({}, 'users[].name', 'Bob') -> {users:[{name:'Bob'}} - * Object.set({}, 'users[1].name','Bob') -> {users:[undefined, {name:'Bob'}]} - * Object.set({}, 'users[0..1].name','Bob') -> {users:[{name:'Bob'},{name:'Bob'}]} - * - * @param {string} key - * @param {Property} val - * - ***/ - 'set': function(obj, key, val) { - return deepSetProperty(obj, key, val); - }, - - /*** - * @method size() - * @returns Number - * @short Returns the number of properties in the object. - * - * @example - * - * Object.size({foo:'bar'}) -> 1 - * - ***/ - 'size': function(obj) { - return objectSize(obj); - }, - - /*** - * @method isEmpty() - * @returns Boolean - * @short Returns true if the number of properties in the object is zero. - * - * @example - * - * Object.isEmpty({}) -> true - * Object.isEmpty({a:1}) -> false - * - ***/ - 'isEmpty': function(obj) { - return objectSize(obj) === 0; - }, - - /*** - * @method toQueryString([options]) - * @returns Object - * @short Converts the object into a query string. - * @extra Accepts deep objects and arrays. [options] can be passed for more - * control over the result. - * - * @options - * - * deep If `true`, non-standard "deep" syntax `foo[]` will be - * used for output. Note that `separator` will be ignored, - * as this option overrides shallow syntax. (Default `false`) - * - * prefix If passed, this string will be prefixed to all keys, - * separated by the `separator`. (Default `''`). - * - * transform A function of type `transformFn` whose return value becomes - * the final value in the string. (Default `undefined`) - * - * separator A string that is used to separate keys, either for deep - * objects, or when `prefix` is passed.(Default `_`). - * - * @callback transformFn - * - * key The key of the current iteration. - * val The value of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.toQueryString({foo:'bar'}) -> 'foo=bar' - * Object.toQueryString({foo:['a','b']}) -> 'foo=a&foo=b' - * Object.toQueryString({foo:['a','b']}, {deep:true}) -> 'foo[]=a&foo[]=b' - * - * @param {Object} obj - * @param {QueryStringOptions} [options] - * @callbackParam {string} key - * @callbackParam {Property} val - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} transformFn - * @option {boolean} [deep] - * @option {string} [prefix] - * @option {string} [separator] - * @option {transformFn} [transform] - * - ***/ - 'toQueryString': function(obj, options) { - return toQueryStringWithOptions(obj, options); - }, - - /*** - * @method isEqual(obj) - * @returns Boolean - * @short Returns `true` if `obj` is equivalent to the object. - * @extra If both objects are built-in types, they will be considered - * equivalent if they are not "observably distinguishable". This means - * that objects that can otherwise be considered equivalent (primitives - * and their object counterparts, `0` and `-0`, sparse and dense arrays) - * will return `false`. Functions and non-built-ins like instances of - * user-defined classes and host objects like Element and Event are - * strictly compared with `===`, and will only be equivalent if they - * are the same reference. Plain objects as well as Arrays will be - * traversed into and deeply checked by their non-inherited, enumerable - * properties. Other allowed types include Typed Arrays, Sets, Maps, - * Arguments, Dates, Regexes, and Errors. - * - * @example - * - * Object.isEqual({a:2}, {a:2}) -> true - * Object.isEqual({a:2}, {a:3}) -> false - * Object.isEqual(5, Object(5)) -> false - * Object.isEqual(Object(5), Object(5)) -> true - * Object.isEqual(NaN, NaN) -> false - * - * @param {Object} obj - * - ***/ - 'isEqual': function(obj1, obj2) { - return isEqual(obj1, obj2); - }, - - /*** - * @method merge(source, [options]) - * @returns Object - * @short Merges properties from `source` into the object. - * @extra This method will modify the object! Use `add` for a non-destructive - * alias. - * - * @options - * - * deep If `true` deep properties are merged recursively. - * (Default `false`) - * - * hidden If `true`, non-enumerable properties will be merged as well. - * (Default `false`) - * - * descriptor If `true`, properties will be merged by property descriptor. - * Use this option to merge getters or setters, or to preserve - * `enumerable`, `configurable`, etc. - * (Default `false`) - * - * resolve Determines which property wins in the case of conflicts. - * If `true`, `source` wins. If `false`, the original property - * wins. A function of type `resolveFn` may also be passed, - * whose return value will decide the result. Any non-undefined - * return value will resolve the conflict for that property - * (will not continue if `deep`). Returning `undefined` will do - * nothing (no merge). Finally, returning the global object - * `Sugar` will allow Sugar to handle the merge as normal. - * (Default `true`) - * - * @callback resolveFn - * - * key The key of the current iteration. - * targetVal The current value for the key in the target. - * sourceVal The current value for the key in `source`. - * target The target object. - * source The source object. - * - * @example - * - * Object.merge({one:1},{two:2}) -> {one:1,two:2} - * Object.merge({one:1},{one:9,two:2}) -> {one:9,two:2} - * Object.merge({x:{a:1}},{x:{b:2}},{deep:true}) -> {x:{a:1,b:2}} - * Object.merge({a:1},{a:2},{resolve:mergeAdd}) -> {a:3} - * - * @param {Object} source - * @param {ObjectMergeOptions} [options] - * @callbackParam {string} key - * @callbackParam {Property} targetVal - * @callbackParam {Property} sourceVal - * @callbackParam {Object} target - * @callbackParam {Object} source - * @callbackReturns {boolean} resolveFn - * @option {boolean} [deep] - * @option {boolean} [hidden] - * @option {boolean} [descriptor] - * @option {boolean|resolveFn} [resolve] - * - ***/ - 'merge': function(target, source, opts) { - return mergeWithOptions(target, source, opts); - }, - - /*** - * @method add(obj, [options]) - * @returns Object - * @short Adds properties in `obj` and returns a new object. - * @extra This method will not modify the original object. See `merge` for options. - * - * @example - * - * Object.add({one:1},{two:2}) -> {one:1,two:2} - * Object.add({one:1},{one:9,two:2}) -> {one:9,two:2} - * Object.add({x:{a:1}},{x:{b:2}},{deep:true}) -> {x:{a:1,b:2}} - * Object.add({a:1},{a:2},{resolve:mergeAdd}) -> {a:3} - * - * @param {Object} obj - * @param {ObjectMergeOptions} [options] - * - ***/ - 'add': function(obj1, obj2, opts) { - return mergeWithOptions(clone(obj1), obj2, opts); - }, - - /*** - * @method mergeAll(sources, [options]) - * @returns Object - * @short Merges properties from an array of `sources`. - * @extra This method will modify the object! Use `addAll` for a non-destructive - * alias. See `merge` for options. - * - * @example - * - * Object.mergeAll({one:1},[{two:2},{three:3}]) -> {one:1,two:2,three:3} - * Object.mergeAll({x:{a:1}},[{x:{b:2}},{x:{c:3}}],{deep:true}) -> {x:{a:1,b:2,c:3}} - * - * @param {Array} sources - * @param {ObjectMergeOptions} [options] - * - ***/ - 'mergeAll': function(target, sources, opts) { - return mergeAll(target, sources, opts); - }, - - /*** - * @method addAll(sources, [options]) - * @returns Object - * @short Adds properties from an array of `sources` and returns a new object. - * @extra This method will not modify the object. See `merge` for options. - * - * @example - * - * Object.addAll({one:1},[{two:2},{three:3}]) -> {one:1,two:2,three:3} - * Object.addAll({x:{a:1}},[{x:{b:2}},{x:{c:3}}],{deep:true}) -> {x:{a:1,b:2,c:3}} - * - * @param {Array} sources - * @param {ObjectMergeOptions} [options] - * - ***/ - 'addAll': function(obj, sources, opts) { - return mergeAll(clone(obj), sources, opts); - }, - - /*** - * @method defaults(sources, [options]) - * @returns Object - * @short Merges properties from one or multiple `sources` while preserving - * the object's defined properties. - * @extra This method modifies the object! See `merge` for options. - * - * @example - * - * Object.defaults({one:1},[{one:9},{two:2}]) -> {one:1,two:2} - * Object.defaults({x:{a:1}},[{x:{a:9}},{x:{b:2}}],{deep:true}) -> {x:{a:1,b:2}} - * - * @param {Array} sources - * @param {ObjectMergeOptions} [options] - * - ***/ - 'defaults': function(target, sources, opts) { - return defaults(target, sources, opts); - }, - - /*** - * @method intersect(obj) - * @returns Object - * @short Returns a new object whose properties are those that the object has - * in common both with `obj`. - * @extra If both key and value do not match, then the property will not be included. - * - * @example - * - * Object.intersect({a:'a'},{b:'b'}) -> {} - * Object.intersect({a:'a'},{a:'b'}) -> {} - * Object.intersect({a:'a',b:'b'},{b:'b',z:'z'}) -> {b:'b'} - * - * @param {Object} obj - * - ***/ - 'intersect': function(obj1, obj2) { - return objectIntersectOrSubtract(obj1, obj2, false); - }, - - /*** - * @method subtract(obj) - * @returns Object - * @short Returns a clone of the object with any properties shared with `obj` excluded. - * @extra If both key and value do not match, then the property will not be excluded. - * - * @example - * - * Object.subtract({a:'a',b:'b'},{b:'b'}) -> {a:'a'} - * Object.subtract({a:'a',b:'b'},{a:'b'}) -> {a:'a',b:'b'} - * - * @param {Object} obj - * - ***/ - 'subtract': function(obj1, obj2) { - return objectIntersectOrSubtract(obj1, obj2, true); - }, - - /*** - * @method clone([deep] = false) - * @returns Object - * @short Creates a clone of the object. - * @extra Default is a shallow clone, unless [deep] is true. - * - * @example - * - * Object.clone({foo:'bar'}) -> creates shallow clone - * Object.clone({foo:'bar'}, true) -> creates a deep clone - * - * @param {boolean} [deep] - * - ***/ - 'clone': function(obj, deep) { - return clone(obj, deep); - }, - - /*** - * @method values() - * @returns Array - * @short Returns an array containing the values in the object. - * @extra Values are in no particular order. Does not include inherited or - * non-enumerable properties. - * - * @example - * - * Object.values({a:'a',b:'b'}) -> ['a','b'] - * - ***/ - 'values': function(obj) { - return getValues(obj); - }, - - /*** - * @method invert([multi] = false) - * @returns Object - * @short Creates a new object with the keys and values swapped. - * @extra If [multi] is true, values will be an array of all keys, othewise - * collisions will be overwritten. - * - * @example - * - * Object.invert({foo:'bar'}) -> {bar:'foo'} - * Object.invert({a:1,b:1}, true) -> {1:['a','b']} - * - * @param {boolean} [multi] - * - ***/ - 'invert': function(obj, multi) { - var result = {}; - multi = multi === true; - forEachProperty(obj, function(val, key) { - if (hasOwn(result, val) && multi) { - result[val].push(key); - } else if (multi) { - result[val] = [key]; - } else { - result[val] = key; - } - }); - return result; - }, - - /*** - * @method tap(tapFn) - * @returns Object - * @short Runs `tapFn` and returns the object. - * @extra A string can also be used as a shortcut to `tapFn`. This method is - * designed to run an intermediary function that "taps into" a method - * chain. As such, it is fairly useless as a static method. However it - * can be quite useful when combined with chainables. - * - * @callback tapFn - * - * obj A reference to the object. - * - * @example - * - * Sugar.Array([1,4,9]).map(Math.sqrt).tap('pop') -> [1,2] - * Sugar.Object({a:'a'}).tap(logArgs).merge({b:'b'}) -> {a:'a',b:'b'} - * - * @param {tapFn} tapFn - * @callbackParam {Object} obj - * @callbackReturns {any} tapFn - * - ***/ - 'tap': function(obj, arg) { - return tap(obj, arg); - }, - - /*** - * @method isArguments() - * @returns Boolean - * @short Returns true if the object is an arguments object. - * - * @example - * - * Object.isArguments([1]) -> false - * - ***/ - 'isArguments': function(obj) { - return isArguments(obj); - }, - - /*** - * @method isObject() - * @returns Boolean - * @short Returns true if the object is a "plain" object. - * @extra Plain objects do not include instances of classes or "host" objects, - * such as Elements, Events, etc. - * - * @example - * - * Object.isObject({ broken:'wear' }) -> true - * - ***/ - 'isObject': function(obj) { - return isPlainObject(obj); - }, - - /*** - * @method remove(search) - * @returns Object - * @short Deletes all properties in the object matching `search`. - * @extra `search` may be any property or a function of type `searchFn`. This - * method will modify the object!. Implements `enhanced matching`. - * - * @callback searchFn - * - * key The key of the current iteration. - * val The value of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.remove({a:'a',b:'b'}, 'a'); -> {b:'b'} - * Object.remove({a:'a',b:'b',z:'z'}, /[a-f]/); -> {z:'z'} - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'remove': function(obj, f) { - return objectRemove(obj, f); - }, - - /*** - * @method exclude(search) - * @returns Object - * @short Returns a new object with all properties matching `search` removed. - * @extra `search` may be any property or a function of type `searchFn`. This - * is a non-destructive version of `remove` and will not modify the - * object. Implements `enhanced matching`. - * - * @callback searchFn - * - * key The key of the current iteration. - * val The value of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.exclude({a:'a',b:'b'}, 'a'); -> {b:'b'} - * Object.exclude({a:'a',b:'b',z:'z'}, /[a-f]/); -> {z:'z'} - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'exclude': function(obj, f) { - return objectExclude(obj, f); - }, - - /*** - * @method select(find) - * @returns Object - * @short Builds a new object containing the keys specified in `find`. - * @extra When `find` is a string, a single key will be selected. Arrays or - * objects match multiple keys, and a regex will match keys by regex. - * - * @example - * - * Object.select({a:1,b:2}, 'a') -> {a:1} - * Object.select({a:1,b:2}, ['a', 'b']) -> {a:1,b:2} - * Object.select({a:1,b:2}, /[a-z]/) -> {a:1,b:2} - * Object.select({a:1,b:2}, {a:'a',b:'b'}) -> {a:1,b:2} - * - * @param {string|RegExp|Array|Object} find - * - ***/ - 'select': function(obj, f) { - return objectSelect(obj, f); - }, - - /*** - * @method reject(find) - * @returns Object - * @short Builds a new object containing all keys except those in `find`. - * @extra When `find` is a string, a single key will be rejected. Arrays or - * objects match multiple keys, and a regex will match keys by regex. - * - * @example - * - * Object.reject({a:1,b:2}, 'a') -> {b:2} - * Object.reject({a:1,b:2}, /[a-z]/) -> {} - * Object.reject({a:1,b:2}, {a:'a'}) -> {b:2} - * Object.reject({a:1,b:2}, ['a', 'b']) -> {} - * - * @param {string|RegExp|Array|Object} find - * - ***/ - 'reject': function(obj, f) { - return objectReject(obj, f); - } - - }); - - // TODO: why is this here? - defineInstance(sugarObject, { - - /*** - * @method keys() - * @returns Array - * @polyfill ES5 - * @short Returns an array containing the keys of all of the non-inherited, - * enumerable properties of the object. - * - * @example - * - * Object.keys({a:'a',b:'b'}) -> ['a','b'] - * - ***/ - 'keys': function(obj) { - return getKeys(obj); - } - - }); - - buildClassCheckMethods(); - - /*** - * @module Enumerable - * @description Counting, mapping, and finding methods on both arrays and objects. - * - ***/ - - function sum(obj, map) { - var sum = 0; - enumerateWithMapping(obj, map, function(val) { - sum += val; - }); - return sum; - } - - function average(obj, map) { - var sum = 0, count = 0; - enumerateWithMapping(obj, map, function(val) { - sum += val; - count++; - }); - // Prevent divide by 0 - return sum / (count || 1); - } - - function median(obj, map) { - var result = [], middle, len; - enumerateWithMapping(obj, map, function(val) { - result.push(val); - }); - len = result.length; - if (!len) return 0; - result.sort(function(a, b) { - // IE7 will throw errors on non-numbers! - return (a || 0) - (b || 0); - }); - middle = trunc(len / 2); - return len % 2 ? result[middle] : (result[middle - 1] + result[middle]) / 2; - } - - function getMinOrMax(obj, arg1, arg2, max, asObject) { - var result = [], pushVal, edge, all, map; - if (isBoolean(arg1)) { - all = arg1; - map = arg2; - } else { - map = arg1; - } - enumerateWithMapping(obj, map, function(val, key) { - if (isUndefined(val)) { - throw new TypeError('Cannot compare with undefined'); - } - pushVal = asObject ? key : obj[key]; - if (val === edge) { - result.push(pushVal); - } else if (isUndefined(edge) || (max && val > edge) || (!max && val < edge)) { - result = [pushVal]; - edge = val; - } - }); - return getReducedMinMaxResult(result, obj, all, asObject); - } - - function getLeastOrMost(obj, arg1, arg2, most, asObject) { - var group = {}, refs = [], minMaxResult, result, all, map; - if (isBoolean(arg1)) { - all = arg1; - map = arg2; - } else { - map = arg1; - } - enumerateWithMapping(obj, map, function(val, key) { - var groupKey = serializeInternal(val, refs); - var arr = getOwn(group, groupKey) || []; - arr.push(asObject ? key : obj[key]); - group[groupKey] = arr; - }); - minMaxResult = getMinOrMax(group, !!all, 'length', most, true); - if (all) { - result = []; - // Flatten result - forEachProperty(minMaxResult, function(val) { - result = result.concat(val); - }); - } else { - result = getOwn(group, minMaxResult); - } - return getReducedMinMaxResult(result, obj, all, asObject); - } - - - // Support - - function getReducedMinMaxResult(result, obj, all, asObject) { - if (asObject && all) { - // The method has returned an array of keys so use this array - // to build up the resulting object in the form we want it in. - return result.reduce(function(o, key) { - o[key] = obj[key]; - return o; - }, {}); - } else if (result && !all) { - result = result[0]; - } - return result; - } - - function enumerateWithMapping(obj, map, fn) { - var arrayIndexes = isArray(obj); - forEachProperty(obj, function(val, key) { - if (arrayIndexes) { - if (!isArrayIndex(key)) { - return; - } - key = +key; - } - var mapped = mapWithShortcuts(val, map, obj, [val, key, obj]); - fn(mapped, key); - }); - } - - /*** @namespace Array ***/ - - // Flag allowing native array methods to be enhanced - var ARRAY_ENHANCEMENTS_FLAG = 'enhanceArray'; - - // Enhanced map function - var enhancedMap = buildEnhancedMapping('map'); - - // Enhanced matcher methods - var enhancedFind = buildEnhancedMatching('find'), - enhancedSome = buildEnhancedMatching('some'), - enhancedEvery = buildEnhancedMatching('every'), - enhancedFilter = buildEnhancedMatching('filter'), - enhancedFindIndex = buildEnhancedMatching('findIndex'); - - function arrayNone() { - return !enhancedSome.apply(this, arguments); - } - - function arrayCount(arr, f) { - if (isUndefined(f)) { - return arr.length; - } - return enhancedFilter.apply(this, arguments).length; - } - - // Enhanced methods - - function buildEnhancedMapping(name) { - return wrapNativeArrayMethod(name, enhancedMapping); - } - - - function buildEnhancedMatching(name) { - return wrapNativeArrayMethod(name, enhancedMatching); - } - - function enhancedMapping(map, context) { - if (isFunction(map)) { - return map; - } else if (map) { - return function(el, i, arr) { - return mapWithShortcuts(el, map, context, [el, i, arr]); - }; - } - } - - function enhancedMatching(f) { - var matcher; - if (isFunction(f)) { - return f; - } - matcher = getMatcher(f); - return function(el, i, arr) { - return matcher(el, i, arr); - }; - } - - function wrapNativeArrayMethod(methodName, wrapper) { - var nativeFn = Array.prototype[methodName]; - return function(arr, f, context, argsLen) { - var args = new Array(2); - assertArgument(argsLen > 0); - args[0] = wrapper(f, context); - args[1] = context; - return nativeFn.apply(arr, args); - }; - } - - - /*** - * @method [fn]FromIndex(startIndex, [loop], ...) - * @returns Mixed - * @short Runs native array functions beginning from `startIndex`. - * @extra If [loop] is `true`, once the end of the array has been reached, - * iteration will continue from the start of the array up to - * `startIndex - 1`. If [loop] is false it can be omitted. Standard - * arguments are then passed which will be forwarded to the native - * methods. When available, methods are always `enhanced`. This includes - * `deep properties` for `map`, and `enhanced matching` for `some`, - * `every`, `filter`, `find`, and `findIndex`. Note also that - * `forEachFromIndex` is optimized for sparse arrays and may be faster - * than native `forEach`. - * - * @set - * mapFromIndex - * forEachFromIndex - * filterFromIndex - * someFromIndex - * everyFromIndex - * reduceFromIndex - * reduceRightFromIndex - * findFromIndex - * findIndexFromIndex - * - * @example - * - * users.mapFromIndex(2, 'name'); - * users.mapFromIndex(2, true, 'name'); - * names.forEachFromIndex(10, log); - * names.everyFromIndex(15, /^[A-F]/); - * - * @signature [fn]FromIndex(startIndex, ...) - * @param {number} startIndex - * @param {boolean} loop - * - ***/ - function buildFromIndexMethods() { - - var methods = { - 'forEach': { - base: forEachAsNative - }, - 'map': { - wrapper: enhancedMapping - }, - 'some every': { - wrapper: enhancedMatching - }, - 'findIndex': { - wrapper: enhancedMatching, - result: indexResult - }, - 'reduce': { - apply: applyReduce - }, - 'filter find': { - wrapper: enhancedMatching - }, - 'reduceRight': { - apply: applyReduce, - slice: sliceArrayFromRight, - clamp: clampStartIndexFromRight - } - }; - - forEachProperty(methods, function(opts, key) { - forEach(spaceSplit(key), function(baseName) { - var methodName = baseName + 'FromIndex'; - var fn = createFromIndexWithOptions(baseName, opts); - defineInstanceWithArguments(sugarArray, methodName, fn); - }); - }); - - function forEachAsNative(fn) { - forEach(this, fn); - } - - // Methods like filter and find have a direct association between the value - // returned by the callback and the element of the current iteration. This - // means that when looping, array elements must match the actual index for - // which they are being called, so the array must be sliced. This is not the - // case for methods like forEach and map, which either do not use return - // values or use them in a way that simply getting the element at a shifted - // index will not affect the final return value. However, these methods will - // still fail on sparse arrays, so always slicing them here. For example, if - // "forEachFromIndex" were to be called on [1,,2] from index 1, although the - // actual index 1 would itself would be skipped, when the array loops back to - // index 0, shifting it by adding 1 would result in the element for that - // iteration being undefined. For shifting to work, all gaps in the array - // between the actual index and the shifted index would have to be accounted - // for. This is infeasible and is easily solved by simply slicing the actual - // array instead so that gaps align. Note also that in the case of forEach, - // we are using the internal function which handles sparse arrays in a way - // that does not increment the index, and so is highly optimized compared to - // the others here, which are simply going through the native implementation. - function sliceArrayFromLeft(arr, startIndex, loop) { - var result = arr; - if (startIndex) { - result = arr.slice(startIndex); - if (loop) { - result = result.concat(arr.slice(0, startIndex)); - } - } - return result; - } - - // When iterating from the right, indexes are effectively shifted by 1. - // For example, iterating from the right from index 2 in an array of 3 - // should also include the last element in the array. This matches the - // "lastIndexOf" method which also iterates from the right. - function sliceArrayFromRight(arr, startIndex, loop) { - if (!loop) { - startIndex += 1; - arr = arr.slice(0, max(0, startIndex)); - } - return arr; - } - - function clampStartIndex(startIndex, len) { - return min(len, max(0, startIndex)); - } - - // As indexes are shifted by 1 when starting from the right, clamping has to - // go down to -1 to accommodate the full range of the sliced array. - function clampStartIndexFromRight(startIndex, len) { - return min(len, max(-1, startIndex)); - } - - function applyReduce(arr, startIndex, fn, context, len, loop) { - return function(acc, val, i) { - i = getNormalizedIndex(i + startIndex, len, loop); - return fn.call(arr, acc, val, i, arr); - }; - } - - function applyEach(arr, startIndex, fn, context, len, loop) { - return function(el, i) { - i = getNormalizedIndex(i + startIndex, len, loop); - return fn.call(context, arr[i], i, arr); - }; - } - - function indexResult(result, startIndex, len) { - if (result !== -1) { - result = (result + startIndex) % len; - } - return result; - } - - function createFromIndexWithOptions(methodName, opts) { - - var baseFn = opts.base || Array.prototype[methodName], - applyCallback = opts.apply || applyEach, - sliceArray = opts.slice || sliceArrayFromLeft, - clampIndex = opts.clamp || clampStartIndex, - getResult = opts.result, - wrapper = opts.wrapper; - - return function(arr, startIndex, args) { - var callArgs = [], argIndex = 0, lastArg, result, len, loop, fn; - len = arr.length; - if (isBoolean(args[0])) { - loop = args[argIndex++]; - } - fn = args[argIndex++]; - lastArg = args[argIndex]; - if (startIndex < 0) { - startIndex += len; - } - startIndex = clampIndex(startIndex, len); - assertArgument(args.length); - fn = wrapper ? wrapper(fn, lastArg) : fn; - callArgs.push(applyCallback(arr, startIndex, fn, lastArg, len, loop)); - if (lastArg) { - callArgs.push(lastArg); - } - result = baseFn.apply(sliceArray(arr, startIndex, loop), callArgs); - if (getResult) { - result = getResult(result, startIndex, len); - } - return result; - }; - } - } - - defineInstance(sugarArray, { - - /*** - * @method map(map, [context]) - * @returns New Array - * @polyfill ES5 - * @short Maps the array to another array whose elements are the values - * returned by `map`. - * @extra [context] is the `this` object. Sugar enhances this method to accept - * a string for `map`, which is a shortcut for a function that gets - * a property or invokes a function on each element. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].map(function(n) { - * return n * 3; - * }); -> [3,6,9] - * - * ['a','aa','aaa'].map('length') -> [1,2,3] - * ['A','B','C'].map('toLowerCase') -> ['a','b','c'] - * users.map('name') -> array of user names - * - * @param {string|mapFn} map - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'map': fixArgumentLength(enhancedMap), - - /*** - * @method some(search, [context]) - * @returns Boolean - * @polyfill ES5 - * @short Returns true if `search` is true for any element in the array. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','b','c'].some(function(n) { - * return n == 'a'; - * }); - * ['a','b','c'].some(function(n) { - * return n == 'd'; - * }); - * ['a','b','c'].some('a') -> true - * [{a:2},{b:5}].some({a:2}) -> true - * users.some({ name: /^H/ }) -> true if any have a name starting with H - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'some': fixArgumentLength(enhancedSome), - - /*** - * @method every(search, [context]) - * @returns Boolean - * @polyfill ES5 - * @short Returns true if `search` is true for all elements of the array. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','a','a'].every(function(n) { - * return n == 'a'; - * }); - * ['a','a','a'].every('a') -> true - * [{a:2},{a:2}].every({a:2}) -> true - * users.every({ name: /^H/ }) -> true if all have a name starting with H - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'every': fixArgumentLength(enhancedEvery), - - /*** - * @method filter(search, [context]) - * @returns Array - * @polyfill ES5 - * @short Returns any elements in the array that match `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].filter(function(n) { - * return n > 1; - * }); - * [1,2,2,4].filter(2) -> 2 - * users.filter({ name: /^H/ }) -> all users with a name starting with H - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'filter': fixArgumentLength(enhancedFilter), - - /*** - * @method find(search, [context]) - * @returns Mixed - * @polyfill ES6 - * @short Returns the first element in the array that matches `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * users.find(function(user) { - * return user.name === 'Harry'; - * }); -> harry! - * - * users.find({ name: 'Harry' }); -> harry! - * users.find({ name: /^[A-H]/ }); -> First user with name starting with A-H - * users.find({ titles: ['Ms', 'Dr'] }); -> not harry! - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'find': fixArgumentLength(enhancedFind), - - /*** - * @method findIndex(search, [context]) - * @returns Number - * @polyfill ES6 - * @short Returns the index of the first element in the array that matches - * `search`, or `-1` if none. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3,4].findIndex(function(n) { - * return n % 2 == 0; - * }); -> 1 - * ['a','b','c'].findIndex('c'); -> 2 - * ['cuba','japan','canada'].find(/^c/) -> 0 - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'findIndex': fixArgumentLength(enhancedFindIndex) - - }, [ENHANCEMENTS_FLAG, ARRAY_ENHANCEMENTS_FLAG]); - - - defineInstance(sugarArray, { - - /*** - * @method none(search, [context]) - * - * @returns Boolean - * @short Returns true if none of the elements in the array match `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].none(5) -> true - * ['a','b','c'].none(/b/) -> false - * users.none(function(user) { - * return user.name == 'Wolverine'; - * }); -> probably true - * users.none({ name: 'Wolverine' }); -> same as above - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'none': fixArgumentLength(arrayNone), - - /*** - * @method count(search, [context]) - * @returns Number - * @short Counts all elements in the array that match `search`. - * @extra `search` can be an element or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','b','a'].count('a') -> 2 - * ['a','b','c'].count(/b/) -> 1 - * users.count(function(user) { - * return user.age > 30; - * }); -> number of users older than 30 - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'count': fixArgumentLength(arrayCount), - - /*** - * @method min([all] = false, [map]) - * @returns Mixed - * @short Returns the element in the array with the lowest value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, multiple elements will be returned. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].min() -> 1 - * ['fee','fo','fum'].min('length') -> 'fo' - * ['fee','fo','fum'].min(true, 'length') -> ['fo'] - * users.min('age') -> youngest guy! - * - * ['fee','fo','fum'].min(true, function(n) { - * return n.length; - * }); -> ['fo'] - * - * @signature min([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'min': function(arr, all, map) { - return getMinOrMax(arr, all, map); - }, - - /*** - * @method max([all] = false, [map]) - * @returns Mixed - * @short Returns the element in the array with the greatest value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, multiple elements will be returned. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].max() -> 3 - * ['fee','fo','fum'].max('length') -> 'fee' - * ['fee','fo','fum'].max(true, 'length') -> ['fee','fum'] - * users.max('age') -> oldest guy! - * - * ['fee','fo','fum'].max(true, function(n) { - * return n.length; - * }); -> ['fee', 'fum'] - * - * @signature max([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'max': function(arr, all, map) { - return getMinOrMax(arr, all, map, true); - }, - - /*** - * @method least([all] = false, [map]) - * @returns Array - * @short Returns the elements in the array with the least commonly occuring value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, will return multiple values in an array. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [3,2,2].least() -> 3 - * ['fe','fo','fum'].least(true, 'length') -> ['fum'] - * users.least('profile.type') -> (user with least commonly occurring type) - * users.least(true, 'profile.type') -> (users with least commonly occurring type) - * - * @signature least([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'least': function(arr, all, map) { - return getLeastOrMost(arr, all, map); - }, - - /*** - * @method most([all] = false, [map]) - * @returns Array - * @short Returns the elements in the array with the most commonly occuring value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, will return multiple values in an array. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [3,2,2].most(2) -> 2 - * ['fe','fo','fum'].most(true, 'length') -> ['fe','fo'] - * users.most('profile.type') -> (user with most commonly occurring type) - * users.most(true, 'profile.type') -> (users with most commonly occurring type) - * - * @signature most([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'most': function(arr, all, map) { - return getLeastOrMost(arr, all, map, true); - }, - - /*** - * @method sum([map]) - * @returns Number - * @short Sums all values in the array. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * summed or a string acting as a shortcut. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,2].sum() -> 5 - * users.sum(function(user) { - * return user.votes; - * }); -> total votes! - * users.sum('votes') -> total votes! - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'sum': function(arr, map) { - return sum(arr, map); - }, - - /*** - * @method average([map]) - * @returns Number - * @short Gets the mean average for all values in the array. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3,4].average() -> 2 - * users.average(function(user) { - * return user.age; - * }); -> average user age - * users.average('age') -> average user age - * users.average('currencies.usd.balance') -> average USD balance - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'average': function(arr, map) { - return average(arr, map); - }, - - /*** - * @method median([map]) - * @returns Number - * @short Gets the median average for all values in the array. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,2].median() -> 2 - * [{a:1},{a:2},{a:2}].median('a') -> 2 - * users.median('age') -> median user age - * users.median('currencies.usd.balance') -> median USD balance - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'median': function(arr, map) { - return median(arr, map); - } - - }); - - - /*** @namespace Object ***/ - - // Object matchers - var objectSome = wrapObjectMatcher('some'), - objectFind = wrapObjectMatcher('find'), - objectEvery = wrapObjectMatcher('every'); - - function objectForEach(obj, fn) { - assertCallable(fn); - forEachProperty(obj, function(val, key) { - fn(val, key, obj); - }); - return obj; - } - - function objectMap(obj, map) { - var result = {}; - forEachProperty(obj, function(val, key) { - result[key] = mapWithShortcuts(val, map, obj, [val, key, obj]); - }); - return result; - } - - function objectReduce(obj, fn, acc) { - var init = isDefined(acc); - forEachProperty(obj, function(val, key) { - if (!init) { - acc = val; - init = true; - return; - } - acc = fn(acc, val, key, obj); - }); - return acc; - } - - function objectNone(obj, f) { - return !objectSome(obj, f); - } - - function objectFilter(obj, f) { - var matcher = getMatcher(f), result = {}; - forEachProperty(obj, function(val, key) { - if (matcher(val, key, obj)) { - result[key] = val; - } - }); - return result; - } - - function objectCount(obj, f) { - var matcher = getMatcher(f), count = 0; - forEachProperty(obj, function(val, key) { - if (matcher(val, key, obj)) { - count++; - } - }); - return count; - } - - // Support - - function wrapObjectMatcher(name) { - var nativeFn = Array.prototype[name]; - return function(obj, f) { - var matcher = getMatcher(f); - return nativeFn.call(getKeys(obj), function(key) { - return matcher(obj[key], key, obj); - }); - }; - } - - defineInstanceAndStatic(sugarObject, { - - /*** - * @method forEach(eachFn) - * @returns Object - * @short Runs `eachFn` against each property in the object. - * @extra Does not iterate over inherited or non-enumerable properties. - * - * @callback eachFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.forEach({a:'b'}, function(val, key) { - * // val = 'b', key = a - * }); - * - * @param {eachFn} eachFn - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * - ***/ - 'forEach': function(obj, eachFn) { - return objectForEach(obj, eachFn); - }, - - /*** - * @method map(map) - * @returns Object - * @short Maps the object to another object whose properties are the values - * returned by `map`. - * @extra `map` can be a function of type `mapFn` or a string that acts as a - * shortcut and gets a property or invokes a function on each element. - * Supports `deep properties`. - * - * @callback mapFn - * - * val The value of the current property. - * key The key of the current property. - * obj A reference to the object. - * - * @example - * - * data.map(function(val, key) { - * return key; - * }); -> {a:'b'} - * users.map('age'); - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'map': function(obj, map) { - return objectMap(obj, map); - }, - - /*** - * @method some(search) - * @returns Boolean - * @short Returns true if `search` is true for any property in the object. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.some({a:1,b:2}, function(val) { - * return val == 1; - * }); -> true - * Object.some({a:1,b:2}, 1); -> true - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'some': objectSome, - - /*** - * @method every(search) - * @returns Boolean - * @short Returns true if `search` is true for all properties in the object. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.every({a:1,b:2}, function(val) { - * return val > 0; - * }); -> true - * Object.every({a:'a',b:'b'}, /[a-z]/); -> true - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'every': objectEvery, - - /*** - * @method filter(search) - * @returns Array - * @short Returns a new object with properties that match `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.filter({a:1,b:2}, function(val) { - * return val == 1; - * }); -> {a:1} - * Object.filter({a:'a',z:'z'}, /[a-f]/); -> {a:'a'} - * Object.filter(usersByName, /^H/); -> all users with names starting with H - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'filter': function(obj, f) { - return objectFilter(obj, f); - }, - - /*** - * @method reduce(reduceFn, [init]) - * @returns Mixed - * @short Reduces the object to a single result. - * @extra This operation is sometimes called "accumulation", as it takes the - * result of the last iteration of `fn` and passes it as the first - * argument to the next iteration, "accumulating" that value as it goes. - * The return value of this method will be the return value of the final - * iteration of `fn`. If [init] is passed, it will be the initial - * "accumulator" (the first argument). If [init] is not passed, then a - * property of the object will be used instead and `fn` will not be - * called for that property. Note that object properties have no order, - * and this may lead to bugs (for example if performing division or - * subtraction operations on a value). If order is important, use an - * array instead! - * - * @callback reduceFn - * - * acc The "accumulator", either [init], the result of the last iteration - * of `fn`, or a property of `obj`. - * val The value of the current property called for `fn`. - * key The key of the current property called for `fn`. - * obj A reference to the object. - * - * @example - * - * Object.reduce({a:2,b:4}, function(a, b) { - * return a * b; - * }); -> 8 - * - * Object.reduce({a:2,b:4}, function(a, b) { - * return a * b; - * }, 10); -> 80 - * - * - * @param {reduceFn} reduceFn - * @param {any} [init] - * @callbackParam {Property} acc - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * - ***/ - 'reduce': function(obj, fn, init) { - return objectReduce(obj, fn, init); - }, - - /*** - * @method find(search) - * @returns Boolean - * @short Returns the first key whose value matches `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. Note that "first" is - * implementation-dependent. If order is important an array should be - * used instead. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.find({a:1,b:2}, function(val) { - * return val == 2; - * }); -> 'b' - * Object.find({a:'a',b:'b'}, /[a-z]/); -> 'a' - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'find': objectFind, - - /*** - * @method count(search) - * @returns Number - * @short Counts all properties in the object that match `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.count({a:'a',b:'b',c:'a'}, 'a') -> 2 - * Object.count(usersByName, function(user) { - * return user.age > 30; - * }); -> number of users older than 30 - * Object.count(usersByName, { name: /^[H-Z]/ }); - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'count': function(obj, f) { - return objectCount(obj, f); - }, - - /*** - * @method none(search) - * @returns Boolean - * @short Returns true if none of the properties in the object match `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.none({a:1,b:2}, 3); -> true - * Object.none(usersByName, function(user) { - * return user.name == 'Wolverine'; - * }); -> probably true - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'none': function(obj, f) { - return objectNone(obj, f); - }, - - /*** - * @method sum([map]) - * @returns Number - * @short Sums all properties in the object. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * summed or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.sum({a:35,b:13}); -> 48 - * Object.sum(usersByName, function(user) { - * return user.votes; - * }); -> total user votes - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'sum': function(obj, map) { - return sum(obj, map); - }, - - /*** - * @method average([map]) - * @returns Number - * @short Gets the mean average of all properties in the object. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.average({a:35,b:11}); -> 23 - * Object.average(usersByName, 'age'); -> average user age - * Object.average(usersByName, 'currencies.usd.balance'); -> USD mean balance - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'average': function(obj, map) { - return average(obj, map); - }, - - /*** - * @method median([map]) - * @returns Number - * @short Gets the median average of all properties in the object. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.median({a:1,b:2,c:2}) -> 2 - * Object.median(usersByName, 'age'); -> median user age - * Object.median(usersByName, 'currencies.usd.balance'); -> USD median balance - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'median': function(obj, map) { - return median(obj, map); - }, - - /*** - * @method min([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the lowest value. - * @extra If [all] is true, will return an object with all properties in the - * object with the lowest value. [map] can be passed in place of [all] - * and is a function of type `mapFn` that maps the value to be checked - * or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.min({a:1,b:2,c:3}) -> 'a' - * Object.min({a:'aaa',b:'bb',c:'c'}, 'length') -> 'c' - * Object.min({a:1,b:1,c:3}, true) -> {a:1,b:1} - * - * @signature min([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'min': function(obj, all, map) { - return getMinOrMax(obj, all, map, false, true); - }, - - /*** - * @method max([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the highest value. - * @extra If [all] is true, will return an object with all properties in the - * object with the highest value. [map] can be passed in place of [all] - * and is a function of type `mapFn` that maps the value to be checked - * or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.max({a:1,b:2,c:3}) -> 'c' - * Object.max({a:'aaa',b:'bb',c:'c'}, 'length') -> 'a' - * Object.max({a:1,b:3,c:3}, true) -> {b:3,c:3} - * - * @signature max([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'max': function(obj, all, map) { - return getMinOrMax(obj, all, map, true, true); - }, - - /*** - * @method least([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the least commonly - * occuring value. - * @extra If [all] is true, will return an object with all properties in the - * object with the least common value. [map] can be passed in place of - * [all] and is a function of type `mapFn` that maps the value to be - * checked or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.least({a:1,b:3,c:3}) -> 'a' - * Object.least({a:'aa',b:'bb',c:'c'}, 'length') -> 'c' - * Object.least({a:1,b:3,c:3}, true) -> {a:1} - * - * @signature least([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'least': function(obj, all, map) { - return getLeastOrMost(obj, all, map, false, true); - }, - - /*** - * @method most([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the most commonly - * occuring value. - * @extra If [all] is true, will return an object with all properties in the - * object with the most common value. [map] can be passed in place of - * [all] and is a function of type `mapFn` that maps the value to be - * checked or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.most({a:1,b:3,c:3}) -> 'b' - * Object.most({a:'aa',b:'bb',c:'c'}, 'length') -> 'a' - * Object.most({a:1,b:3,c:3}, true) -> {b:3,c:3} - * - * @signature most([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'most': function(obj, all, map) { - return getLeastOrMost(obj, all, map, true, true); - } - - }); - - - buildFromIndexMethods(); - - /*** - * @module Number - * @description Number formatting, precision rounding, Math aliases, and more. - * - ***/ - - - var NUMBER_OPTIONS = { - 'decimal': HALF_WIDTH_PERIOD, - 'thousands': HALF_WIDTH_COMMA - }; - - // Abbreviation Units - var BASIC_UNITS = '|kmbt', - MEMORY_UNITS = '|KMGTPE', - MEMORY_BINARY_UNITS = '|,Ki,Mi,Gi,Ti,Pi,Ei', - METRIC_UNITS_SHORT = 'nμm|k', - METRIC_UNITS_FULL = 'yzafpnμm|KMGTPEZY'; - - - /*** - * @method getOption(name) - * @returns Mixed - * @accessor - * @short Gets an option used internally by Number. - * @example - * - * Sugar.Number.getOption('thousands'); - * - * @param {string} name - * - *** - * @method setOption(name, value) - * @accessor - * @short Sets an option used internally by Number. - * @extra If `value` is `null`, the default value will be restored. - * @options - * - * decimal A string used as the decimal marker by `format`, `abbr`, - * `metric`, and `bytes`. Default is `.`. - * - * thousands A string used as the thousands marker by `format`, `abbr`, - * `metric`, and `bytes`. Default is `,`. - * - * - * @example - * - * Sugar.Number.setOption('decimal', ','); - * Sugar.Number.setOption('thousands', ' '); - * - * @signature setOption(options) - * @param {NumberOptions} options - * @param {string} name - * @param {any} value - * @option {string} decimal - * @option {string} thousands - * - ***/ - var _numberOptions = defineOptionsAccessor(sugarNumber, NUMBER_OPTIONS); - - - function abbreviateNumber(num, precision, ustr, bytes) { - var fixed = num.toFixed(20), - decimalPlace = fixed.search(/\./), - numeralPlace = fixed.search(/[1-9]/), - significant = decimalPlace - numeralPlace, - units, unit, mid, i, divisor; - if (significant > 0) { - significant -= 1; - } - units = commaSplit(ustr); - if (units.length === 1) { - units = ustr.split(''); - } - mid = units.indexOf('|'); - if (mid === -1) { - // Skipping the placeholder means the units should start from zero, - // otherwise assume they end at zero. - mid = units[0] === '_' ? 0 : units.length; - } - i = max(min(floor(significant / 3), units.length - mid - 1), -mid); - unit = units[i + mid]; - while (unit === '_') { - i += i < 0 ? -1 : 1; - unit = units[i + mid]; - } - if (unit === '|') { - unit = ''; - } - if (significant < -9) { - precision = abs(significant) - 9; - } - divisor = bytes ? pow(2, 10 * i) : pow(10, i * 3); - return numberFormat(withPrecision(num / divisor, precision || 0)) + unit; - } - - function numberFormat(num, place) { - var result = '', thousands, decimal, fraction, integer, split, str; - - decimal = _numberOptions('decimal'); - thousands = _numberOptions('thousands'); - - if (isNumber(place)) { - str = withPrecision(num, place || 0).toFixed(max(place, 0)); - } else { - str = num.toString(); - } - - str = str.replace(/^-/, ''); - split = periodSplit(str); - integer = split[0]; - fraction = split[1]; - if (/e/.test(str)) { - result = str; - } else { - for(var i = integer.length; i > 0; i -= 3) { - if (i < integer.length) { - result = thousands + result; - } - result = integer.slice(max(0, i - 3), i) + result; - } - } - if (fraction) { - result += decimal + repeatString('0', (place || 0) - fraction.length) + fraction; - } - return (num < 0 ? '-' : '') + result; - } - - function isInteger(n) { - return n % 1 === 0; - } - - function isMultipleOf(n1, n2) { - return n1 % n2 === 0; - } - - function createRoundingFunction(fn) { - return function(n, precision) { - return precision ? withPrecision(n, precision, fn) : fn(n); - }; - } - - defineStatic(sugarNumber, { - - /*** - * @method random([n1], [n2]) - * @returns Number - * @static - * @short Returns a random integer from [n1] to [n2] (both inclusive). - * @extra If only 1 number is passed, the other will be 0. If none are passed, - * the number will be either 0 or 1. - * - * @example - * - * Number.random(50, 100) -> ex. 85 - * Number.random(50) -> ex. 27 - * Number.random() -> ex. 0 - * - * @param {number} [n1] - * @param {number} [n2] - * - ***/ - 'random': function(n1, n2) { - var minNum, maxNum; - if (arguments.length == 1) n2 = n1, n1 = 0; - minNum = min(n1 || 0, isUndefined(n2) ? 1 : n2); - maxNum = max(n1 || 0, isUndefined(n2) ? 1 : n2) + 1; - return trunc((Math.random() * (maxNum - minNum)) + minNum); - } - - }); - - defineInstance(sugarNumber, { - - /*** - * @method isInteger() - * @returns Boolean - * @short Returns true if the number has no trailing decimal. - * - * @example - * - * (420).isInteger() -> true - * (4.5).isInteger() -> false - * - ***/ - 'isInteger': function(n) { - return isInteger(n); - }, - - /*** - * @method isOdd() - * @returns Boolean - * @short Returns true if the number is odd. - * - * @example - * - * (3).isOdd() -> true - * (18).isOdd() -> false - * - ***/ - 'isOdd': function(n) { - return isInteger(n) && !isMultipleOf(n, 2); - }, - - /*** - * @method isEven() - * @returns Boolean - * @short Returns true if the number is even. - * - * @example - * - * (6).isEven() -> true - * (17).isEven() -> false - * - ***/ - 'isEven': function(n) { - return isMultipleOf(n, 2); - }, - - /*** - * @method isMultipleOf(num) - * @returns Boolean - * @short Returns true if the number is a multiple of `num`. - * - * @example - * - * (6).isMultipleOf(2) -> true - * (17).isMultipleOf(2) -> false - * (32).isMultipleOf(4) -> true - * (34).isMultipleOf(4) -> false - * - * @param {number} num - * - ***/ - 'isMultipleOf': function(n, num) { - return isMultipleOf(n, num); - }, - - /*** - * @method log([base] = Math.E) - * @returns Number - * @short Returns the logarithm of the number with `base`, or the natural - * logarithm of the number if `base` is undefined. - * - * @example - * - * (64).log(2) -> 6 - * (9).log(3) -> 2 - * (5).log() -> 1.6094379124341003 - * - * @param {number} [base] - * - ***/ - 'log': function(n, base) { - return Math.log(n) / (base ? Math.log(base) : 1); - }, - - /*** - * @method abbr([precision] = 0) - * @returns String - * @short Returns an abbreviated form of the number ("k" for thousand, "m" - * for million, etc). - * @extra [precision] will round to the given precision. `thousands` and - * `decimal` allow custom separators to be used. - * - * @example - * - * (1000).abbr() -> "1k" - * (1000000).abbr() -> "1m" - * (1280).abbr(1) -> "1.3k" - * - * @param {number} [precision] - * - ***/ - 'abbr': function(n, precision) { - return abbreviateNumber(n, precision, BASIC_UNITS); - }, - - /*** - * @method metric([precision] = 0, [units] = "nμm|k") - * @returns String - * @short Returns the number as a string in metric notation. - * @extra [precision] will round to the given precision (can be negative). - * [units] is a string that determines both the unit notation and the - * min/max unit allowed. The default is natural notation for common - * units (meters, grams, etc). "all" can be passed for [units] and is a - * shortcut to all standard SI units. The token `,` if present separates - * units, otherwise each character is a unit. The token `|` if present - * marks where fractional units end, otherwise no fractional units are - * used. Finally, the token `_` if present is a placeholder for no unit. - * - * @example - * - * (1000).metric() -> "1k" - * (1000000).metric() -> "1,000k" - * (1249).metric(2) + 'g' -> "1.25kg" - * (0.025).metric() + 'm' -> "25mm" - * (1000000).metric(0, 'nμm|kM') -> "1M" - * - * @param {number} [precision] - * @param {string} [units] - * - ***/ - 'metric': function(n, precision, units) { - if (units === 'all') { - units = METRIC_UNITS_FULL; - } else if (!units) { - units = METRIC_UNITS_SHORT; - } - return abbreviateNumber(n, precision, units); - }, - - /*** - * @method bytes([precision] = 0, [binary] = false, [units] = 'si') - * @returns String - * @short Returns an abbreviated form of the number, with 'B' on the end for "bytes". - * @extra [precision] will round to the given precision. If [binary] is `true`, - * powers of 1024 will be used instead of 1000, and units will default - * to the binary units "KiB", "MiB", etc. Units can be overridden by - * passing "si" or "binary" for [units], or further customized by - * passing a unit string. See `metric` for more. - * - * @example - * - * (1000).bytes() -> "1KB" - * (1289).bytes(2) -> "1.29KB" - * (1000).bytes(2, true) -> "0.98KiB" - * (1000).bytes(2, true, 'si') -> "0.98KB" - * - * @param {number} [precision] - * @param {boolean} [binary] - * @param {string} [units] - * - ***/ - 'bytes': function(n, precision, binary, units) { - if (units === 'binary' || (!units && binary)) { - units = MEMORY_BINARY_UNITS; - } else if(units === 'si' || !units) { - units = MEMORY_UNITS; - } - return abbreviateNumber(n, precision, units, binary) + 'B'; - }, - - /*** - * @method format([place] = 0) - * @returns String - * @short Formats the number to a readable string. - * @extra If [place] is `undefined`, the place will automatically be determined. - * `thousands` and `decimal` allow custom markers to be used. - * - * @example - * - * (56782).format() -> '56,782' - * (56782).format(2) -> '56,782.00' - * (4388.43).format(2) -> '4,388.43' - * - * @param {number} [place] - * - ***/ - 'format': function(n, place) { - return numberFormat(n, place); - }, - - /*** - * @method hex([pad] = 1) - * @returns String - * @short Converts the number to hexidecimal. - * @extra [pad] will pad the resulting string to that many places. - * - * @example - * - * (255).hex() -> 'ff'; - * (255).hex(4) -> '00ff'; - * (23654).hex() -> '5c66'; - * - * @param {number} [pad] - * - ***/ - 'hex': function(n, pad) { - return padNumber(n, pad || 1, false, 16); - }, - - /*** - * @method times(indexMapFn) - * @returns Mixed - * @short Calls `indexMapFn` a number of times equivalent to the number. - * @extra Any non-undefined return values of `indexMapFn` will be collected - * and returned in an array. - * - * @callback indexMapFn - * - * i The index of the current iteration. - * - * @example - * - * (8).times(logHello) -> logs "hello" 8 times - * (7).times(function(n) { - * return Math.pow(2, n); - * }); - * - * @callbackParam {number} i - * @callbackReturns {any} indexMapFn - * @param {indexMapFn} indexMapFn - * - ***/ - 'times': function(n, indexMapFn) { - var arr, result; - for(var i = 0; i < n; i++) { - result = indexMapFn.call(n, i); - if (isDefined(result)) { - if (!arr) { - arr = []; - } - arr.push(result); - } - } - return arr; - }, - - /*** - * @method chr() - * @returns String - * @short Returns a string at the code point of the number. - * - * @example - * - * (65).chr() -> "A" - * (75).chr() -> "K" - * - ***/ - 'chr': function(n) { - return chr(n); - }, - - /*** - * @method pad([place] = 0, [sign] = false, [base] = 10) - * @returns String - * @short Pads a number with "0" to `place`. - * @extra [sign] allows you to force the sign as well (+05, etc). [base] can - * change the base for numeral conversion. - * - * @example - * - * (5).pad(2) -> '05' - * (-5).pad(4) -> '-0005' - * (82).pad(3, true) -> '+082' - * - * @param {number} place - * @param {boolean} [sign] - * @param {number} [base] - * - ***/ - 'pad': function(n, place, sign, base) { - return padNumber(n, place, sign, base); - }, - - /*** - * @method ordinalize() - * @returns String - * @short Returns an ordinalized English string, i.e. "1st", "2nd", etc. - * - * @example - * - * (1).ordinalize() -> '1st'; - * (2).ordinalize() -> '2nd'; - * (8).ordinalize() -> '8th'; - * - ***/ - 'ordinalize': function(n) { - var num = abs(n), last = +num.toString().slice(-2); - return n + getOrdinalSuffix(last); - }, - - /*** - * @method toNumber() - * @returns Number - * @short Identity function for compatibilty. - * - * @example - * - * (420).toNumber() -> 420 - * - ***/ - 'toNumber': function(n) { - return n.valueOf(); - }, - - /*** - * @method round([precision] = 0) - * @returns Number - * @short Shortcut for `Math.round` that also allows a `precision`. - * - * @example - * - * (3.241).round() -> 3 - * (-3.841).round() -> -4 - * (3.241).round(2) -> 3.24 - * (3748).round(-2) -> 3800 - * - * @param {number} [precision] - * - ***/ - 'round': createRoundingFunction(round), - - /*** - * @method ceil([precision] = 0) - * @returns Number - * @short Shortcut for `Math.ceil` that also allows a `precision`. - * - * @example - * - * (3.241).ceil() -> 4 - * (-3.241).ceil() -> -3 - * (3.241).ceil(2) -> 3.25 - * (3748).ceil(-2) -> 3800 - * - * @param {number} [precision] - * - ***/ - 'ceil': createRoundingFunction(ceil), - - /*** - * @method floor([precision] = 0) - * @returns Number - * @short Shortcut for `Math.floor` that also allows a `precision`. - * - * @example - * - * (3.241).floor() -> 3 - * (-3.841).floor() -> -4 - * (3.241).floor(2) -> 3.24 - * (3748).floor(-2) -> 3700 - * - * @param {number} [precision] - * - ***/ - 'floor': createRoundingFunction(floor) - - }); - - /*** - * @method [math]() - * @returns Number - * @short Math related functions are mapped as shortcuts to numbers and are - * identical. Note that `log` provides some special defaults. - * - * @set - * abs - * sin - * asin - * cos - * acos - * tan - * atan - * sqrt - * exp - * pow - * - * @example - * - * (3).pow(3) -> 27 - * (-3).abs() -> 3 - * (1024).sqrt() -> 32 - * - ***/ - function buildMathAliases() { - defineInstanceSimilar(sugarNumber, 'abs pow sin asin cos acos tan atan exp pow sqrt', function(methods, name) { - methods[name] = function(n, arg) { - // Note that .valueOf() here is only required due to a - // very strange bug in iOS7 that only occurs occasionally - // in which Math.abs() called on non-primitive numbers - // returns a completely different number (Issue #400) - return Math[name](n.valueOf(), arg); - }; - }); - } - - buildMathAliases(); - - /*** - * @module Function - * @description Lazy, throttled, and memoized functions, delayed functions and - * handling of timers, argument currying. - * - ***/ - - var _lock = privatePropertyAccessor('lock'); - var _timers = privatePropertyAccessor('timers'); - var _partial = privatePropertyAccessor('partial'); - var _canceled = privatePropertyAccessor('canceled'); - - // istanbul ignore next - var createInstanceFromPrototype = Object.create || function(prototype) { - var ctor = function() {}; - ctor.prototype = prototype; - return new ctor; - }; - - function setDelay(fn, ms, after, scope, args) { - // Delay of infinity is never called of course... - ms = coercePositiveInteger(ms || 0); - if (!_timers(fn)) { - _timers(fn, []); - } - // This is a workaround for <= IE8, which apparently has the - // ability to call timeouts in the queue on the same tick (ms?) - // even if functionally they have already been cleared. - _canceled(fn, false); - _timers(fn).push(setTimeout(function() { - if (!_canceled(fn)) { - after.apply(scope, args || []); - } - }, ms)); - } - - function cancelFunction(fn) { - var timers = _timers(fn), timer; - if (isArray(timers)) { - while(timer = timers.shift()) { - clearTimeout(timer); - } - } - _canceled(fn, true); - return fn; - } - - function createLazyFunction(fn, ms, immediate, limit) { - var queue = [], locked = false, execute, rounded, perExecution, result; - ms = ms || 1; - limit = limit || Infinity; - rounded = ceil(ms); - perExecution = round(rounded / ms) || 1; - execute = function() { - var queueLength = queue.length, maxPerRound; - if (queueLength == 0) return; - // Allow fractions of a millisecond by calling - // multiple times per actual timeout execution - maxPerRound = max(queueLength - perExecution, 0); - while(queueLength > maxPerRound) { - // Getting uber-meta here... - result = Function.prototype.apply.apply(fn, queue.shift()); - queueLength--; - } - setDelay(lazy, rounded, function() { - locked = false; - execute(); - }); - }; - function lazy() { - // If the execution has locked and it's immediate, then - // allow 1 less in the queue as 1 call has already taken place. - if (queue.length < limit - (locked && immediate ? 1 : 0)) { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - queue.push([this, args]); - } - if (!locked) { - locked = true; - if (immediate) { - execute(); - } else { - setDelay(lazy, rounded, execute); - } - } - // Return the memoized result - return result; - } - return lazy; - } - - // Collecting arguments in an array instead of - // passing back the arguments object which will - // deopt this function in V8. - function collectArguments() { - var args = arguments, i = args.length, arr = new Array(i); - while (i--) { - arr[i] = args[i]; - } - return arr; - } - - function createHashedMemoizeFunction(fn, hashFn, limit) { - var map = {}, refs = [], counter = 0; - return function() { - var hashObj = hashFn.apply(this, arguments); - var key = serializeInternal(hashObj, refs); - if (hasOwn(map, key)) { - return getOwn(map, key); - } - if (counter === limit) { - map = {}; - refs = []; - counter = 0; - } - counter++; - return map[key] = fn.apply(this, arguments); - }; - } - - defineInstance(sugarFunction, { - - /*** - * @method lazy([ms] = 1, [immediate] = false, [limit] = Infinity) - * @returns Function - * @short Creates a lazy function that, when called repeatedly, will queue - * execution and wait [ms] milliseconds to execute. - * @extra If [immediate] is `true`, first execution will happen immediately, - * then lock. If [limit] is a fininte number, calls past [limit] will - * be ignored while execution is locked. Compare this to `throttle`, - * which will execute only once per [ms] milliseconds. Note that [ms] - * can also be a fraction. Calling `cancel` on a lazy function will - * clear the entire queue. - * - * @example - * - * var fn = logHello.lazy(250); - * runTenTimes(fn); -> Logs 10 times each time 250ms later - * - * var fn = logHello.lazy(250, false, 5); - * runTenTimes(fn); -> Logs 5 times each time 250ms later - * - * @param {number} [ms] - * @param {number} [limit] - * @param {boolean} [immediate] - * - ***/ - 'lazy': function(fn, ms, immediate, limit) { - return createLazyFunction(fn, ms, immediate, limit); - }, - - /*** - * @method throttle([ms] = 1) - * @returns Function - * @short Creates a "throttled" version of the function that will only be - * executed once per `ms` milliseconds. - * @extra This is functionally equivalent to calling `lazy` with a [limit] of - * `1` and [immediate] as `true`. `throttle` is appropriate when you - * want to make sure a function is only executed at most once for a - * given duration. - * - * @example - * - * var fn = logHello.throttle(50); - * runTenTimes(fn); - * - * @param {number} [ms] - * - ***/ - 'throttle': function(fn, ms) { - return createLazyFunction(fn, ms, true, 1); - }, - - /*** - * @method debounce([ms] = 1) - * @returns Function - * @short Creates a "debounced" function that postpones its execution until - * after `ms` milliseconds have passed. - * @extra This method is useful to execute a function after things have - * "settled down". A good example of this is when a user tabs quickly - * through form fields, execution of a heavy operation should happen - * after a few milliseconds when they have "settled" on a field. - * - * @example - * - * var fn = logHello.debounce(250) - * runTenTimes(fn); -> called once 250ms later - * - * @param {number} [ms] - * - ***/ - 'debounce': function(fn, ms) { - function debounced() { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - cancelFunction(debounced); - setDelay(debounced, ms, fn, this, args); - } - return debounced; - }, - - /*** - * @method cancel() - * @returns Function - * @short Cancels a delayed function scheduled to be run. - * @extra `delay`, `lazy`, `throttle`, and `debounce` can all set delays. - * - * @example - * - * logHello.delay(500).cancel() -> never logs - * - ***/ - 'cancel': function(fn) { - return cancelFunction(fn); - }, - - /*** - * @method after(n) - * @returns Function - * @short Creates a function that will execute after `n` calls. - * @extra `after` is useful for running a final callback after a specific - * number of operations, often when the order in which the operations - * will complete is unknown. The created function will be passed an - * array of the arguments that it has collected from each after `n`. - * Note that the function will execute on every call after `n`. - * Use `once` in conjunction with this method to prevent being - * triggered by subsequent calls. - * - * @example - * - * var fn = logHello.after(5); - * runTenTimes(fn); -> logs 6 times - * - * var fn = logHello.once().after(5) - * runTenTimes(fn); -> logs once - * - * @param {number} [n] - * - ***/ - 'after': function(fn, num) { - var count = 0, collectedArgs = []; - num = coercePositiveInteger(num); - return function() { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - collectedArgs.push(args); - count++; - if (count >= num) { - return fn.call(this, collectedArgs); - } - }; - }, - - /*** - * @method once() - * @returns Function - * @short Creates a function that will execute only once and store the result. - * @extra `once` is useful for creating functions that will cache the result - * of an expensive operation and use it on subsequent calls. Also it - * can be useful for creating initialization functions that only need - * to be run once. - * - * @example - * - * var fn = logHello.once(); - * runTenTimes(fn); -> logs once - * - ***/ - 'once': function(fn) { - var called = false, val; - return function() { - if (called) { - return val; - } - called = true; - return val = fn.apply(this, arguments); - }; - }, - - /*** - * @method memoize([hashFn], [limit]) - * @returns Function - * @short Creates a function that will memoize results for unique calls. - * @extra `memoize` can be thought of as a more powerful `once`. Where `once` - * will only call a function once ever, memoized functions will be - * called once per unique call. A "unique call" is determined by the - * return value of [hashFn], which is passed the arguments of each call. - * If [hashFn] is undefined, it will deeply serialize all arguments, - * such that any different argument signature will result in a unique - * call. [hashFn] may be a string (allows `deep properties`) that acts - * as a shortcut to return a property of the first argument passed. - * [limit] sets an upper limit on memoized results. The default is no - * limit, meaning that unique calls will continue to memoize results. - * For most use cases this is fine, however [limit] is useful for more - * persistent (often server-side) applications for whom memory leaks - * are a concern. - * - * @example - * - * var fn = logHello.memoize(); - * fn(1); fn(1); fn(2); -> logs twice, memoizing once - * - * var fn = calculateUserBalance.memoize('id'); - * fn(Harry); fn(Mark); fn(Mark); -> logs twice, memoizing once - * - * @param {string|Function} [hashFn] - * @param {number} [limit] - * - ***/ - 'memoize': function(fn, arg1, arg2) { - var hashFn, limit, prop; - if (isNumber(arg1)) { - limit = arg1; - } else { - hashFn = arg1; - limit = arg2; - } - if (isString(hashFn)) { - prop = hashFn; - hashFn = function(obj) { - return deepGetProperty(obj, prop); - }; - } else if (!hashFn) { - hashFn = collectArguments; - } - return createHashedMemoizeFunction(fn, hashFn, limit); - }, - - /*** - * @method lock([n]) - * @returns Function - * @short Locks the number of arguments accepted by the function. - * @extra If not passed, [n] will be the length of the function. This method - * can be called on functions created by `partial`, in which case it - * will lock the total arguments during execution. - * - * @example - * - * logArgs.lock(2)(1,2,3) -> logs 1,2 - * - * @param {number} [n] - * - ***/ - 'lock': function(fn, n) { - var lockedFn; - if (_partial(fn)) { - _lock(fn, isNumber(n) ? n : null); - return fn; - } - lockedFn = function() { - arguments.length = min(_lock(lockedFn), arguments.length); - return fn.apply(this, arguments); - }; - _lock(lockedFn, isNumber(n) ? n : fn.length); - return lockedFn; - } - - }); - - defineInstanceWithArguments(sugarFunction, { - - /*** - * @method partial([arg1], [arg2], ...) - * @returns Function - * @short Returns a new version of the function which has part of its arguments - * pre-emptively filled in, also known as "currying". - * @extra `undefined` can be passed as any argument, and is a placeholder that - * will be replaced with arguments passed when the function is executed. - * This allows currying of arguments even when they occur toward the end - * of an argument list (the example demonstrates this more clearly). - * - * @example - * - * logArgs.partial(undefined, 'b')('a') -> logs a, b - * - * @param {any} [arg1] - * @param {any} [arg2] - * - ***/ - 'partial': function(fn, curriedArgs) { - var curriedLen = curriedArgs.length; - var partialFn = function() { - var argIndex = 0, applyArgs = [], self = this, lock = _lock(partialFn), result, i; - for (i = 0; i < curriedLen; i++) { - var arg = curriedArgs[i]; - if (isDefined(arg)) { - applyArgs[i] = arg; - } else { - applyArgs[i] = arguments[argIndex++]; - } - } - for (i = argIndex; i < arguments.length; i++) { - applyArgs.push(arguments[i]); - } - if (lock === null) { - lock = curriedLen; - } - if (isNumber(lock)) { - applyArgs.length = min(applyArgs.length, lock); - } - // If the bound "this" object is an instance of the partialed - // function, then "new" was used, so preserve the prototype - // so that constructor functions can also be partialed. - if (self instanceof partialFn) { - self = createInstanceFromPrototype(fn.prototype); - result = fn.apply(self, applyArgs); - // An explicit return value is allowed from constructors - // as long as they are of "object" type, so return the - // correct result here accordingly. - return isObjectType(result) ? result : self; - } - return fn.apply(self, applyArgs); - }; - _partial(partialFn, true); - return partialFn; - }, - - /*** - * @method delay([ms] = 1, [arg1], [arg2], ...) - * @returns Function - * @short Executes the function after `ms` milliseconds. - * @extra Returns a reference to itself. `delay` is also a way to execute non- - * blocking operations that will wait until the CPU is free. Delayed - * functions can be canceled using the `cancel` method. Can also curry - * arguments passed in after `ms`. - * - * @example - * - * logHello.delay(500) -> logs after 500ms - * logArgs.delay(500, 'a') -> logs "a" after 500ms - * - * @param {number} [ms] - * @param {any} [arg1] - * @param {any} [arg2] - * - ***/ - 'delay': function(fn, ms, args) { - setDelay(fn, ms, fn, fn, args); - return fn; - }, - - /*** - * @method every([ms] = 1, [arg1], [arg2], ...) - * @returns Function - * @short Executes the function every `ms` milliseconds. - * @extra Returns a reference to itself. `every` uses `setTimeout`, which - * means that you are guaranteed a period of idle time equal to [ms] - * after execution has finished. Compare this to `setInterval` which - * will try to run a function every [ms], even when execution itself - * takes up a portion of that time. In most cases avoiding `setInterval` - * is better as calls won't "back up" when the CPU is under strain, - * however this also means that calls are less likely to happen at - * exact intervals of [ms], so the use case here should be considered. - * Additionally, `every` can curry arguments passed in after [ms], and - * also be canceled with `cancel`. - * - * @example - * - * logHello.every(1000) -> logs every second - * logArgs.every(1000, 'Hola') -> logs 'hola' every second - * - * @param {number} [ms] - * @param {any} [arg1] - * @param {any} [arg2] - * - ***/ - 'every': function(fn, ms, args) { - function execute () { - // Set the delay first here, so that cancel - // can be called within the executing function. - setDelay(fn, ms, execute); - fn.apply(fn, args); - } - setDelay(fn, ms, execute); - return fn; - } - - }); - - /*** - * @module RegExp - * @description RegExp escaping and flag manipulation. - * - * Note here that methods on the RegExp class like .exec and .test will fail in - * the current version of SpiderMonkey being used by CouchDB when using - * shorthand regex notation like /foo/. This is the reason for the intermixed - * use of shorthand and compiled regexes here. If you're using JS in CouchDB, it - * is safer to ALWAYS compile your regexes from a string. - * - ***/ - - defineStatic(sugarRegExp, { - - /*** - * @method escape([str] = '') - * @returns String - * @static - * @short Escapes all RegExp tokens in a string. - * - * @example - * - * RegExp.escape('really?') -> 'really\?' - * RegExp.escape('yes.') -> 'yes\.' - * RegExp.escape('(not really)') -> '\(not really\)' - * - * @param {string} str - * - ***/ - 'escape': function(str) { - return escapeRegExp(str); - } - - }); - - defineInstance(sugarRegExp, { - - /*** - * @method getFlags() - * @returns String - * @short Returns the flags of the regex as a string. - * - * @example - * - * /texty/gim.getFlags() -> 'gim' - * - ***/ - 'getFlags': function(r) { - return getRegExpFlags(r); - }, - - /*** - * @method setFlags(flags) - * @returns RegExp - * @short Creates a copy of the regex with `flags` set. - * - * @example - * - * /texty/.setFlags('gim') -> now has global, ignoreCase, and multiline set - * - * @param {string} flags - * - ***/ - 'setFlags': function(r, flags) { - return RegExp(r.source, flags); - }, - - /*** - * @method addFlags(flags) - * @returns RegExp - * @short Creates a copy of the regex with `flags` added. - * - * @example - * - * /texty/.addFlags('g') -> /texty/g - * /texty/.addFlags('im') -> /texty/im - * - * @param {string} flags - * - ***/ - 'addFlags': function(r, flags) { - return RegExp(r.source, getRegExpFlags(r, flags)); - }, - - /*** - * @method removeFlags(flags) - * @returns RegExp - * @short Creates a copy of the regex with `flags` removed. - * - * @example - * - * /texty/gim.removeFlags('g') -> /texty/im - * /texty/gim.removeFlags('im') -> /texty/g - * - * @param {string} flags - * - ***/ - 'removeFlags': function(r, flags) { - var reg = allCharsReg(flags); - return RegExp(r.source, getRegExpFlags(r).replace(reg, '')); - } - - }); - - /*** - * @module Range - * @description Date, Number, and String ranges that can be manipulated and compared, - * or enumerate over specific points within the range. - * - ***/ - - var DURATION_UNITS = 'year|month|week|day|hour|minute|second|millisecond'; - var DURATION_REG = RegExp('(\\d+)?\\s*('+ DURATION_UNITS +')s?', 'i'); - - var MULTIPLIERS = { - 'Hours': 60 * 60 * 1000, - 'Minutes': 60 * 1000, - 'Seconds': 1000, - 'Milliseconds': 1 - }; - - var PrimitiveRangeConstructor = function(start, end) { - return new Range(start, end); - }; - - function Range(start, end) { - this.start = cloneRangeMember(start); - this.end = cloneRangeMember(end); - } - - function getRangeMemberNumericValue(m) { - return isString(m) ? m.charCodeAt(0) : m; - } - - function getRangeMemberPrimitiveValue(m) { - if (m == null) return m; - return isDate(m) ? m.getTime() : m.valueOf(); - } - - function getPrecision(n) { - var split = periodSplit(n.toString()); - return split[1] ? split[1].length : 0; - } - - function getGreaterPrecision(n1, n2) { - return max(getPrecision(n1), getPrecision(n2)); - } - - function cloneRangeMember(m) { - if (isDate(m)) { - return new Date(m.getTime()); - } else { - return getRangeMemberPrimitiveValue(m); - } - } - - function isValidRangeMember(m) { - var val = getRangeMemberPrimitiveValue(m); - return (!!val || val === 0) && valueIsNotInfinite(m); - } - - function valueIsNotInfinite(m) { - return m !== -Infinity && m !== Infinity; - } - - function rangeIsValid(range) { - return isValidRangeMember(range.start) && - isValidRangeMember(range.end) && - typeof range.start === typeof range.end; - } - - function rangeEvery(range, step, countOnly, fn) { - var increment, - precision, - dio, - unit, - start = range.start, - end = range.end, - inverse = end < start, - current = start, - index = 0, - result = []; - - if (!rangeIsValid(range)) { - return countOnly ? NaN : []; - } - if (isFunction(step)) { - fn = step; - step = null; - } - step = step || 1; - if (isNumber(start)) { - precision = getGreaterPrecision(start, step); - increment = function() { - return incrementNumber(current, step, precision); - }; - } else if (isString(start)) { - increment = function() { - return incrementString(current, step); - }; - } else if (isDate(start)) { - dio = getDateIncrementObject(step); - step = dio[0]; - unit = dio[1]; - increment = function() { - return incrementDate(current, step, unit); - }; - } - // Avoiding infinite loops - if (inverse && step > 0) { - step *= -1; - } - while(inverse ? current >= end : current <= end) { - if (!countOnly) { - result.push(current); - } - if (fn) { - fn(current, index, range); - } - current = increment(); - index++; - } - return countOnly ? index - 1 : result; - } - - function getDateIncrementObject(amt) { - var match, val, unit; - if (isNumber(amt)) { - return [amt, 'Milliseconds']; - } - match = amt.match(DURATION_REG); - val = +match[1] || 1; - unit = simpleCapitalize(match[2].toLowerCase()); - if (unit.match(/hour|minute|second/i)) { - unit += 's'; - } else if (unit === 'Year') { - unit = 'FullYear'; - } else if (unit === 'Week') { - unit = 'Date'; - val *= 7; - } else if (unit === 'Day') { - unit = 'Date'; - } - return [val, unit]; - } - - function incrementDate(src, amount, unit) { - var mult = MULTIPLIERS[unit], d; - if (mult) { - d = new Date(src.getTime() + (amount * mult)); - } else { - d = new Date(src); - callDateSet(d, unit, callDateGet(src, unit) + amount); - } - return d; - } - - function incrementString(current, amount) { - return chr(current.charCodeAt(0) + amount); - } - - function incrementNumber(current, amount, precision) { - return withPrecision(current + amount, precision); - } - - function rangeClamp(range, obj) { - var clamped, - start = range.start, - end = range.end, - min = end < start ? end : start, - max = start > end ? start : end; - if (obj < min) { - clamped = min; - } else if (obj > max) { - clamped = max; - } else { - clamped = obj; - } - return cloneRangeMember(clamped); - } - - defineOnPrototype(Range, { - - /*** - * @method toString() - * @returns String - * @short Returns a string representation of the range. - * - * @example - * - * Number.range(1, 5).toString() -> 1..5 - * janToMay.toString() -> January 1, xxxx..May 1, xxxx - * - ***/ - 'toString': function() { - return rangeIsValid(this) ? this.start + '..' + this.end : 'Invalid Range'; - }, - - /*** - * @method isValid() - * @returns Boolean - * @short Returns true if the range is valid, false otherwise. - * - * @example - * - * janToMay.isValid() -> true - * Number.range(NaN, NaN).isValid() -> false - * - ***/ - 'isValid': function() { - return rangeIsValid(this); - }, - - /*** - * @method span() - * @returns Number - * @short Returns the span of the range. If the range is a date range, the - * value is in milliseconds. - * @extra The span includes both the start and the end. - * - * @example - * - * Number.range(5, 10).span() -> 6 - * Number.range(40, 25).span() -> 16 - * janToMay.span() -> 10368000001 (or more depending on leap year) - * - ***/ - 'span': function() { - var n = getRangeMemberNumericValue(this.end) - getRangeMemberNumericValue(this.start); - return rangeIsValid(this) ? abs(n) + 1 : NaN; - }, - - /*** - * @method contains(el) - * @returns Boolean - * @short Returns true if `el` is contained inside the range. `el` may be a - * value or another range. - * - * @example - * - * Number.range(5, 10).contains(7) -> true - * Number.range(5, 10).contains(2) -> false - * janToMay.contains(mar) -> true - * janToMay.contains(marToAug) -> false - * janToMay.contains(febToApr) -> true - * - * @param {RangeElement} el - * - ***/ - 'contains': function(el) { - if (el == null) return false; - if (el.start && el.end) { - return el.start >= this.start && el.start <= this.end && - el.end >= this.start && el.end <= this.end; - } else { - return el >= this.start && el <= this.end; - } - }, - - /*** - * @method every(amount, [everyFn]) - * @returns Array - * @short Iterates through the range by `amount`, calling [everyFn] for each step. - * @extra Returns an array of each increment visited. For date ranges, - * `amount` can also be a string like `"2 days"`. This will step - * through the range by incrementing a date object by that specific - * unit, and so is generally preferable for vague units such as - * `"2 months"`. - * - * @callback everyFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * r A reference to the range. - * - * @example - * - * Number.range(2, 8).every(2) -> [2,4,6,8] - * janToMay.every('2 months') -> [Jan 1, Mar 1, May 1] - * - * sepToOct.every('week', function() { - * // Will be called every week from September to October - * }) - * - * @param {string|number} amount - * @param {everyFn} [everyFn] - * @callbackParam {RangeElement} el - * @callbackParam {number} i - * @callbackParam {Range} r - * - ***/ - 'every': function(amount, everyFn) { - return rangeEvery(this, amount, false, everyFn); - }, - - /*** - * @method toArray() - * @returns Array - * @short Creates an array from the range. - * @extra If the range is a date range, every millisecond between the start - * and end dates will be returned. To control this use `every` instead. - * - * @example - * - * Number.range(1, 5).toArray() -> [1,2,3,4,5] - * Date.range('1 millisecond ago', 'now').toArray() -> [1ms ago, now] - * - ***/ - 'toArray': function() { - return rangeEvery(this); - }, - - /*** - * @method union(range) - * @returns Range - * @short Returns a new range with the earliest starting point as its start, - * and the latest ending point as its end. If the two ranges do not - * intersect this will effectively remove the "gap" between them. - * - * @example - * - * oneToTen.union(fiveToTwenty) -> 1..20 - * janToMay.union(marToAug) -> Jan 1, xxxx..Aug 1, xxxx - * - * @param {Range} range - * - ***/ - 'union': function(range) { - return new Range( - this.start < range.start ? this.start : range.start, - this.end > range.end ? this.end : range.end - ); - }, - - /*** - * @method intersect(range) - * @returns Range - * @short Returns a new range with the latest starting point as its start, - * and the earliest ending point as its end. If the two ranges do not - * intersect this will effectively produce an invalid range. - * - * @example - * - * oneToTen.intersect(fiveToTwenty) -> 5..10 - * janToMay.intersect(marToAug) -> Mar 1, xxxx..May 1, xxxx - * - * @param {Range} range - * - ***/ - 'intersect': function(range) { - if (range.start > this.end || range.end < this.start) { - return new Range(NaN, NaN); - } - return new Range( - this.start > range.start ? this.start : range.start, - this.end < range.end ? this.end : range.end - ); - }, - - /*** - * @method clone() - * @returns Range - * @short Clones the range. - * @extra Members of the range will also be cloned. - * - * @example - * - * Number.range(1, 5).clone() -> Returns a copy of the range. - * - ***/ - 'clone': function() { - return new Range(this.start, this.end); - }, - - /*** - * @method clamp(el) - * @returns Mixed - * @short Clamps `el` to be within the range if it falls outside. - * - * @example - * - * Number.range(1, 5).clamp(8) -> 5 - * janToMay.clamp(aug) -> May 1, xxxx - * - * @param {RangeElement} el - * - ***/ - 'clamp': function(el) { - return rangeClamp(this, el); - } - - }); - - - /*** @namespace Number ***/ - - defineStatic(sugarNumber, { - - /*** - * @method range([start], [end]) - * @returns Range - * @static - * @short Creates a new number range between [start] and [end]. See `ranges` - * for more. - * - * @example - * - * Number.range(5, 10) - * Number.range(20, 15) - * - * @param {number} [start] - * @param {number} [end] - * - ***/ - 'range': PrimitiveRangeConstructor - - }); - - defineInstance(sugarNumber, { - - /*** - * @method upto(num, [step] = 1, [everyFn]) - * @returns Array - * @short Returns an array containing numbers from the number up to `num`. - * @extra Optionally calls [everyFn] for each number in that array. [step] allows - * multiples other than 1. [everyFn] can be passed in place of [step]. - * - * @callback everyFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * r A reference to the range. - * - * @example - * - * (2).upto(6) -> [2, 3, 4, 5, 6] - * (2).upto(6, function(n) { - * // This function is called 5 times receiving n as the value. - * }); - * (2).upto(8, 2) -> [2, 4, 6, 8] - * - * @signature upto(num, [everyFn]) - * @param {number} num - * @param {number} [step] - * @param {everyFn} [everyFn] - * @callbackParam {RangeElement} el - * @callbackParam {number} i - * @callbackParam {Range} r - * - ***/ - 'upto': function(n, num, step, everyFn) { - return rangeEvery(new Range(n, num), step, false, everyFn); - }, - - /*** - * @method clamp([start] = Infinity, [end] = Infinity) - * @returns Number - * @short Constrains the number so that it falls on or between [start] and - * [end]. - * @extra This will build a range object that has an equivalent `clamp` method. - * - * @example - * - * (3).clamp(50, 100) -> 50 - * (85).clamp(50, 100) -> 85 - * - * @param {number} [start] - * @param {number} [end] - * - ***/ - 'clamp': function(n, start, end) { - return rangeClamp(new Range(start, end), n); - }, - - /*** - * @method cap([max] = Infinity) - * @returns Number - * @short Constrains the number so that it is no greater than [max]. - * @extra This will build a range object that has an equivalent `cap` method. - * - * @example - * - * (100).cap(80) -> 80 - * - * @param {number} [max] - * - ***/ - 'cap': function(n, max) { - return rangeClamp(new Range(undefined, max), n); - } - - }); - - /*** - * @method downto(num, [step] = 1, [everyFn]) - * @returns Array - * @short Returns an array containing numbers from the number down to `num`. - * @extra Optionally calls [everyFn] for each number in that array. [step] allows - * multiples other than 1. [everyFn] can be passed in place of [step]. - * - * @callback everyFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * r A reference to the range. - * - * @example - * - * (8).downto(3) -> [8, 7, 6, 5, 4, 3] - * (8).downto(3, function(n) { - * // This function is called 6 times receiving n as the value. - * }); - * (8).downto(2, 2) -> [8, 6, 4, 2] - * - * @signature upto(num, [everyFn]) - * @param {number} num - * @param {number} [step] - * @param {everyFn} [everyFn] - * @callbackParam {RangeElement} el - * @callbackParam {number} i - * @callbackParam {Range} r - * - ***/ - alias(sugarNumber, 'downto', 'upto'); - - - /*** @namespace String ***/ - - defineStatic(sugarString, { - - /*** - * @method range([start], [end]) - * @returns Range - * @static - * @short Creates a new string range between [start] and [end]. See `ranges` - * for more. - * - * @example - * - * String.range('a', 'z') - * String.range('t', 'm') - * - * @param {string} [start] - * @param {string} [end] - * - ***/ - 'range': PrimitiveRangeConstructor - - }); - - - /*** @namespace Date ***/ - - - var FULL_CAPTURED_DURATION = '((?:\\d+)?\\s*(?:' + DURATION_UNITS + '))s?'; - - // Duration text formats - var RANGE_REG_FROM_TO = /(?:from)?\s*(.+)\s+(?:to|until)\s+(.+)$/i, - RANGE_REG_REAR_DURATION = RegExp('(.+)\\s*for\\s*' + FULL_CAPTURED_DURATION, 'i'), - RANGE_REG_FRONT_DURATION = RegExp('(?:for)?\\s*'+ FULL_CAPTURED_DURATION +'\\s*(?:starting)?\\s(?:at\\s)?(.+)', 'i'); - - var DateRangeConstructor = function(start, end) { - if (arguments.length === 1 && isString(start)) { - return createDateRangeFromString(start); - } - return new Range(getDateForRange(start), getDateForRange(end)); - }; - - function createDateRangeFromString(str) { - var match, datetime, duration, dio, start, end; - if (sugarDate.get && (match = str.match(RANGE_REG_FROM_TO))) { - start = getDateForRange(match[1].replace('from', 'at')); - end = sugarDate.get(start, match[2]); - return new Range(start, end); - } - if (match = str.match(RANGE_REG_FRONT_DURATION)) { - duration = match[1]; - datetime = match[2]; - } - if (match = str.match(RANGE_REG_REAR_DURATION)) { - datetime = match[1]; - duration = match[2]; - } - if (datetime && duration) { - start = getDateForRange(datetime); - dio = getDateIncrementObject(duration); - end = incrementDate(start, dio[0], dio[1]); - } else { - start = str; - } - return new Range(getDateForRange(start), getDateForRange(end)); - } - - function getDateForRange(d) { - if (isDate(d)) { - return d; - } else if (d == null) { - return new Date(); - } else if (sugarDate.create) { - return sugarDate.create(d); - } - return new Date(d); - } - - /*** - * @method [dateUnit]() - * @returns Number - * @namespace Range - * @short Returns the span of a date range in the given unit. - * @extra Higher order units ("days" and greater) walk the date to avoid - * discrepancies with ambiguity. Lower order units simply subtract the - * start from the end. - * - * @set - * milliseconds - * seconds - * minutes - * hours - * days - * weeks - * months - * years - * - * @example - * - * janToMay.months() -> 4 - * janToMay.days() -> 121 - * janToMay.hours() -> 2904 - * janToMay.minutes() -> 220320 - * - ***/ - function buildDateRangeUnits() { - var methods = {}; - forEach(DURATION_UNITS.split('|'), function(unit, i) { - var name = unit + 's', mult, fn; - if (i < 4) { - fn = function() { - return rangeEvery(this, unit, true); - }; - } else { - mult = MULTIPLIERS[simpleCapitalize(name)]; - fn = function() { - return trunc((this.end - this.start) / mult); - }; - } - methods[name] = fn; - }); - defineOnPrototype(Range, methods); - } - - defineStatic(sugarDate, { - - /*** - * @method range([start], [end]) - * @returns Range - * @namespace Date - * @static - * @short Creates a new date range between [start] and [end]. - * @extra Arguments may be either dates or strings which will be forwarded to - * the date constructor (`create` will be used if present in the build). - * If either [start] or [end] are undefined, they will default to the - * current date. This method also accepts an alternate syntax of a - * single string describing the range in natural language. See `ranges` - * for more. - * - * @example - * - * Date.range(jan, may) - * Date.range('today', 'tomorrow') - * Date.range('now', '5 days ago') - * Date.range('last Monday') - * Date.range('Monday to Friday') - * Date.range('tomorrow from 3pm to 5pm') - * Date.range('1 hour starting at 5pm Tuesday') - * - * @param {string|Date} [start] - * @param {string|Date} [end] - * - ***/ - 'range': DateRangeConstructor - - }); - - buildDateRangeUnits(); - -}).call(this); \ No newline at end of file diff --git a/dist/sugar-es5.min.js b/dist/sugar-es5.min.js deleted file mode 100644 index f65fd6cdf..000000000 --- a/dist/sugar-es5.min.js +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Sugar v2.0.6 - * - * Freely distributable and licensed under the MIT-style license. - * Copyright (c) Andrew Plummer - * https://sugarjs.com/ - * - * ---------------------------- */ -(function(){'use strict';(function(){function yc(a,b){return new O(a,b)}function q(a,b){for(var c in a)if(w(a,c)&&!1===b.call(a,a[c],c,a))break}function zc(a){return a&&a.Object===Object?a:null}function Ac(a){function b(a,b,c){B(d,a,function(a,e,f){a=Ob(a,e,f);ie(d,a.methods,b,c,a.w);return d})}var c="Object"===a,d=Bc(a,!0);b("defineStatic",1);b("defineInstance",2);b("defineInstanceAndStatic",3);b("defineStaticWithArguments",1,!0);b("defineInstanceWithArguments",2,!0);B(d,"defineStaticPolyfill",function(b,c,g){b=Ob(b,c,g); -ob(Ha[a],b.methods,!0,b.w);return d});B(d,"defineInstancePolyfill",function(b,c,g){b=Ob(b,c,g);ob(Ha[a].prototype,b.methods,!0,b.w);q(b.methods,function(a,b){pb(d,b,a)});return d});B(d,"alias",function(a,b){var c=d;b="string"===typeof b?d[b]:b;c[a]=b;b.instance&&pb(c,a,b.instance,!0);return d});B(d,"extend",function(b){function e(a,c){if(a=b[a])for(var d=0,e;e=a[d];d++)if(e===c)return!0;return!1}function g(a,c){return b[a]&&!e(a,c)}function h(a,c,d){if(!c[a]||!d)return!1;for(a=0;aa||!F(a)||!isFinite(a))throw new RangeError("Invalid number");return K(a)}function m(a){return void 0!==a}function v(a){return void 0===a}function $a(a){var b="_sugar_"+a;return function(a,d){return 1b&&(b=+b+h.length);if(k||b||1===t)if(S=c?b in Object(h):w(h,b),!e||qa&&!f||S){if(d){if(qa||!S)return S}else if(l&&qa){if(ra(h))throw new TypeError("Property cannot be written"); -h[b]=g}h=S?h[b]:void 0}else h=h[b]=q||f&&qa?[]:{}}}return h}}function ye(a,b,c,d){var e,f;if(e=b.match(ze)){b=m(d);a=(f=e[1])?Ja(a,f,c,!1,b?!0:!1,!0):a;if(!C(a))throw new TypeError("Array required");var g=e[4];f=e[2]?+e[2]:0;e=e[3]?+e[3]:a.length;e=-1===e?a.length:e+1;if(b)for(b=f;b>>0==a&&4294967295!=a}function Oc(a,b,c,d){var e=[],f;for(f in a)yb(f)&&(c||(d?f<=b:f>=b))&&e.push(+f);e.sort(function(a,c){var d=a>b;return d!==c>b?d?-1:1:a-c});return e}function Pc(a,b,c,d){var e=a.length;if(!C(b))return Qc(a,b,e,c,d);var f=Array(b.length);y(b,function(b,h){f[h]=Qc(a,b,e,c,d)});return f}function Xb(a, -b,c){a&&c&&(a%=b);0>a&&(a=b+a);return a}function Qc(a,b,c,d,e){b=Xb(b,c,d);return e?a.charAt(b):a[b]}function sa(a,b,c,d){return b?b.apply?b.apply(c,d):C(b)?W(b,function(b){return sa(a,b,c,d)}):H(a[b])?a[b].call(a):tb(a,b,!0):a}function y(a,b){for(var c=0,d=a.length;cb&&(d=1/d);return c(a*d)/d}function Q(a,b,c,d,e){d=aa(a).toString(d||10);d=Bb(e||"0",b-d.replace(/\.\d+/,"").length)+d;if(c||0>a)d=(0>a?"-":"+")+d;return d}function Rc(a){if(11<=a&&13>=a)return"th";switch(a%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}}function Yb(a,b){var c; -a=a.replace(Sc,function(a){a=u(Ca,a);"."===a&&(c=!0);return a});return c?parseFloat(a):parseInt(a,b||10)}function Bb(a,b){var c="";for(a=a.toString();0>=1)a+=a;return c}function cb(a){return a.charAt(0).toUpperCase()+a.slice(1)}function Tc(a,b,c){function d(d,e){var h=e[2],l=e[3],k=e[5];if(e[4]&&b){var t=k;var r=b}else if(h)t=h,r=a;else var m=l&&b?l:e[1]||e[0];if(r){g(c,h,k);var q=function(a,b){return r(a,t,b)}}d.push(q||f(m))}function e(a,b,c,d){if(d>c){var e=b.slice(c,d);h(e, -"{");h(e,"}");a.push(function(){return e})}}function f(a){return function(){return a}}function g(a,b,c){if(a&&!a(b,c))throw new TypeError("Invalid token "+(b||c)+" in format string");}function h(a,b){if(-1!==a.indexOf(b))throw new TypeError("Unmatched "+b+" in format string");}var l=De,k=Ee(function(a){var b=[],c=0,f;for(l.lastIndex=0;f=l.exec(a);)e(b,a,c,f.index),d(b,f),c=l.lastIndex;e(b,a,c,a.length);return b});return function(a,b,c){a=k(a);for(var d="",e=0;ec&&(c=e+c);if(!d&&0>c||d&&c>=e)c=g;for(g=c;d&&0<=g||!d&&g=c&&!1!==a(na[b],b);b--);}function Zc(a,b){for(;0<=a&&!1!==b(na[a],a);)a=db(a)}function db(a){return 6===a?4:5===a?3:a-1}function Cb(a,b,c,d){bc(function(c,d){var e= -c.name;var f=u(a,cc(a,e));m(f)&&b(e,f,c,d);e=void 0;!1!==e&&4===d&&(e=u(a,cc(a,"weekday")),m(e)&&b("weekday",e,c,d),e=void 0);return e},c,d)}function Le(a,b){Cb(a,b,7,4)}function Ea(a,b,c,d){var e={};e[b]=c;return va(a,e,d,1)}function $c(a,b,c){b=Yc(b,!0);return va(a,b[0],b[1],c)}function eb(a,b){ua(a,7*Pa((G(a)-b)/7)+b);return a}function ad(a,b){--b;ua(a,7*oa((G(a)-b)/7)+b);return a}function fb(a,b,c){5===b&&eb(a,D.get(c).s());return da(a,db(b))}function Db(a,b,c,d){5===b&&ad(a,D.get(c).s());return da(a, -db(b),d,!0)}function da(a,b,c,d){Zc(b,function(b,f){var e=d?b.end:b.start;H(e)&&(e=e(a));Oa(a,b.method,e);return!m(c)||f>c});return a}function cc(a,b){return Ub(a,b)||Ub(a,b+"s")||"day"===b&&Ub(a,"date")}function Me(a){var b={},c;b[a]=1;Cb(b,function(a,b,f,g){c=g;return!1});return c}function Eb(a,b,c){var d=b>a;if(!d){var e=b;b=a;a=e}e=b-a;1b)break;e+=1}return d?-e:e}function bd(a,b){if(F(b)){var c=ta(a),d=G(a); -da(c,6);ma(c,4);eb(c,1);ma(c,ca(c)+7*(b-1));b=la(c);Oa(a,"FullYear",b);b=X(c);Oa(a,"Month",b);ma(a,ca(c));ua(a,d||7)}return a.getTime()}function Qa(a,b,c,d){var e,f=0;v(c)&&(c=1);v(d)&&(d=4);var g=e=ad(ta(a),c),h=c,l=d;da(g,6);ma(g,l);eb(g,h);b&&ab&&(b=new Date(b.getTime()-10)));return fd(a-b,function(c){return aa(Eb(a,b,c))})}function ed(a,b,c){Wc(a);b=gd[b]||b||"{long}"; -return Fb(b,a,c)}function dc(a,b){a=L(a,"Hours");return D.get(b).ampm[K(a/12)]||""}function hd(a,b,c){var d;if(!isNaN(a.getTime())){if(A(b))switch(b=b.trim().toLowerCase(),!0){case "future"===b:return a.getTime()>Da().getTime();case "past"===b:return a.getTime()G(a);case "weekend"===b:return 0===G(a)||6===G(a);case m(d=Fa.weekdayMap[b]):return G(a)=== -d;case m(d=Fa.monthMap[b]):return X(a)===d}return id(a,b,c)}}function id(a,b,c,d,e){var f=0,g=0;R(a)&&(e=e||{},e.fromUTC=!0,e.setUTC=!0);b=fc(null,b,e,!0);if(0=h-f&&c<=k+g}function ec(a,b){var c=Da();b&&ma(c,ca(c)+b);return la(a)===la(c)&&X(a)===X(c)&&ca(a)===ca(c)}function Y(a,b,c){return fc(null,a,b,c).date}function fc(a,b,c,d){function e(a,b){var c=w||{};y(b.to,function(b,d){d=a[d+1];if(d){a:if("utc"===b)var e=1;else{if("year"===b){var f=d.match(Pe);if(f){e=q;f=+f[1];f+=50>f?2E3:1900;if(e){var g= -f-la(z);g/aa(g)!==e&&(f+=100*e)}e=f;break a}}e=void 0}v(e)&&(e=p.V(d,b));c[b]=e}});return c}function f(a,b){R(a)&&!m(Ba)&&(Ba=!0);R(a)&&!m(x)&&(x=!0);b&&(a=new Date(a.getTime()));return a}function g(){y(C,function(a){a.call()})}function h(b){b=b.toLowerCase();p=D.get(S);for(var c=0,d,f;d=p.compiledFormats[c];c++)if(f=b.match(d.reg)){p.K(d,c);n=e(f,d);if(m(n.timestamp)){z.setTime(n.timestamp);break}m(n.ampm)&&(c=n.ampm,1===c&&12>n.hour?n.hour+=12:0===c&&12===n.hour&&(n.hour=0));if(n.utc||m(n.tzHour))if(c= -n.tzHour,d=n.tzMinute,R(z,!0),0>c&&(d*=-1),c=60*c+(d||0))n.minute=(n.minute||0)-c;m(n.shift)&&v(n.unit)&&(m(n.month)?n.unit=7:m(n.weekday)&&(n.unit=5));m(n.num)&&v(n.unit)&&(m(n.weekday)?t(n.num):m(n.month)&&(n.date=n.num));n.midday&&l(n.midday);m(n.day)&&(da(z,3),v(n.unit)&&(n.unit=4,n.num=n.day,delete n.day));m(n.unit)&&(d=n.unit,c=m(n.num)?n.num:m(n.edge)&&v(n.shift)?0:1,m(n.weekday)&&(6===d?(t(c),c=1):(va(z,{weekday:n.weekday},!0),delete n.weekday)),n.half&&(c*=n.half),m(n.shift)?c*=n.shift:n.sign&& -(c*=n.sign),m(n.day)&&(c+=n.day,delete n.day),r(d),n[Fa.units[d]]=c,Ia=!0);n.edge&&k(n.edge,n);break}n?Ia?va(z,n,!1,1):va(z,n,!0,0,q,qa,a):(z=new Date(b),Ba&&!isNaN(z.getTime())&&z.setTime(z.getTime()+6E4*z.getTimezoneOffset()));g();return z}function l(a){n.hour=a%24;23a)fb(z,c,S);else if(0< -a){if(1===a){var b=4;fb(z,4)}Db(z,c,S,b)}m(d)&&(ua(z,d,-a),da(z,3))});b.specificity=6===c?4:c-1}function t(a){n.weekday=7*(a-1)+n.weekday;qa=n.date=1}function r(a){var b;Cb(n,function(c,d,e,f){if(f>=a)return z.setTime(NaN),!1;fb.specificity||(b.specificity=l);if(r=g%1){if(l){var p=na[db(l)];r=bb(h.f/p.f*r);b[p.name]=r}g=K(g)}if("weekday"===c)d||ua(a,g,f); -else if(c=6===l&&28g&&(g=g%12+12),h=g%12!==X(a);h&&ma(a,0)}}var k;if(F(b)&&d)b={millisecond:b};else if(F(b))return a.setTime(b),a;Cb(b,l);c&&b.specificity&&da(a,db(b.specificity));a:{if(k&&!(7=(g||Da());break a;case 1:c=a<=(g||Da());break a}c=void 0}c&&h();return a}function Gb(a){var b=a.join("");return a&&a.length?b.length=== -a.length?"["+b+"]":W(a,Na).join("|"):""}function Z(a,b){1=h[1]&&a<=(h[2]||h[1])})),a=Gb(b);if(!a)return"";e?a=Z(a):(g.push(p),a="("+a+")");m&&(a=Qe(p,a,m));d&&(a+="?");return a}function c(a){a=a.replace(/ /g," ?");return a=a.replace(/\{([^,]+?)\}/g,function(a,c){a=c.split("|");return 1]+";return td(a.toString(),RegExp("<(\\/)?("+b+")(\\s+[^<>]*?)?\\s*(\\/)?>","gi"),d,c)}function td(a,b,c,d,e){function f(f,g,k,t,n){var r=a.slice(l, -f),p="",m="";A(d)?m=d:d&&(m=d.call(e,g,r,k,e)||"");c?p=m:r=m;r&&(r=td(r,b,c,d,e));h+=p+r+(n?"":p);l=f+(t||0)}var g,h="",l=0,k=0;e=e||a;for(b=RegExp(b.source,"gi");g=b.exec(a);){var t=g[2],r=(g[3]||"").slice(1),p=!!g[1],m=!!g[4],q=g[0].length,v=-1!==Wb(bf,t.toLowerCase());m=!p&&!m&&!v;var x=t===u;u||(h+=a.slice(l,g.index),l=g.index);if(m)if(u)x&&k++;else{var u=t;var w=r;k++;l+=q}else p&&x?(k--,0===k&&(f(g.index,u,w,q,v),w=u=null)):u||f(g.index,t,r,q,v)}u&&f(a.length,u,w);return h+=a.slice(l)}function ud(a, -b,c){A(b)&&(b=a.indexOf(b),-1===b&&(b=c?a.length:0));return b}function vd(a,b){var c;a&&a.constructor&&C(a.constructor.prototype)?c=b?Ra(a):a:I(a)||A(a)?c=Array.from(a):m(a)&&(c=[a]);return c||[]}function Ra(a){var b=Array(a.length);y(a,function(a,d){b[d]=a});return b}function cf(a){var b=[];b.push(a);return b}function df(a,b){var c=Ra(a),d=c.length;a=C(b)?b:[b];c.length+=a.length;y(a,function(a,b){c[d+b]=a});return c}function wd(a,b,c){c=+c;isNaN(c)&&(c=a.length);c=[c,0];m(b)&&(c=c.concat(b));a.splice.apply(a, -c);return a}function xd(a,b){var c=[],d={},e=[];y(a,function(f,g){g=b?sa(f,b,a,[f,g,a]):f;g=La(g,e);w(d,g)||(c.push(f),d[g]=!0)});return c}function yd(a,b,c){var d=[];b=b||Infinity;c=c||0;y(a,function(a){C(a)&&cb.length)return 1;for(c=0;cb?1:0}function Bd(a,b,c){c&&(a=a.toLowerCase());b&&(a=a.replace(b,""));return a}function Cd(a,b,c){a=a.charAt(b);return u(c,a)||a}function hc(a, -b,c,d,e){if(C(a)){for(var f,g,h=[],l=0,k=a.length;lh||!d&&bh?-1:1,c=e[h+g];"|"===c&&(c="");-9>f&&(b=aa(f)-9);d=d?Ab(2,10*h):Ab(10,3*h);return Pd(ab(a/d,b||0))+c}function Pd(a,b){var c="";var d= -Qd("decimal");var e=Qd("thousands");var f=F(b)?ab(a,b||0).toFixed(E(b,0)):a.toString();f=f.replace(/^-/,"");var g=f.split(".");var h=g[0];g=g[1];if(/e/.test(f))c=f;else for(f=h.length;0a?"-":"")+c}function pc(a){return function(b,c){return c?ab(b,c,a):a(b)}}function Va(a,b,c,d,e){b=za(b||0);Kb(a)||Kb(a,[]);qc(a,!1);Kb(a).push(setTimeout(function(){qc(a)||c.apply(d,e||[])},b))}function Rd(a){var b=Kb(a), -c;if(C(b))for(;c=b.shift();)clearTimeout(c);qc(a,!0);return a}function Sd(a,b,c,d){function e(){if(f.lengthc;)h=Function.prototype.apply.apply(a,f.shift()),b--;Va(e,l,function(){g=!1;t()})}};return e}function xf(){for(var a=arguments,b=a.length, -c=Array(b);b--;)c[b]=a[b];return c}function yf(a,b,c){var d={},e=[],f=0;return function(){var g=b.apply(this,arguments);g=La(g,e);if(w(d,g))return u(d,g);f===c&&(d={},e=[],f=0);f++;return d[g]=a.apply(this,arguments)}}function O(a,b){this.start=rc(a);this.end=rc(b)}function Td(a){return A(a)?a.charCodeAt(0):a}function Ud(a){return null==a?a:T(a)?a.getTime():a.valueOf()}function Vd(a){a=a.toString().split(".");return a[1]?a[1].length:0}function rc(a){return T(a)?new Date(a.getTime()):Ud(a)}function Wd(a){var b= -Ud(a);return(!!b||0===b)&&-Infinity!==a&&Infinity!==a}function Lb(a){return Wd(a.start)&&Wd(a.end)&&typeof a.start===typeof a.end}function Mb(a,b,c,d){var e=a.start,f=a.end,g=f=f:h<=f;)c||k.push(h),d&&d(h,l,a),h=r(),l++; -return c?l-1:k}function Xd(a){if(F(a))return[a,"Milliseconds"];var b=a.match(zf);a=+b[1]||1;b=cb(b[2].toLowerCase());b.match(/hour|minute|second/i)?b+="s":"Year"===b?b="FullYear":"Week"===b?(b="Date",a*=7):"Day"===b&&(b="Date");return[a,b]}function Yd(a,b,c){var d=Zd[c];d?d=new Date(a.getTime()+b*d):(d=new Date(a),Oa(d,c,L(a,c)+b));return d}function sc(a,b){var c=a.start,d=a.end;a=dd?c:d;return rc(bc?c:b)}function Wa(a){return T(a)?a:null==a?new Date:J.create?J.create(a):new Date(a)} -var x,Ha=zc("undefined"!==typeof global&&global)||zc("undefined"!==typeof window&&window),Pb=!1,qb={},Cc={},Rb=Object.defineProperty&&Object.defineProperties?Object.defineProperty:pe,Ec=Bc("Chainable"),Fc=Object.getOwnPropertyNames,Gc=Object.prototype.toString,qe=Object.prototype.hasOwnProperty;(function(){x=Ha.Sugar;if(!x){x=function(a){q(x,function(b,c){w(qb,c)&&b.extend(a)});return x};if("undefined"!==typeof module&&module.M)module.M=x;else try{Ha.Sugar=x}catch(a){}q("Object Number String Array Date RegExp Function".split(" "), -function(a){Ac(a)});B(x,"VERSION","2.0.6");B(x,"extend",x);B(x,"toString",ke);B(x,"createNamespace",Ac);B(x,"util",{hasOwn:w,getOwn:u,setProperty:B,classToString:ha,defineProperty:Rb,forEachProperty:q,mapNativeToChainable:Qb})}})();var Ae=!("0"in Object("a")),ze=/^(.*?)\[([-\d]*)\.\.([-\d]*)\](.*)$/,De=/([{}])\1|{([^}]*)}|(%)%|(%(\w*))/g,Xa=x.Object,M=x.Array,J=x.Date,Ya=x.String,fa=x.Number,tc=x.Function,$d=x.RegExp,ub,Ta,F,A,T,ka,H,C,vb,wb,xb,ae=ya("alias"),xa=ya("defineStatic"),P=ya("defineInstance"), -lb=ya("defineStaticPolyfill"),Ga=ya("defineInstancePolyfill"),Sb=ya("defineInstanceAndStatic"),mb=ya("defineInstanceWithArguments"),K=Math.trunc||function(a){return 0!==a&&isFinite(a)?0>a?oa(a):Pa(a):a},Sc,Ca,nd,aa=Math.abs,Ab=Math.pow,ea=Math.min,E=Math.max,oa=Math.ceil,Pa=Math.floor,bb=Math.round,pa=String.fromCharCode,ba={},R=$a("utc"),Ge=1E3;(function(){function a(a){f["[object "+a+"]"]=!0}function b(a,b){return b&&rb(new b,"Object")?c(b):d(a)}function c(a){var b=String(a);return function(a){return String(a.constructor)=== -b}}function d(a){return function(b,c){return rb(b,a,c)}}function e(a){var b=a.toLowerCase();return function(c){var d=typeof c;return d===b||"object"===d&&rb(c,a)}}var f={};(function(){var c="Boolean Number String Date RegExp Function Array Error Set Map".split(" ");Ta=e(c[0]);F=e(c[1]);A=e(c[2]);T=b(c[3]);ka=b(c[4]);H=b(c[5]);C=Array.isArray||b(c[6]);xb=b(c[7]);vb=b(c[8],"undefined"!==typeof Set&&Set);wb=b(c[9],"undefined"!==typeof Map&&Map);a("Arguments");a(c[0]);a(c[1]);a(c[2]);a(c[3]);a(c[4]); -a(c[6])})();(function(){y("Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64".split(" "),function(b){a(b+"Array")})})();ub=function(a,b){return f[b]||sb(a,b)}})();(function(){var a="";Ca={};for(var b=0,c;9>=b;b++)c=pa(b+65296),a+=c,Ca[c]=pa(b+48);Ca[","]="";Ca["\uff0e"]=".";Ca["."]=".";Sc=RegExp("["+(a+"\uff0e,.")+"]","g");nd=a})();var Af="valueOf toString constructor isPrototypeOf hasOwnProperty toLocaleString propertyIsEnumerable".split(" ");(function(){if(!{toString:1}.propertyIsEnumerable("toString")){var a= -q;q=function(b,c){a(b,c);for(var d=0,e;(e=Af[d])&&(!w(b,e)||!1!==c.call(b,b[e],e,b));d++);}}})();Object.getOwnPropertyNames||He();lb(Xa,{keys:function(a){var b=[];if(null==a)throw new TypeError("Object required");q(Ka(a),function(a,d){b.push(d)});return b}});lb(M,{isArray:function(a){return C(a)}});Ga(M,{every:function(a){var b=arguments[1],c=this.length,d=0;for(V(a);dd?!1:c.substr(b,e)===a?!0:!1},endsWith:function(a){var b=arguments[1],c;var d=Zb(this);a=$b(a);var e=c=d.length;m(b)&&(e=+b||0);e=ea(E(e,0),c);b=a.length;e-=b;return 0>e?!1:d.substr(e,b)===a?!0:!1},repeat:function(a){a=za(a);return Bb(this,a)}});lb(fa,{isNaN:function(a){return null!=a&&a!==a}});lb(M,{from:function(a){var b=arguments[1],c=arguments[2];m(b)&&V(b);if(null==a)throw new TypeError("Object required.");a=Ka(a);var d=K(E(0,a.length||0));if(!yb(d))throw new RangeError("Invalid array length"); -if(H(this)){var e=new this(d);e.length=d}else e=Array(d);for(var f=0;f -b&&(b=E(0,b+c));bY(b).getTime()-(c||0)},isBefore:function(a,b,c){return a.getTime()=a},isLeapYear:function(a){a=la(a);return 0===a%4&&0!==a%100||0===a%400},daysInMonth:function(a){return Xc(a)},format:function(a,b,c){return ed(a,b,c)},relative:function(a,b,c){return dd(a,null,b,c)},relativeTo:function(a,b,c){return dd(a,Y(b),c)},is:function(a,b,c){return hd(a,b,c)},reset:function(a,b,c){b=b?Me(b):4;fb(a,b,c);return a},clone:function(a){return ta(a)},iso:function(a){return a.toISOString()},getWeekday:function(a){return G(a)},getUTCWeekday:function(a){return a.getUTCDay()}}); -P(fa,{duration:function(a,b){return D.get(b).N(a)}});var uc={code:"en",plural:!0,timeMarkers:"at",ampm:"AM|A.M.|a,PM|P.M.|p",units:"millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s",months:"Jan:uary|,Feb:ruary|,Mar:ch|,Apr:il|,May,Jun:e|,Jul:y|,Aug:ust|,Sep:tember|t|,Oct:ober|,Nov:ember|,Dec:ember|",weekdays:"Sun:day|,Mon:day|,Tue:sday|,Wed:nesday|,Thu:rsday|,Fri:day|,Sat:urday|+weekend",numerals:"zero,one|first,two|second,three|third,four:|th,five|fifth,six:|th,seven:|th,eight:|h,nin:e|th,ten:|th", -articles:"a,an,the",tokens:"the,st|nd|rd|th,of|in,a|an,on",time:"{H}:{mm}",past:"{num} {unit} {sign}",future:"{num} {unit} {sign}",duration:"{num} {unit}",modifiers:[{name:"half",src:"half",value:.5},{name:"midday",src:"noon",value:12},{name:"midday",src:"midnight",value:24},{name:"day",src:"yesterday",value:-1},{name:"day",src:"today|tonight",value:0},{name:"day",src:"tomorrow",value:1},{name:"sign",src:"ago|before",value:-1},{name:"sign",src:"from now|after|from|in|later",value:1},{name:"edge", -src:"first day|first|beginning",value:-2},{name:"edge",src:"last day",value:1},{name:"edge",src:"end|last",value:2},{name:"shift",src:"last",value:-1},{name:"shift",src:"the|this",value:0},{name:"shift",src:"next",value:1}],parse:"(?:just)? now;{shift} {unit:5-7};{months?} {year};{midday} {4?} {day|weekday};{months},?[-.\\/\\s]?{year?};{edge} of (?:day)? {day|weekday};{0} {num}{1?} {weekday} {2} {months},? {year?};{shift?} {day?} {weekday?} (?:at)? {midday};{sign?} {3?} {half} {3?} {unit:3-4|unit:7} {sign?};{0?} {edge} {weekday?} {2} {shift?} {unit:4-7?} {months?},? {year?}".split(";"), -timeParse:"{day|weekday};{shift} {unit:5?} {weekday};{0?} {date}{1?} {2?} {months?};{weekday} {2?} {shift} {unit:5};{0?} {num} {2?} {months}\\.?,? {year?};{num?} {unit:4-5} {sign} {day|weekday};{0|months} {date?}{1?} of {shift} {unit:6-7};{0?} {num}{1?} {weekday} of {shift} {unit:6};{year?}[-.\\/\\s]?{months}[-.\\/\\s]{date};{date}[-.\\/\\s]{months}(?:[-.\\/\\s]{year|yy})?;{weekday?}\\.?,? {months}\\.?,? {date}{1?},? {year?};{weekday?}\\.?,? {date} {months} {year}".split(";"),timeFrontParse:["{sign} {num} {unit}", -"{num} {unit} {sign}","{4?} {day|weekday}"]},be=U(U({},uc),{mdy:!0,firstDayOfWeek:0,firstDayOfWeekYear:1,"short":"{MM}/{dd}/{yyyy}",medium:"{Month} {d}, {yyyy}","long":"{Month} {d}, {yyyy} {time}",full:"{Weekday}, {Month} {d}, {yyyy} {time}",stamp:"{Dow} {Mon} {d} {yyyy} {time}",time:"{h}:{mm} {TT}"}),ce=U(U({},uc),{"short":"{dd}/{MM}/{yyyy}",medium:"{d} {Month} {yyyy}","long":"{d} {Month} {yyyy} {H}:{mm}",full:"{Weekday}, {d} {Month}, {yyyy} {time}",stamp:"{Dow} {d} {Mon} {yyyy} {time}"}),Ef=U(U({}, -uc),{"short":"{yyyy}-{MM}-{dd}",medium:"{d} {Month}, {yyyy}","long":"{d} {Month}, {yyyy} {H}:{mm}",full:"{Weekday}, {d} {Month}, {yyyy} {time}",stamp:"{Dow} {d} {Mon} {yyyy} {time}"}),de={"en-US":be,"en-GB":ce,"en-AU":ce,"en-CA":Ef};(function(){function a(a){this.o={};this.add(a)}a.prototype={get:function(a,c){var b=this.o[a];!b&&de[a]?b=this.add(a,de[a]):!b&&a&&(b=this.o[a.slice(0,2)]);return b||!1===c?b:this.current},getAll:function(){return this.o},set:function(a){var b=this.get(a,!1);if(!b)throw new TypeError("Invalid Locale: "+ -a);return this.current=b},add:function(a,c){c?c.code=a:(c=a,a=c.code);c=c.compiledFormats?c:ld(c);this.o[a]=c;this.current||(this.current=c);return c},remove:function(a){this.current.code===a&&(this.current=this.get("en"));return delete this.o[a]}};Fa=ld(be);D=new a(Fa)})();(function(){function a(a,b,c){b&&y(b.split(" "),function(b){a[b]=c})}function b(a){return function(b,c){return a(b,c).toLowerCase()}}function c(a){return function(b,c){b=a(b,c);return b+D.get(c).O(b)}}function d(a,b){return function(c, -d){return Q(a(c,d),b)}}function e(a){return function(b,c){return a(b,c)%100}}function f(a){return function(b,c){return Fb(a,b,c)}}function g(c,d){function e(a,b){return c.get(a,b,d)}a(N,c.b+d,e);c.j&&(N[c.j+d]=b(e))}function h(a){return function(b,c){var d=D.get(c);return Fb(d[a],b,c)}}N={};nb={};y(Df,function(h){var k=h.get,l;h.j&&(N[h.j]=b(k));h.l&&(N[h.l]=c(k,h));h.c&&(N[h.c]=d(k,h.c.length));h.u&&(N[h.u]=d(e(k),2));h.B&&(nb[h.B]=d(e(k),2));h.h&&(l=d(k,h.h));h.alias&&(k=f(h.alias));if(h.C)for(var m= -1;5>=m;m++)g(h,m);a(N,h.b,k);a(nb,h.a,l||k)});q(gd,function(b,c){a(N,c,f(b))});Za(J,"short medium long full",function(b,c){var d=h(c);a(N,c,d);b[c]=d});a(N,"time",h("time"));a(N,"stamp",h("stamp"))})();(function(){Fb=Tc(function(a,b,c){return u(N,b)(a,c)},function(a,b,c){return u(nb,b)(a,c)},function(a,b){return w(N,a)||w(nb,b)})})();(function(){Za(J,na,function(a,b,c){var d=b.name,e=cb(d);4]/g,qd={lt:"<",gt:">",amp:"&",nbsp:" ", -quot:'"',apos:"'"},vc,Ye="and or nor a an the so but to of at by from into on onto off out in over with for".split(" "),bf="area base br col command embed hr img input keygen link meta param source track wbr".split(" "),Gf=/^[\t\n\x0B\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u2028\u2029\u3000\ufeff]+/,Hf=/[\t\n\x0B\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u2028\u2029\u3000\ufeff]+$/, -Ze=/(?=[\t\n\x0B\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u2028\u2029\u3000\ufeff])/,If=String.prototype.includes,wc,xc,Jf=Tc(tb);P(Ya,{includes:ia(function(a,b,c){if(!ka(b))return If.call(a,b,c);c&&(a=a.slice(c));return b.test(a)})},["enhance","enhanceString"]);P(Ya,{at:function(a,b,c){return Pc(a,b,c,!0)},escapeURL:function(a,b){return b?encodeURIComponent(a):encodeURI(a)},unescapeURL:function(a,b){return b?decodeURI(a):decodeURIComponent(a)}, -escapeHTML:function(a){return a.replace(Ff,function(a){return u(vc,a)})},unescapeHTML:function(a){return $e(a)},stripTags:function(a,b,c){return sd(a,b,c,!0)},removeTags:function(a,b,c){return sd(a,b,c,!1)},encodeBase64:function(a){return wc(a)},decodeBase64:function(a){return xc(a)},forEach:function(a,b,c){return hb(a,b,c)},chars:function(a,b,c){return hb(a,b,c)},words:function(a,b){return hb(a.trim(),/\S+/g,b)},lines:function(a,b){return hb(a.trim(),/^.*$/gm,b)},codes:function(a,b){return pd(a, -b)},shift:function(a,b){var c="";b=b||0;pd(a,function(a){c+=pa(a+b)});return c},isBlank:function(a){return 0===a.trim().length},isEmpty:function(a){return 0===a.length},insert:function(a,b,c){c=v(c)?a.length:c;return a.slice(0,c)+b+a.slice(c)},remove:function(a,b){return a.replace(b,"")},removeAll:function(a,b){return rd(a,b)},reverse:function(a){return a.split("").reverse().join("")},compact:function(a){return a.trim().replace(/([\r\n\s\u3000])+/g,function(a,c){return"\u3000"===c?c:" "})},from:function(a, -b){return a.slice(ud(a,b,!0))},to:function(a,b){v(b)&&(b=a.length);return a.slice(0,ud(a,b))},dasherize:function(a){return ib(a).replace(/_/g,"-")},underscore:function(a){return ib(a)},camelize:function(a,b){return Ue(a,b)},spacify:function(a){return ib(a).replace(/_/g," ")},titleize:function(a){return Xe(a)},parameterize:function(a,b){void 0===b&&(b="-");a=a.replace(/[^a-z0-9\-_]+/gi,b);b&&(b=RegExp(["^","+|","+$|(",")","+"].join(Na(b)),"g"),a=a.replace(b,"$1"));return encodeURI(a.toLowerCase())}, -truncate:function(a,b,c,d){return od(a,b,c,d)},truncateOnWord:function(a,b,c,d){return od(a,b,c,d,!0)},pad:function(a,b,c){b=za(b);var d=E(0,b-a.length)/2;b=Pa(d);d=oa(d);return Hb(b,c)+a+Hb(d,c)},padLeft:function(a,b,c){b=za(b);return Hb(E(0,b-a.length),c)+a},padRight:function(a,b,c){b=za(b);return a+Hb(E(0,b-a.length),c)},first:function(a,b){v(b)&&(b=1);return a.substr(0,b)},last:function(a,b){v(b)&&(b=1);return a.substr(0>a.length-b?0:a.length-b)},toNumber:function(a,b){return Yb(a,b)},capitalize:function(a, -b,c){return gc(a,b,c)},trimLeft:function(a){return a.replace(Gf,"")},trimRight:function(a){return a.replace(Hf,"")}});mb(Ya,{replaceAll:function(a,b,c){return rd(a,b,c)},format:function(a,b){var c=b[0]&&b[0].valueOf();1===b.length&&I(c)&&(b=c);return Jf(a,b)}});(function(){function a(a){return function(b){try{return a(b)}catch(g){return""}}}if("undefined"!==typeof Buffer)wc=function(a){return Buffer.from(a).toString("base64")},xc=function(a){return Buffer.from(a,"base64").toString("utf8")};else{if("undefined"!== -typeof btoa){var b=a(btoa);var c=a(atob)}else{var d=/[^A-Za-z0-9\+\/=]/g;b=function(a){var b="",c=0;do{var d=a.charCodeAt(c++);var e=a.charCodeAt(c++);var k=a.charCodeAt(c++);var m=d>>2;d=(d&3)<<4|e>>4;var r=(e&15)<<2|k>>6;var p=k&63;isNaN(e)?r=p=64:isNaN(k)&&(p=64);b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(m);b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(d);b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(r); -b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(p)}while(c>4;l=(l&15)<<4|k>>2;var r=(k&3)<<6|m;b+=pa(e);64!=k&&(b+=pa(l));64!=m&&(b+=pa(r))}while(c=f||65296<=f&&65305>=f)&&(48<=h&&57>=h||65296<=h&&65305>=h)&&(f=Yb(a.slice(c)),h=Yb(b.slice(c)))):(k=k!==a.charAt(c), -m=m!==b.charAt(c),k!==m&&0===d&&(d=k-m));c+=1}while(null!=f&&null!=h&&f===h);return f===h?d:f-h},sortEquivalents:function(){var a={};y("A\u00c1\u00c0\u00c2\u00c3\u00c4 C\u00c7 E\u00c9\u00c8\u00ca\u00cb I\u00cd\u00cc\u0130\u00ce\u00cf O\u00d3\u00d2\u00d4\u00d5\u00d6 S\u00df U\u00da\u00d9\u00db\u00dc".split(" "),function(b){var c=b.charAt(0);y(b.slice(1).split(""),function(b){a[b]=c;a[b.toLowerCase()]=c.toLowerCase()})});return a}()},Sa=Tb(M,Lf);xa(M,{create:function(a,b){return vd(a,b)},construct:function(a, -b){a=za(a);return Array.from(Array(a),function(a,d){return b&&b(d)})}});P(M,{isEmpty:function(a){return 0===a.length},isEqual:function(a,b){return Aa(a,b)},clone:function(a){return Ra(a)},at:function(a,b,c){return Pc(a,b,c)},add:function(a,b,c){return wd(Ra(a),b,c)},subtract:function(a,b){return zd(a,b,!0)},append:function(a,b,c){return wd(a,b,c)},removeAt:function(a,b,c){if(v(b))return a;v(c)&&(c=b);a.splice(b,c-b+1);return a},unique:function(a,b){return xd(a,b)},flatten:function(a,b){return yd(a, -b)},first:function(a,b){if(v(b))return a[0];0>b&&(b=0);return a.slice(0,b)},last:function(a,b){return v(b)?a[a.length-1]:a.slice(0>a.length-b?0:a.length-b)},from:function(a,b){return a.slice(b)},to:function(a,b){v(b)&&(b=a.length);return a.slice(0,b)},compact:function(a,b){return ef(a,b)},groupBy:function(a,b,c){return ff(a,b,c)},inGroups:function(a,b,c){var d=m(c),e=Array(b),f=oa(a.length/b);Vb(b,function(b){var g=b*f,l=a.slice(g,g+f);d&&l.lengthb&&(b+=l);b=m(b,l);Jc(c.length);r=p?p(r,e):r;d.push(g(a,b,r,e,l,h));e&&d.push(e);a=f.apply(k(a,b,h),d);q&&(a=q(a,b,l));return a}}q({forEach:{i:function(a){y(this,a)}},map:{v:Od}, -"some every":{v:wa},findIndex:{v:wa,result:function(a,b,c){-1!==a&&(a=(a+b)%c);return a}},reduce:{apply:c},"filter find":{v:wa},reduceRight:{apply:c,slice:function(a,b,c){c||(a=a.slice(0,E(0,b+1)));return a},clamp:function(a,b){return ea(b,E(-1,a))}}},function(a,b){y(b.split(" "),function(b){mb(M,b+"FromIndex",e(b,a))})})})();var Qd=Tb(fa,{decimal:".",thousands:","});xa(fa,{random:function(a,b){1==arguments.length&&(b=a,a=0);var c=ea(a||0,v(b)?1:b);var d=E(a||0,v(b)?1:b)+1;return K(Math.random()* -(d-c)+c)}});P(fa,{isInteger:function(a){return 0===a%1},isOdd:function(a){return 0===a%1&&0!==a%2},isEven:function(a){return 0===a%2},isMultipleOf:function(a,b){return 0===a%b},log:function(a,b){return Math.log(a)/(b?Math.log(b):1)},abbr:function(a,b){return oc(a,b,"|kmbt")},metric:function(a,b,c){"all"===c?c="yzafpn\u03bcm|KMGTPEZY":c||(c="n\u03bcm|k");return oc(a,b,c)},bytes:function(a,b,c,d){"binary"===d||!d&&c?d="|,Ki,Mi,Gi,Ti,Pi,Ei":"si"!==d&&d||(d="|KMGTPE");return oc(a,b,d,c)+"B"},format:function(a, -b){return Pd(a,b)},hex:function(a,b){return Q(a,b||1,!1,16)},times:function(a,b){for(var c,d,e=0;e=b)return a.call(this,d)}},once:function(a){var b=!1,c;return function(){if(b)return c;b=!0;return c=a.apply(this,arguments)}},memoize:function(a,b,c){if(!F(b)){var d=b;b=c}if(A(d)){var e=d;d=function(a){return tb(a,e)}}else d||(d=xf);return yf(a,d,b)},lock:function(a,b){if(he(a))return Nb(a,F(b)?b:null),a;var c=function(){arguments.length=ea(Nb(c),arguments.length);return a.apply(this,arguments)};Nb(c,F(b)?b:a.length);return c}});mb(tc,{partial:function(a, -b){function c(){var e=0,f=[],g=this,h=Nb(c),l;for(l=0;l=this.start&&a.start<=this.end&&a.end>=this.start&&a.end<=this.end:a>=this.start&&a<=this.end},every:function(a,b){return Mb(this,a,!1,b)},toArray:function(){return Mb(this)},union:function(a){return new O(this.starta.end?this.end:a.end)},intersect:function(a){return a.start>this.end||a.enda.start?this.start:a.start,this.endc)c=function(){return Mb(this,b,!0)};else{var e=Zd[cb(d)]; -c=function(){return K((this.end-this.start)/e)}}a[d]=c});Ic(O,a)})()}).call(this);}).call(this); diff --git a/dist/sugar-es5.min.map b/dist/sugar-es5.min.map deleted file mode 100644 index 484b91e35..000000000 --- a/dist/sugar-es5.min.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"", -"lineCount":151, -"mappings":"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", -"sources":["/Users/andrew/Projects/Sugar/dist/sugar-es5.tmp.js"], -"names":["PrimitiveRangeConstructor","start","end","Range","forEachProperty","obj","fn","key","hasOwn","call","testGlobal","Object","createNamespace","name","defineWithOptionCollect","methodName","instance","args","setProperty","sugarNamespace","arg1","arg2","arg3","opts","collectDefineOptions","defineMethods","methods","last","isObject","getNewChainableClass","STATIC","INSTANCE","extendNative","globalContext","prototype","defineChainableMethod","source","method","extend","arrayOptionExists","field","val","arr","i","el","arrayOptionExcludes","disallowedByFlags","target","flags","length","nativeClass","nativeProto","staticMethods","instanceMethods","methodsByName","objectPrototype","allowObjectPrototype","namespacesByName","namespacesByClassString","mapNativeToChainable","mapObjectChainablesToNamespace","Sugar","toString","SUGAR_GLOBAL","type","staticMethod","wrapMethodWithArguments","instanceMethod","wrapInstanceMethodFixed","active","startCollect","collectedArgs","push","len","Math","max","arguments","apply","a","b","c","d","polyfill","override","SugarChainable","arg","constructor","raw","wrapped","wrapWithChainableResult","existing","dcp","DefaultChainable","collision","disambiguate","disambiguateMethod","mapObjectChainableToAllNamespaces","proto","classToString","methodNames","ownPropertyNames","e","definePropertyShim","prop","descriptor","value","enumerable","defineProperty","configurable","writable","internalToString","internalHasOwnProperty","getOwn","isClass","className","str","wrapNamespace","defineInstanceSimilar","set","defineInstance","collectSimilarMethods","defineInstanceAndStaticSimilar","defineInstanceAndStatic","isString","split","forEach","fixArgumentLength","staticFn","staticFn.instance","defineAccessor","namespace","defineOptionsAccessor","defaults","getOption","simpleMerge","setOption","options","defineOnPrototype","ctor","assertArgument","exists","TypeError","assertCallable","isFunction","coercePositiveInteger","n","isNumber","isFinite","RangeError","trunc","isDefined","o","undefined","isUndefined","privatePropertyAccessor","privateKey","PRIVATE_PROP_PREFIX","setChainableConstructor","createFn","sugarNamespace.prototype.constructor","getMatcher","f","isPrimitive","isRegExp","regexMatcher","isDate","dateMatcher","functionMatcher","isPlainObject","fuzzyMatcher","defaultMatcher","matchers","matched","isObjectType","isEqual","reg","RegExp","test","ms","getTime","deepGetProperty","any","handleDeepProperty","has","fill","fillLast","ns","bs","String","indexOf","handleArrayIndexRange","blen","ps","HALF_WIDTH_PERIOD","j","plen","isLast","cbi","isIndex","isPush","nextIsIndex","slice","match","PROPERTY_RANGE_REG","leading","isArray","trailing","charAt","map","getOwnKey","hasConstructor","objectProto","simpleRepeat","coercePrimitiveToObject","NO_KEYS_IN_STRING_OBJECTS","chr","stack","aClass","bClass","isSerializable","objectIsEqual","isSet","size","setToArray","isMap","mapToArray","isError","aType","bType","valueOf","count","propsEqual","iterateWithCyclicCheck","cyc","keys","serializeInternal","refs","sign","Infinity","serializeDeep","ref","result","sortedKeys","next","pop","iterateWithSortedKeys","sort","isArrayIndex","getSparseArrayIndexes","fromIndex","loop","fromRight","indexes","aLoop","getEntriesForIndexes","find","entryAtIndex","Array","index","getNormalizedIndex","mapWithShortcuts","context","mapArgs","m","filter","withPrecision","precision","multiplier","pow","abs","round","padNumber","num","place","base","replacement","repeatString","replace","getOrdinalSuffix","stringToNumber","isDecimal","sanitized","fullWidthNumberReg","fullWidthNumberMap","parseFloat","parseInt","simpleCapitalize","toUpperCase","createFormatMatcher","bracketMatcher","percentMatcher","precheck","getToken","format","bKey","pLit","pKey","token","get","literal","assertPassesPrecheck","opt","getLiteral","getSubstring","sub","assertNoUnmatched","OPEN_BRACE","CLOSE_BRACE","bt","pt","STRING_FORMAT_REG","compileMemoized","memoizeFunction","compile","lastIndex","exec","runHumanRules","Inflections","human","runRules","getRegExpFlags","add","checkFlag","flag","global","ignoreCase","multiline","sticky","escapeRegExp","callDateGet","_utc","callDateSet","safe","memo","counter","INTERNAL_MEMOIZE_LIMIT","defineNativeMethodsOnChainable","addDateTokens","prefix","dateTokens","nativeTokens","tokens","arrayIndexOf","search","increment","defaultFromIndex","sparseIndexOf","shift","arrayReduce","initialValue","defined","getCoercedStringSubject","getCoercedSearchString","getNewDate","_dateOptions","cloneDate","clone","Date","assertDateIsValid","isNaN","getWeekday","getDate","getMonth","getYear","setDate","getDaysInMonth","setWeekday","dow","dir","currentWeekday","ndir","offset","getUTCOffset","iso","getTimezoneOffset","colon","hours","mins","collectUpdateDateArguments","allowDuration","params","toLowerCase","reset","collectDateParamsFromArguments","walkUnitDown","YEAR_INDEX","unit","iterateOverDateUnits","startIndex","endIndex","DateUnits","unitIndex","getLowerUnitIndex","MONTH_INDEX","DAY_INDEX","WEEK_INDEX","HOURS_INDEX","iterateOverDateParams","getDateParamKey","iterateOverHigherDateParams","advanceDate","updateDate","advanceDateWithArgs","moveToBeginningOfWeek","firstDayOfWeek","floor","moveToEndOfWeek","ceil","moveToBeginningOfUnit","localeCode","localeManager","getFirstDayOfWeek","setUnitAndLowerToEdge","moveToEndOfUnit","stopIndex","getUnitIndexForParamName","getTimeDistanceForUnit","d1","d2","fwd","tmp","ambiguous","setISOWeekNumber","isoWeek","ISO_FIRST_DAY_OF_WEEK_YEAR","ISO_FIRST_DAY_OF_WEEK","getWeekNumber","allowPrevious","firstDayOfWeekYear","getWeekYear","year","month","loc","getFirstDayOfWeekYear","week","dateRelative","dRelative","adu","getAdjustedUnitForDate","concat","dateFormat","getRelativeFormat","getAdjustedUnit","getAdjustedUnitForNumber","u","CoreOutputFormats","dateFormatMatcher","getMeridiemToken","ampm","fullCompareDate","date","margin","trim","compareDay","English","weekdayMap","monthMap","compareDate","loMargin","hiMargin","fromUTC","setUTC","p","getExtendedDate","specificity","edge","compareEdges","t","min","timezoneShift","MINUTES","comp","createDate","forceClone","contextDate","parseFormatValues","dif","optParams","to","param","ABBREVIATED_YEAR_REG","optPrefer","prefer","delta","parseValue","cloneDateByFlag","optFromUTC","optSetUTC","fireCallbacks","afterCallbacks","parseStringDate","optLocale","compiledFormats","cacheFormat","timestamp","setTime","hour","utc","tzHour","tzMinute","minute","weekday","setOrdinalWeekday","midday","handleMidday","day","half","separateAbsoluteUnits","units","relative","handleEdge","weekdayDir","edgeIndex","unitName","weekdayOfMonth","NaN","optClone","setupOptions","locale","advance","disambiguateHigherUnit","upperUnitIndex","setUnit","fraction","lowerUnit","checkMonth","targetMonth","millisecond","arrayToRegAlternates","joined","join","getRegNonCapturing","src","getParsingTokenWithSuffix","suffix","LocalizedParsingTokens","requiresSuffix","requiresSuffixOr","getArrayWithOffset","alternate","getNewLocale","def","Locale","init","getMonthName","monthSuffix","months","getWeekdayName","weekdays","parseNumber","numeralMap","parseRegularNumerals","parseIrregularNumerals","isPlace","numeral","digit","lastWasPlace","getOrdinal","ordinalSuffix","convertAdjustedToFormat","getDuration","plural","mult","full","splice","unshift","addFormat","getTokenSrc","nc","parsingAliases","formatToSrc","CoreParsingTokens","parsingTokens","code","mod","addRawFormat","buildValueArray","all","setMap","forAllAlternates","alt","idx","forEachAlternate","suffixes","getCoreTokensForBase","addFormatSet","allowTime","timeFront","getTimeAfter","markers","localized","timeMarkers","timeMarkerOptional","initArrayFields","LOCALE_ARRAY_FIELDS","HALF_WIDTH_COMMA","buildNumerals","getTimeFormat","sep","timeSeparator","ampmFront","buildParsingTokens","requiresNumerals","numeralUnits","numerals","placeholders","articles","allowsFullWidth","fullWidthNumbers","buildTimeSuffixes","timeSuffixes","alias","buildModifiers","modifiers","modifier","mapKey","addCoreFormats","CoreParsingFormats","df","localeCheck","mdy","time","padString","padding","truncateString","from","ellipsis","str2","truncateOnWord","len1","len2","str1","stringEach","chunk","lastLastIndex","r","eachWord","stringCodes","codes","charCodeAt","stringUnderscore","areg","acronyms","acronym","stringCamelize","upper","CAMELIZE_REG","pre","word","cap","stringCapitalize","downcase","CAPITALIZE_REG","stringTitleize","fullStopPunctuation","lastHadPunctuation","words","first","hasPunctuation","isFirstOrLast","DOWNCASED_WORDS","limit","fromLeft","reverse","TRUNC_REG","unescapeHTML","HTML_ENTITY_REG","hex","HTMLFromEntityMap","special","stringReplaceAll","replaceTags","strip","tags","runTagReplacements","fullString","processTag","tagName","attributes","tagLength","isVoid","content","currentIndex","s","openTagCount","isClosingTag","isSelfClosing","HTML_VOID_ELEMENTS","isOpeningTag","isSameAsCurrent","openTagName","openTagAttributes","numberOrIndex","arrayCreate","arrayClone","arrayWrap","arraySafeConcat","arr2","arrayAppend","spliceArgs","arrayUnique","transformed","arrayFlatten","level","current","arrayCompact","arrayGroupBy","arrayIntersectOrSubtract","arr1","subtract","compareValue","aVal","bVal","collate","_arrayOptions","cmp","getCollationReadyString","sortIgnore","sortIgnoreCase","getCollationCharacter","sortEquivalents","toQueryString","deep","transform","separator","qc","sanitizeURIComponent","collectObjectAsQueryString","fullKey","encodeURIComponent","fromQueryStringWithOptions","auto","decodeURIComponent","DEEP_QUERY_STRING_REG","parseDeepQueryComponent","setQueryProperty","inner","k","fnValue","getQueryValueAuto","NON_DECIMAL_REG","mergeWithOptions","objectMerge","resolve","hidden","mergeAll","sources","iterateOverProperties","getOwnPropertyNames","iterateOverKeys","getOwnPropertySymbols","getFn","desc","getOwnPropertyDescriptor","resolveByFunction","resolveConflicts","getNewObjectForMerge","sourceVal","targetVal","resolved","goDeep","klass","getValues","values","tap","selectFromObject","select","objectRemove","matcher","objectExclude","objectIntersectOrSubtract","obj1","obj2","val1","sum","enumerateWithMapping","average","median","middle","getMinOrMax","asObject","pushVal","isBoolean","getReducedMinMaxResult","getLeastOrMost","most","group","groupKey","minMaxResult","reduce","arrayIndexes","mapped","enhancedMapping","enhancedMatching","wrapNativeArrayMethod","wrapper","nativeFn","argsLen","objectForEach","objectMap","objectReduce","acc","objectFilter","objectCount","wrapObjectMatcher","abbreviateNumber","ustr","bytes","fixed","toFixed","decimalPlace","numeralPlace","significant","mid","divisor","numberFormat","decimal","_numberOptions","thousands","integer","createRoundingFunction","setDelay","after","scope","_timers","_canceled","setTimeout","cancelFunction","timers","timer","clearTimeout","createLazyFunction","immediate","lazy","queue","locked","$i","$len","execute","rounded","perExecution","queueLength","maxPerRound","Function","collectArguments","createHashedMemoizeFunction","hashFn","hashObj","cloneRangeMember","getRangeMemberNumericValue","getRangeMemberPrimitiveValue","getPrecision","isValidRangeMember","rangeIsValid","range","rangeEvery","step","countOnly","inverse","dio","getDateIncrementObject","incrementDate","amt","DURATION_REG","amount","MULTIPLIERS","rangeClamp","clamped","getDateForRange","sugarDate","create","window","defineProperties","hasOwnProperty","setupGlobal","module","exports","sugarObject","sugarArray","sugarString","sugarNumber","Number","sugarFunction","sugarRegExp","defineStatic","defineStaticPolyfill","defineInstancePolyfill","defineInstanceWithArguments","fromCharCode","buildClassChecks","addKnownType","knownTypes","buildClassCheck","globalObject","getConstructorClassCheck","getToStringClassCheck","ctorStr","buildPrimitiveClassCheck","addCoreTypes","names","Set","Map","addArrayTypes","buildFullWidthNumber","fwn","FULL_WIDTH_ZERO","HALF_WIDTH_ZERO","FULL_WIDTH_PERIOD","DONT_ENUM_PROPS","buildDontEnumFix","propertyIsEnumerable","forEachEnumerableProperty","every","some","lastIndexOf","eachFn","reduceFn","reduceRight","TRIM_REG","bind","boundArgs","bound","now","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toJSON","hasISOSupport","UTC","includes","searchString","pos","startsWith","position","searchLength","substr","endsWith","endPosition","repeat","mapFn","findIndex","TIMEZONE_ABBREVIATION_REG","FormatTokensBase","ldml","strf","lowerToken","allowAlternates","strfPadding","ldmlPaddedToken","ordinalToken","doy","ldmlTwoDigitToken","strfTwoDigitToken","DATE_OPTIONS","defaultNewDate","ldmlTokens","strfTokens","getLocale","getAllLocales","getAll","getAllLocaleCodes","setLocale","addLocale","removeLocale","remove","rewind","setISOWeek","getISOWeek","beginningOfISOWeek","endOfISOWeek","on","isUTC","isValid","isAfter","isBefore","isBetween","t1","t2","lo","hi","isLeapYear","daysInMonth","relativeFn","relativeTo","is","getUTCWeekday","getUTCDay","duration","EnglishLocaleBaseDefinition","AmericanEnglishDefinition","v","BritishEnglishDefinition","CanadianEnglishDefinition","LazyLoadedLocales","buildLocales","LocaleManager","locales","fallback","buildDateFormatTokens","addFormats","buildLowercase","buildOrdinal","buildPadded","buildTwoDigits","buildAlias","buildAlternate","getIdentityFormat","getPadded","buildDateFormatMatcher","getLdml","getStrf","checkDateToken","buildDateUnitMethods","caps","until","since","buildNumberUnitMethods","before","buildRelativeAliases","together","HTML_ESCAPE_REG","HTMLToEntityMap","LEFT_TRIM_REG","RIGHT_TRIM_REG","nativeIncludes","encodeBase64","decodeBase64","stringFormatMatcher","callIncludesWithRegexSupport","ENHANCEMENTS_FLAG","STRING_ENHANCEMENTS_FLAG","at","escapeURL","encodeURI","unescapeURL","decodeURI","escapeHTML","stripTags","tag","removeTags","chars","eachCharFn","eachWordFn","lines","eachLineFn","eachCodeFn","isBlank","isEmpty","insert","removeAll","compact","whitespace","dasherize","underscore","camelize","spacify","titleize","parameterize","truncate","pad","front","back","padLeft","padRight","toNumber","capitalize","lower","trimLeft","trimRight","replaceAll","buildBase64","catchEncodingError","Buffer","btoa","encodeAscii","decodeAscii","atob","base64reg","output","chr1","chr2","chr3","enc1","enc2","enc3","enc4","input","unescape","escape","buildEntities","HAS_CONCAT_BUG","ARRAY_OPTIONS","getSortOrder","collateStrings","tiebreaker","sortOrder","sortNatural","aChar","bChar","aValue","bValue","HALF_WIDTH_NINE","FULL_WIDTH_NINE","aEquiv","bEquiv","getSortEquivalents","equivalents","construct","indexMapFn","item","append","removeAt","unique","flatten","groupBy","groupFn","inGroups","inGroupsOf","shuffle","x","random","sample","single","sortBy","aProperty","bProperty","exclude","union","intersect","zip","fromQueryString","merge","addAll","invert","multi","isArguments","callee","reject","buildClassCheckMethods","checks","NATIVE_TYPES","enhancedSome","enhancedFilter","enhancedMap","enhancedEvery","enhancedFind","enhancedFindIndex","ARRAY_ENHANCEMENTS_FLAG","arrayNone","arrayCount","least","objectSome","objectEvery","objectFind","none","buildFromIndexMethods","sliceArrayFromLeft","clampStartIndex","applyReduce","applyEach","createFromIndexWithOptions","baseFn","applyCallback","sliceArray","clampIndex","clamp","getResult","callArgs","argIndex","lastArg","forEachAsNative","indexResult","sliceArrayFromRight","clampStartIndexFromRight","baseName","NUMBER_OPTIONS","n1","n2","minNum","maxNum","isInteger","isOdd","isEven","isMultipleOf","log","abbr","BASIC_UNITS","metric","METRIC_UNITS_FULL","METRIC_UNITS_SHORT","binary","MEMORY_BINARY_UNITS","MEMORY_UNITS","times","ordinalize","buildMathAliases","_lock","_partial","createInstanceFromPrototype","throttle","debounce","debounced","cancel","once","called","memoize","lock","lockedFn","partial","curriedArgs","partialFn","applyArgs","self","curriedLen","delay","getFlags","setFlags","addFlags","removeFlags","span","contains","everyFn","toArray","upto","RANGE_REG_FROM_TO","RANGE_REG_REAR_DURATION","RANGE_REG_FRONT_DURATION","DateRangeConstructor","datetime","buildDateRangeUnits"] -} diff --git a/dist/sugar.js b/dist/sugar.js index 89c5bbbe7..0c4eda249 100644 --- a/dist/sugar.js +++ b/dist/sugar.js @@ -1,13554 +1,822 @@ -/* - * Sugar v2.0.6 - * - * Freely distributable and licensed under the MIT-style license. - * Copyright (c) Andrew Plummer - * https://sugarjs.com/ - * - * ---------------------------- */ -(function() { - 'use strict'; - - /*** - * @module Core - * @description Core functionality including the ability to define methods and - * extend onto natives. - * - ***/ - - // The global to export. - var Sugar; - - // The name of Sugar in the global namespace. - var SUGAR_GLOBAL = 'Sugar'; - - // Natives available on initialization. Letting Object go first to ensure its - // global is set by the time the rest are checking for chainable Object methods. - var NATIVE_NAMES = 'Object Number String Array Date RegExp Function'; - - // Static method flag - var STATIC = 0x1; - - // Instance method flag - var INSTANCE = 0x2; - - // IE8 has a broken defineProperty but no defineProperties so this saves a try/catch. - var PROPERTY_DESCRIPTOR_SUPPORT = !!(Object.defineProperty && Object.defineProperties); - - var globalContext = getGlobal(); - - // Whether object instance methods can be mapped to the prototype. - var allowObjectPrototype = false; - - // A map from Array to SugarArray. - var namespacesByName = {}; - - // A map from [object Object] to namespace. - var namespacesByClassString = {}; - - // Defining properties. - // istanbul ignore next - var defineProperty = PROPERTY_DESCRIPTOR_SUPPORT ? Object.defineProperty : definePropertyShim; - - // A default chainable class for unknown types. - var DefaultChainable = getNewChainableClass('Chainable'); - - - // Global methods - - function getGlobal() { - // Get global context by keyword here to avoid issues with libraries - // that can potentially alter this script's context object. - return testGlobal(typeof global !== 'undefined' && global) || - testGlobal(typeof window !== 'undefined' && window); - } - - function testGlobal(obj) { - // Note that Rhino uses a different "global" keyword so perform an - // extra check here to ensure that it's actually the global object. - return obj && obj.Object === Object ? obj : null; - } - - function setupGlobal() { - Sugar = globalContext[SUGAR_GLOBAL]; - // istanbul ignore if - if (Sugar) { - // Reuse already defined Sugar global object. - return; - } - Sugar = function(arg) { - forEachProperty(Sugar, function(sugarNamespace, name) { - // Although only the only enumerable properties on the global - // object are Sugar namespaces, environments that can't set - // non-enumerable properties will step through the utility methods - // as well here, so use this check to only allow true namespaces. - if (hasOwn(namespacesByName, name)) { - sugarNamespace.extend(arg); - } - }); - return Sugar; - }; - // istanbul ignore else - if (typeof module !== 'undefined' && module.exports) { - // Node or webpack environment - module.exports = Sugar; - } else { - // Unwrapped browser environment - try { - globalContext[SUGAR_GLOBAL] = Sugar; - } catch (e) { - // Contexts such as QML have a read-only global context. - } - } - forEachProperty(NATIVE_NAMES.split(' '), function(name) { - createNamespace(name); - }); - setGlobalProperties(); - } - - /*** - * @method createNamespace(name) - * @returns SugarNamespace - * @namespace Sugar - * @short Creates a new Sugar namespace. - * @extra This method is for plugin developers who want to define methods to be - * used with natives that Sugar does not handle by default. The new - * namespace will appear on the `Sugar` global with all the methods of - * normal namespaces, including the ability to define new methods. When - * extended, any defined methods will be mapped to `name` in the global - * context. - * - * @example - * - * Sugar.createNamespace('Boolean'); - * - * @param {string} name - The namespace name. - * - ***/ - function createNamespace(name) { - - // Is the current namespace Object? - var isObject = name === 'Object'; - - // A Sugar namespace is also a chainable class: Sugar.Array, etc. - var sugarNamespace = getNewChainableClass(name, true); - - /*** - * @method extend([opts]) - * @returns Sugar - * @namespace Sugar - * @short Extends Sugar defined methods onto natives. - * @extra This method can be called on individual namespaces like - * `Sugar.Array` or on the `Sugar` global itself, in which case - * [opts] will be forwarded to each `extend` call. For more, - * see `extending`. - * - * @options - * - * methods An array of method names to explicitly extend. - * - * except An array of method names or global namespaces (`Array`, - * `String`) to explicitly exclude. Namespaces should be the - * actual global objects, not strings. - * - * namespaces An array of global namespaces (`Array`, `String`) to - * explicitly extend. Namespaces should be the actual - * global objects, not strings. - * - * enhance A shortcut to disallow all "enhance" flags at once - * (flags listed below). For more, see `enhanced methods`. - * Default is `true`. - * - * enhanceString A boolean allowing String enhancements. Default is `true`. - * - * enhanceArray A boolean allowing Array enhancements. Default is `true`. - * - * objectPrototype A boolean allowing Sugar to extend Object.prototype - * with instance methods. This option is off by default - * and should generally not be used except with caution. - * For more, see `object methods`. - * - * @example - * - * Sugar.Array.extend(); - * Sugar.extend(); - * - * @option {Array} [methods] - * @option {Array} [except] - * @option {Array} [namespaces] - * @option {boolean} [enhance] - * @option {boolean} [enhanceString] - * @option {boolean} [enhanceArray] - * @option {boolean} [objectPrototype] - * @param {ExtendOptions} [opts] - * - *** - * @method extend([opts]) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Extends Sugar defined methods for a specific namespace onto natives. - * @param {ExtendOptions} [opts] - * - ***/ - var extend = function (opts) { - - var nativeClass = globalContext[name], nativeProto = nativeClass.prototype; - var staticMethods = {}, instanceMethods = {}, methodsByName; - - function objectRestricted(name, target) { - return isObject && target === nativeProto && - (!allowObjectPrototype || name === 'get' || name === 'set'); - } - - function arrayOptionExists(field, val) { - var arr = opts[field]; - if (arr) { - for (var i = 0, el; el = arr[i]; i++) { - if (el === val) { - return true; - } - } - } - return false; - } - - function arrayOptionExcludes(field, val) { - return opts[field] && !arrayOptionExists(field, val); - } - - function disallowedByFlags(methodName, target, flags) { - // Disallowing methods by flag currently only applies if methods already - // exist to avoid enhancing native methods, as aliases should still be - // extended (i.e. Array#all should still be extended even if Array#every - // is being disallowed by a flag). - if (!target[methodName] || !flags) { - return false; - } - for (var i = 0; i < flags.length; i++) { - if (opts[flags[i]] === false) { - return true; - } - } - } - - function namespaceIsExcepted() { - return arrayOptionExists('except', nativeClass) || - arrayOptionExcludes('namespaces', nativeClass); - } - - function methodIsExcepted(methodName) { - return arrayOptionExists('except', methodName); - } - - function canExtend(methodName, method, target) { - return !objectRestricted(methodName, target) && - !disallowedByFlags(methodName, target, method.flags) && - !methodIsExcepted(methodName); - } - - opts = opts || {}; - methodsByName = opts.methods; - - if (namespaceIsExcepted()) { - return; - } else if (isObject && typeof opts.objectPrototype === 'boolean') { - // Store "objectPrototype" flag for future reference. - allowObjectPrototype = opts.objectPrototype; - } - - forEachProperty(methodsByName || sugarNamespace, function(method, methodName) { - if (methodsByName) { - // If we have method names passed in an array, - // then we need to flip the key and value here - // and find the method in the Sugar namespace. - methodName = method; - method = sugarNamespace[methodName]; - } - if (hasOwn(method, 'instance') && canExtend(methodName, method, nativeProto)) { - instanceMethods[methodName] = method.instance; - } - if(hasOwn(method, 'static') && canExtend(methodName, method, nativeClass)) { - staticMethods[methodName] = method; - } - }); - - // Accessing the extend target each time instead of holding a reference as - // it may have been overwritten (for example Date by Sinon). Also need to - // access through the global to allow extension of user-defined namespaces. - extendNative(nativeClass, staticMethods); - extendNative(nativeProto, instanceMethods); - - if (!methodsByName) { - // If there are no method names passed, then - // all methods in the namespace will be extended - // to the native. This includes all future defined - // methods, so add a flag here to check later. - setProperty(sugarNamespace, 'active', true); - } - return sugarNamespace; - }; - - function defineWithOptionCollect(methodName, instance, args) { - setProperty(sugarNamespace, methodName, function(arg1, arg2, arg3) { - var opts = collectDefineOptions(arg1, arg2, arg3); - defineMethods(sugarNamespace, opts.methods, instance, args, opts.last); - return sugarNamespace; - }); - } - - /*** - * @method defineStatic(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines static methods on the namespace that can later be extended - * onto the native globals. - * @extra Accepts either a single object mapping names to functions, or name - * and function as two arguments. If `extend` was previously called - * with no arguments, the method will be immediately mapped to its - * native when defined. - * - * @example - * - * Sugar.Number.defineStatic({ - * isOdd: function (num) { - * return num % 2 === 1; - * } - * }); - * - * @signature defineStatic(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineStatic', STATIC); - - /*** - * @method defineInstance(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines methods on the namespace that can later be extended as - * instance methods onto the native prototype. - * @extra Accepts either a single object mapping names to functions, or name - * and function as two arguments. All functions should accept the - * native for which they are mapped as their first argument, and should - * never refer to `this`. If `extend` was previously called with no - * arguments, the method will be immediately mapped to its native when - * defined. - * - * Methods cannot accept more than 4 arguments in addition to the - * native (5 arguments total). Any additional arguments will not be - * mapped. If the method needs to accept unlimited arguments, use - * `defineInstanceWithArguments`. Otherwise if more options are - * required, use an options object instead. - * - * @example - * - * Sugar.Number.defineInstance({ - * square: function (num) { - * return num * num; - * } - * }); - * - * @signature defineInstance(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineInstance', INSTANCE); - - /*** - * @method defineInstanceAndStatic(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short A shortcut to define both static and instance methods on the namespace. - * @extra This method is intended for use with `Object` instance methods. Sugar - * will not map any methods to `Object.prototype` by default, so defining - * instance methods as static helps facilitate their proper use. - * - * @example - * - * Sugar.Object.defineInstanceAndStatic({ - * isAwesome: function (obj) { - * // check if obj is awesome! - * } - * }); - * - * @signature defineInstanceAndStatic(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineInstanceAndStatic', INSTANCE | STATIC); - - - /*** - * @method defineStaticWithArguments(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines static methods that collect arguments. - * @extra This method is identical to `defineStatic`, except that when defined - * methods are called, they will collect any arguments past `n - 1`, - * where `n` is the number of arguments that the method accepts. - * Collected arguments will be passed to the method in an array - * as the last argument defined on the function. - * - * @example - * - * Sugar.Number.defineStaticWithArguments({ - * addAll: function (num, args) { - * for (var i = 0; i < args.length; i++) { - * num += args[i]; - * } - * return num; - * } - * }); - * - * @signature defineStaticWithArguments(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineStaticWithArguments', STATIC, true); - - /*** - * @method defineInstanceWithArguments(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines instance methods that collect arguments. - * @extra This method is identical to `defineInstance`, except that when - * defined methods are called, they will collect any arguments past - * `n - 1`, where `n` is the number of arguments that the method - * accepts. Collected arguments will be passed to the method as the - * last argument defined on the function. - * - * @example - * - * Sugar.Number.defineInstanceWithArguments({ - * addAll: function (num, args) { - * for (var i = 0; i < args.length; i++) { - * num += args[i]; - * } - * return num; - * } - * }); - * - * @signature defineInstanceWithArguments(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - defineWithOptionCollect('defineInstanceWithArguments', INSTANCE, true); - - /*** - * @method defineStaticPolyfill(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines static methods that are mapped onto the native if they do - * not already exist. - * @extra Intended only for use creating polyfills that follow the ECMAScript - * spec. Accepts either a single object mapping names to functions, or - * name and function as two arguments. Note that polyfill methods will - * be immediately mapped onto their native prototype regardless of the - * use of `extend`. - * - * @example - * - * Sugar.Object.defineStaticPolyfill({ - * keys: function (obj) { - * // get keys! - * } - * }); - * - * @signature defineStaticPolyfill(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - setProperty(sugarNamespace, 'defineStaticPolyfill', function(arg1, arg2, arg3) { - var opts = collectDefineOptions(arg1, arg2, arg3); - extendNative(globalContext[name], opts.methods, true, opts.last); - return sugarNamespace; - }); - - /*** - * @method defineInstancePolyfill(methods) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Defines instance methods that are mapped onto the native prototype - * if they do not already exist. - * @extra Intended only for use creating polyfills that follow the ECMAScript - * spec. Accepts either a single object mapping names to functions, or - * name and function as two arguments. This method differs from - * `defineInstance` as there is no static signature (as the method - * is mapped as-is to the native), so it should refer to its `this` - * object. Note that polyfill methods will be immediately mapped onto - * their native prototype regardless of the use of `extend`. - * - * @example - * - * Sugar.Array.defineInstancePolyfill({ - * indexOf: function (arr, el) { - * // index finding code here! - * } - * }); - * - * @signature defineInstancePolyfill(methodName, methodFn) - * @param {Object} methods - Methods to be defined. - * @param {string} methodName - Name of a single method to be defined. - * @param {Function} methodFn - Function body of a single method to be defined. - ***/ - setProperty(sugarNamespace, 'defineInstancePolyfill', function(arg1, arg2, arg3) { - var opts = collectDefineOptions(arg1, arg2, arg3); - extendNative(globalContext[name].prototype, opts.methods, true, opts.last); - // Map instance polyfills to chainable as well. - forEachProperty(opts.methods, function(fn, methodName) { - defineChainableMethod(sugarNamespace, methodName, fn); - }); - return sugarNamespace; - }); - - /*** - * @method alias(toName, from) - * @returns SugarNamespace - * @namespace SugarNamespace - * @short Aliases one Sugar method to another. - * - * @example - * - * Sugar.Array.alias('all', 'every'); - * - * @signature alias(toName, fn) - * @param {string} toName - Name for new method. - * @param {string|Function} from - Method to alias, or string shortcut. - ***/ - setProperty(sugarNamespace, 'alias', function(name, source) { - var method = typeof source === 'string' ? sugarNamespace[source] : source; - setMethod(sugarNamespace, name, method); - return sugarNamespace; - }); - - // Each namespace can extend only itself through its .extend method. - setProperty(sugarNamespace, 'extend', extend); - - // Cache the class to namespace relationship for later use. - namespacesByName[name] = sugarNamespace; - namespacesByClassString['[object ' + name + ']'] = sugarNamespace; - - mapNativeToChainable(name); - mapObjectChainablesToNamespace(sugarNamespace); - - - // Export - return Sugar[name] = sugarNamespace; - } - - function setGlobalProperties() { - setProperty(Sugar, 'VERSION', '2.0.6'); - setProperty(Sugar, 'extend', Sugar); - setProperty(Sugar, 'toString', toString); - setProperty(Sugar, 'createNamespace', createNamespace); - - setProperty(Sugar, 'util', { - 'hasOwn': hasOwn, - 'getOwn': getOwn, - 'setProperty': setProperty, - 'classToString': classToString, - 'defineProperty': defineProperty, - 'forEachProperty': forEachProperty, - 'mapNativeToChainable': mapNativeToChainable - }); - } - - function toString() { - return SUGAR_GLOBAL; - } - - - // Defining Methods - - function defineMethods(sugarNamespace, methods, type, args, flags) { - forEachProperty(methods, function(method, methodName) { - var instanceMethod, staticMethod = method; - if (args) { - staticMethod = wrapMethodWithArguments(method); - } - if (flags) { - staticMethod.flags = flags; - } - - // A method may define its own custom implementation, so - // make sure that's not the case before creating one. - if (type & INSTANCE && !method.instance) { - instanceMethod = wrapInstanceMethod(method, args); - setProperty(staticMethod, 'instance', instanceMethod); - } - - if (type & STATIC) { - setProperty(staticMethod, 'static', true); - } - - setMethod(sugarNamespace, methodName, staticMethod); - - if (sugarNamespace.active) { - // If the namespace has been activated (.extend has been called), - // then map this method as well. - sugarNamespace.extend(methodName); - } - }); - } - - function collectDefineOptions(arg1, arg2, arg3) { - var methods, last; - if (typeof arg1 === 'string') { - methods = {}; - methods[arg1] = arg2; - last = arg3; - } else { - methods = arg1; - last = arg2; - } - return { - last: last, - methods: methods - }; - } - - function wrapInstanceMethod(fn, args) { - return args ? wrapMethodWithArguments(fn, true) : wrapInstanceMethodFixed(fn); - } - - function wrapMethodWithArguments(fn, instance) { - // Functions accepting enumerated arguments will always have "args" as the - // last argument, so subtract one from the function length to get the point - // at which to start collecting arguments. If this is an instance method on - // a prototype, then "this" will be pushed into the arguments array so start - // collecting 1 argument earlier. - var startCollect = fn.length - 1 - (instance ? 1 : 0); - return function() { - var args = [], collectedArgs = [], len; - if (instance) { - args.push(this); - } - len = Math.max(arguments.length, startCollect); - // Optimized: no leaking arguments - for (var i = 0; i < len; i++) { - if (i < startCollect) { - args.push(arguments[i]); - } else { - collectedArgs.push(arguments[i]); - } - } - args.push(collectedArgs); - return fn.apply(this, args); - }; - } - - function wrapInstanceMethodFixed(fn) { - switch(fn.length) { - // Wrapped instance methods will always be passed the instance - // as the first argument, but requiring the argument to be defined - // may cause confusion here, so return the same wrapped function regardless. - case 0: - case 1: - return function() { - return fn(this); - }; - case 2: - return function(a) { - return fn(this, a); - }; - case 3: - return function(a, b) { - return fn(this, a, b); - }; - case 4: - return function(a, b, c) { - return fn(this, a, b, c); - }; - case 5: - return function(a, b, c, d) { - return fn(this, a, b, c, d); - }; - } - } - - // Method helpers - - function extendNative(target, source, polyfill, override) { - forEachProperty(source, function(method, name) { - if (polyfill && !override && target[name]) { - // Method exists, so bail. - return; - } - setProperty(target, name, method); - }); - } - - function setMethod(sugarNamespace, methodName, method) { - sugarNamespace[methodName] = method; - if (method.instance) { - defineChainableMethod(sugarNamespace, methodName, method.instance, true); - } - } - - - // Chainables - - function getNewChainableClass(name) { - var fn = function SugarChainable(obj, arg) { - if (!(this instanceof fn)) { - return new fn(obj, arg); - } - if (this.constructor !== fn) { - // Allow modules to define their own constructors. - obj = this.constructor.apply(obj, arguments); - } - this.raw = obj; - }; - setProperty(fn, 'toString', function() { - return SUGAR_GLOBAL + name; - }); - setProperty(fn.prototype, 'valueOf', function() { - return this.raw; - }); - return fn; - } - - function defineChainableMethod(sugarNamespace, methodName, fn) { - var wrapped = wrapWithChainableResult(fn), existing, collision, dcp; - dcp = DefaultChainable.prototype; - existing = dcp[methodName]; - - // If the method was previously defined on the default chainable, then a - // collision exists, so set the method to a disambiguation function that will - // lazily evaluate the object and find it's associated chainable. An extra - // check is required to avoid false positives from Object inherited methods. - collision = existing && existing !== Object.prototype[methodName]; - - // The disambiguation function is only required once. - if (!existing || !existing.disambiguate) { - dcp[methodName] = collision ? disambiguateMethod(methodName) : wrapped; - } - - // The target chainable always receives the wrapped method. Additionally, - // if the target chainable is Sugar.Object, then map the wrapped method - // to all other namespaces as well if they do not define their own method - // of the same name. This way, a Sugar.Number will have methods like - // isEqual that can be called on any object without having to traverse up - // the prototype chain and perform disambiguation, which costs cycles. - // Note that the "if" block below actually does nothing on init as Object - // goes first and no other namespaces exist yet. However it needs to be - // here as Object instance methods defined later also need to be mapped - // back onto existing namespaces. - sugarNamespace.prototype[methodName] = wrapped; - if (sugarNamespace === Sugar.Object) { - mapObjectChainableToAllNamespaces(methodName, wrapped); - } - } - - function mapObjectChainablesToNamespace(sugarNamespace) { - forEachProperty(Sugar.Object && Sugar.Object.prototype, function(val, methodName) { - if (typeof val === 'function') { - setObjectChainableOnNamespace(sugarNamespace, methodName, val); - } - }); - } - - function mapObjectChainableToAllNamespaces(methodName, fn) { - forEachProperty(namespacesByName, function(sugarNamespace) { - setObjectChainableOnNamespace(sugarNamespace, methodName, fn); - }); - } - - function setObjectChainableOnNamespace(sugarNamespace, methodName, fn) { - var proto = sugarNamespace.prototype; - if (!hasOwn(proto, methodName)) { - proto[methodName] = fn; - } - } - - function wrapWithChainableResult(fn) { - return function() { - return new DefaultChainable(fn.apply(this.raw, arguments)); - }; - } - - function disambiguateMethod(methodName) { - var fn = function() { - var raw = this.raw, sugarNamespace; - if (raw != null) { - // Find the Sugar namespace for this unknown. - sugarNamespace = namespacesByClassString[classToString(raw)]; - } - if (!sugarNamespace) { - // If no sugarNamespace can be resolved, then default - // back to Sugar.Object so that undefined and other - // non-supported types can still have basic object - // methods called on them, such as type checks. - sugarNamespace = Sugar.Object; - } - - return new sugarNamespace(raw)[methodName].apply(this, arguments); - }; - fn.disambiguate = true; - return fn; - } - - function mapNativeToChainable(name, methodNames) { - var sugarNamespace = namespacesByName[name], - nativeProto = globalContext[name].prototype; - - if (!methodNames && ownPropertyNames) { - methodNames = ownPropertyNames(nativeProto); - } - - forEachProperty(methodNames, function(methodName) { - if (nativeMethodProhibited(methodName)) { - // Sugar chainables have their own constructors as well as "valueOf" - // methods, so exclude them here. The __proto__ argument should be trapped - // by the function check below, however simply accessing this property on - // Object.prototype causes QML to segfault, so pre-emptively excluding it. - return; - } - try { - var fn = nativeProto[methodName]; - if (typeof fn !== 'function') { - // Bail on anything not a function. - return; - } - } catch (e) { - // Function.prototype has properties that - // will throw errors when accessed. - return; - } - defineChainableMethod(sugarNamespace, methodName, fn); - }); - } - - function nativeMethodProhibited(methodName) { - return methodName === 'constructor' || - methodName === 'valueOf' || - methodName === '__proto__'; - } - - - // Util - - // Internal references - var ownPropertyNames = Object.getOwnPropertyNames, - internalToString = Object.prototype.toString, - internalHasOwnProperty = Object.prototype.hasOwnProperty; - - // Defining this as a variable here as the ES5 module - // overwrites it to patch DONTENUM. - var forEachProperty = function (obj, fn) { - for(var key in obj) { - if (!hasOwn(obj, key)) continue; - if (fn.call(obj, obj[key], key, obj) === false) break; - } - }; - - // istanbul ignore next - function definePropertyShim(obj, prop, descriptor) { - obj[prop] = descriptor.value; - } - - function setProperty(target, name, value, enumerable) { - defineProperty(target, name, { - value: value, - enumerable: !!enumerable, - configurable: true, - writable: true - }); - } - - // PERF: Attempts to speed this method up get very Heisenbergy. Quickly - // returning based on typeof works for primitives, but slows down object - // types. Even === checks on null and undefined (no typeof) will end up - // basically breaking even. This seems to be as fast as it can go. - function classToString(obj) { - return internalToString.call(obj); - } - - function hasOwn(obj, prop) { - return !!obj && internalHasOwnProperty.call(obj, prop); - } - - function getOwn(obj, prop) { - if (hasOwn(obj, prop)) { - return obj[prop]; - } - } - - setupGlobal(); - - /*** - * @module Common - * @description Internal utility and common methods. - ***/ - - // Flag allowing native methods to be enhanced. - var ENHANCEMENTS_FLAG = 'enhance'; - - // For type checking, etc. Excludes object as this is more nuanced. - var NATIVE_TYPES = 'Boolean Number String Date RegExp Function Array Error Set Map'; - - // Do strings have no keys? - var NO_KEYS_IN_STRING_OBJECTS = !('0' in Object('a')); - - // Prefix for private properties. - var PRIVATE_PROP_PREFIX = '_sugar_'; - - // Matches 1..2 style ranges in properties. - var PROPERTY_RANGE_REG = /^(.*?)\[([-\d]*)\.\.([-\d]*)\](.*)$/; - - // WhiteSpace/LineTerminator as defined in ES5.1 plus Unicode characters in the Space, Separator category. - var TRIM_CHARS = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF'; - - // Regex for matching a formatted string. - var STRING_FORMAT_REG = /([{}])\1|{([^}]*)}|(%)%|(%(\w*))/g; - - // Common chars - var HALF_WIDTH_ZERO = 0x30, - FULL_WIDTH_ZERO = 0xff10, - HALF_WIDTH_PERIOD = '.', - FULL_WIDTH_PERIOD = '.', - HALF_WIDTH_COMMA = ',', - OPEN_BRACE = '{', - CLOSE_BRACE = '}'; - - // Namespace aliases - var sugarObject = Sugar.Object, - sugarArray = Sugar.Array, - sugarDate = Sugar.Date, - sugarString = Sugar.String, - sugarNumber = Sugar.Number, - sugarFunction = Sugar.Function, - sugarRegExp = Sugar.RegExp; - - // Class checks - var isSerializable, - isBoolean, isNumber, isString, - isDate, isRegExp, isFunction, - isArray, isSet, isMap, isError; - - function buildClassChecks() { - - var knownTypes = {}; - - function addCoreTypes() { - - var names = spaceSplit(NATIVE_TYPES); - - isBoolean = buildPrimitiveClassCheck(names[0]); - isNumber = buildPrimitiveClassCheck(names[1]); - isString = buildPrimitiveClassCheck(names[2]); - - isDate = buildClassCheck(names[3]); - isRegExp = buildClassCheck(names[4]); - - // Wanted to enhance performance here by using simply "typeof" - // but Firefox has two major issues that make this impossible, - // one fixed, the other not, so perform a full class check here. - // - // 1. Regexes can be typeof "function" in FF < 3 - // https://bugzilla.mozilla.org/show_bug.cgi?id=61911 (fixed) - // - // 2. HTMLEmbedElement and HTMLObjectElement are be typeof "function" - // https://bugzilla.mozilla.org/show_bug.cgi?id=268945 (won't fix) - isFunction = buildClassCheck(names[5]); - - // istanbul ignore next - isArray = Array.isArray || buildClassCheck(names[6]); - isError = buildClassCheck(names[7]); - - isSet = buildClassCheck(names[8], typeof Set !== 'undefined' && Set); - isMap = buildClassCheck(names[9], typeof Map !== 'undefined' && Map); - - // Add core types as known so that they can be checked by value below, - // notably excluding Functions and adding Arguments and Error. - addKnownType('Arguments'); - addKnownType(names[0]); - addKnownType(names[1]); - addKnownType(names[2]); - addKnownType(names[3]); - addKnownType(names[4]); - addKnownType(names[6]); - - } - - function addArrayTypes() { - var types = 'Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64'; - forEach(spaceSplit(types), function(str) { - addKnownType(str + 'Array'); - }); - } - - function addKnownType(className) { - var str = '[object '+ className +']'; - knownTypes[str] = true; - } - - function isKnownType(className) { - return knownTypes[className]; - } - - function buildClassCheck(className, globalObject) { - // istanbul ignore if - if (globalObject && isClass(new globalObject, 'Object')) { - return getConstructorClassCheck(globalObject); - } else { - return getToStringClassCheck(className); - } - } - - // Map and Set may be [object Object] in certain IE environments. - // In this case we need to perform a check using the constructor - // instead of Object.prototype.toString. - // istanbul ignore next - function getConstructorClassCheck(obj) { - var ctorStr = String(obj); - return function(obj) { - return String(obj.constructor) === ctorStr; - }; - } - - function getToStringClassCheck(className) { - return function(obj, str) { - // perf: Returning up front on instanceof appears to be slower. - return isClass(obj, className, str); - }; - } - - function buildPrimitiveClassCheck(className) { - var type = className.toLowerCase(); - return function(obj) { - var t = typeof obj; - return t === type || t === 'object' && isClass(obj, className); - }; - } - - addCoreTypes(); - addArrayTypes(); - - isSerializable = function(obj, className) { - // Only known objects can be serialized. This notably excludes functions, - // host objects, Symbols (which are matched by reference), and instances - // of classes. The latter can arguably be matched by value, but - // distinguishing between these and host objects -- which should never be - // compared by value -- is very tricky so not dealing with it here. - return isKnownType(className) || isPlainObject(obj, className); - }; - - } - - function isClass(obj, className, str) { - if (!str) { - str = classToString(obj); - } - return str === '[object '+ className +']'; - } - - // Wrapping the core's "define" methods to - // save a few bytes in the minified script. - function wrapNamespace(method) { - return function(sugarNamespace, arg1, arg2) { - sugarNamespace[method](arg1, arg2); - }; - } - - // Method define aliases - var alias = wrapNamespace('alias'), - defineStatic = wrapNamespace('defineStatic'), - defineInstance = wrapNamespace('defineInstance'), - defineStaticPolyfill = wrapNamespace('defineStaticPolyfill'), - defineInstancePolyfill = wrapNamespace('defineInstancePolyfill'), - defineInstanceAndStatic = wrapNamespace('defineInstanceAndStatic'), - defineInstanceWithArguments = wrapNamespace('defineInstanceWithArguments'); - - function defineInstanceSimilar(sugarNamespace, set, fn, flags) { - defineInstance(sugarNamespace, collectSimilarMethods(set, fn), flags); - } - - function defineInstanceAndStaticSimilar(sugarNamespace, set, fn, flags) { - defineInstanceAndStatic(sugarNamespace, collectSimilarMethods(set, fn), flags); - } - - function collectSimilarMethods(set, fn) { - var methods = {}; - if (isString(set)) { - set = spaceSplit(set); - } - forEach(set, function(el, i) { - fn(methods, el, i); - }); - return methods; - } - - // This song and dance is to fix methods to a different length - // from what they actually accept in order to stay in line with - // spec. Additionally passing argument length, as some methods - // throw assertion errors based on this (undefined check is not - // enough). Fortunately for now spec is such that passing 3 - // actual arguments covers all requirements. Note that passing - // the argument length also forces the compiler to not rewrite - // length of the compiled function. - function fixArgumentLength(fn) { - var staticFn = function(a) { - var args = arguments; - return fn(a, args[1], args[2], args.length - 1); - }; - staticFn.instance = function(b) { - var args = arguments; - return fn(this, b, args[1], args.length); - }; - return staticFn; - } - - function defineAccessor(namespace, name, fn) { - setProperty(namespace, name, fn); - } - - function defineOptionsAccessor(namespace, defaults) { - var obj = simpleClone(defaults); - - function getOption(name) { - return obj[name]; - } - - function setOption(arg1, arg2) { - var options; - if (arguments.length === 1) { - options = arg1; - } else { - options = {}; - options[arg1] = arg2; - } - forEachProperty(options, function(val, name) { - if (val === null) { - val = defaults[name]; - } - obj[name] = val; - }); - } - - defineAccessor(namespace, 'getOption', getOption); - defineAccessor(namespace, 'setOption', setOption); - return getOption; - } - - // For methods defined directly on the prototype like Range - function defineOnPrototype(ctor, methods) { - var proto = ctor.prototype; - forEachProperty(methods, function(val, key) { - proto[key] = val; - }); - } - - // Argument helpers - - function assertArgument(exists) { - if (!exists) { - throw new TypeError('Argument required'); - } - } - - function assertCallable(obj) { - if (!isFunction(obj)) { - throw new TypeError('Function is not callable'); - } - } - - function assertArray(obj) { - if (!isArray(obj)) { - throw new TypeError('Array required'); - } - } - - function assertWritable(obj) { - if (isPrimitive(obj)) { - // If strict mode is active then primitives will throw an - // error when attempting to write properties. We can't be - // sure if strict mode is available, so pre-emptively - // throw an error here to ensure consistent behavior. - throw new TypeError('Property cannot be written'); - } - } - - // Coerces an object to a positive integer. - // Does not allow Infinity. - function coercePositiveInteger(n) { - n = +n || 0; - if (n < 0 || !isNumber(n) || !isFinite(n)) { - throw new RangeError('Invalid number'); - } - return trunc(n); - } - - - // General helpers - - function isDefined(o) { - return o !== undefined; - } - - function isUndefined(o) { - return o === undefined; - } - - function privatePropertyAccessor(key) { - var privateKey = PRIVATE_PROP_PREFIX + key; - return function(obj, val) { - if (arguments.length > 1) { - setProperty(obj, privateKey, val); - return obj; - } - return obj[privateKey]; - }; - } - - function setChainableConstructor(sugarNamespace, createFn) { - sugarNamespace.prototype.constructor = function() { - return createFn.apply(this, arguments); - }; - } - - // Fuzzy matching helpers - - function getMatcher(f) { - if (!isPrimitive(f)) { - var className = classToString(f); - if (isRegExp(f, className)) { - return regexMatcher(f); - } else if (isDate(f, className)) { - return dateMatcher(f); - } else if (isFunction(f, className)) { - return functionMatcher(f); - } else if (isPlainObject(f, className)) { - return fuzzyMatcher(f); - } - } - // Default is standard isEqual - return defaultMatcher(f); - } - - function fuzzyMatcher(obj) { - var matchers = {}; - return function(el, i, arr) { - var matched = true; - if (!isObjectType(el)) { - return false; - } - forEachProperty(obj, function(val, key) { - matchers[key] = getOwn(matchers, key) || getMatcher(val); - if (matchers[key].call(arr, el[key], i, arr) === false) { - matched = false; - } - return matched; - }); - return matched; - }; - } - - function defaultMatcher(f) { - return function(el) { - return isEqual(el, f); - }; - } - - function regexMatcher(reg) { - reg = RegExp(reg); - return function(el) { - return reg.test(el); - }; - } - - function dateMatcher(d) { - var ms = d.getTime(); - return function(el) { - return !!(el && el.getTime) && el.getTime() === ms; - }; - } - - function functionMatcher(fn) { - return function(el, i, arr) { - // Return true up front if match by reference - return el === fn || fn.call(arr, el, i, arr); - }; - } - - // Object helpers - - function getKeys(obj) { - return Object.keys(obj); - } - - function deepHasProperty(obj, key, any) { - return handleDeepProperty(obj, key, any, true); - } - - function deepGetProperty(obj, key, any) { - return handleDeepProperty(obj, key, any, false); - } - - function deepSetProperty(obj, key, val) { - handleDeepProperty(obj, key, false, false, true, false, val); - return obj; - } - - function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { - var ns, bs, ps, cbi, set, isLast, isPush, isIndex, nextIsIndex, exists; - ns = obj; - if (key == null) return; - - if (isObjectType(key)) { - // Allow array and array-like accessors - bs = [key]; - } else { - key = String(key); - if (key.indexOf('..') !== -1) { - return handleArrayIndexRange(obj, key, any, val); - } - bs = key.split('['); - } - - set = isDefined(val); - - for (var i = 0, blen = bs.length; i < blen; i++) { - ps = bs[i]; - - if (isString(ps)) { - ps = periodSplit(ps); - } - - for (var j = 0, plen = ps.length; j < plen; j++) { - key = ps[j]; - - // Is this the last key? - isLast = i === blen - 1 && j === plen - 1; - - // Index of the closing ] - cbi = key.indexOf(']'); - - // Is the key an array index? - isIndex = cbi !== -1; - - // Is this array push syntax "[]"? - isPush = set && cbi === 0; - - // If the bracket split was successful and this is the last element - // in the dot split, then we know the next key will be an array index. - nextIsIndex = blen > 1 && j === plen - 1; - - if (isPush) { - // Set the index to the end of the array - key = ns.length; - } else if (isIndex) { - // Remove the closing ] - key = key.slice(0, -1); - } - - // If the array index is less than 0, then - // add its length to allow negative indexes. - if (isIndex && key < 0) { - key = +key + ns.length; - } - - // Bracket keys may look like users[5] or just [5], so the leading - // characters are optional. We can enter the namespace if this is the - // 2nd part, if there is only 1 part, or if there is an explicit key. - if (i || key || blen === 1) { - - // TODO: need to be sure this check handles ''.length when - // we refactor. - exists = any ? key in Object(ns) : hasOwn(ns, key); - - // Non-existent namespaces are only filled if they are intermediate - // (not at the end) or explicitly filling the last. - if (fill && (!isLast || fillLast) && !exists) { - // For our purposes, last only needs to be an array. - ns = ns[key] = nextIsIndex || (fillLast && isLast) ? [] : {}; - continue; - } - - if (has) { - if (isLast || !exists) { - return exists; - } - } else if (set && isLast) { - assertWritable(ns); - ns[key] = val; - } - - ns = exists ? ns[key] : undefined; - } - - } - } - return ns; - } - - // Get object property with support for 0..1 style range notation. - function handleArrayIndexRange(obj, key, any, val) { - var match, start, end, leading, trailing, arr, set; - match = key.match(PROPERTY_RANGE_REG); - if (!match) { - return; - } - - set = isDefined(val); - leading = match[1]; - - if (leading) { - arr = handleDeepProperty(obj, leading, any, false, set ? true : false, true); - } else { - arr = obj; - } - - assertArray(arr); - - trailing = match[4]; - start = match[2] ? +match[2] : 0; - end = match[3] ? +match[3] : arr.length; - - // A range of 0..1 is inclusive, so we need to add 1 to the end. If this - // pushes the index from -1 to 0, then set it to the full length of the - // array, otherwise it will return nothing. - end = end === -1 ? arr.length : end + 1; - - if (set) { - for (var i = start; i < end; i++) { - handleDeepProperty(arr, i + trailing, any, false, true, false, val); - } - } else { - arr = arr.slice(start, end); - - // If there are trailing properties, then they need to be mapped for each - // element in the array. - if (trailing) { - if (trailing.charAt(0) === HALF_WIDTH_PERIOD) { - // Need to chomp the period if one is trailing after the range. We - // can't do this at the regex level because it will be required if - // we're setting the value as it needs to be concatentated together - // with the array index to be set. - trailing = trailing.slice(1); - } - return map(arr, function(el) { - return handleDeepProperty(el, trailing); - }); - } - } - return arr; - } - - function getOwnKey(obj, key) { - if (hasOwn(obj, key)) { - return key; - } - } - - function hasProperty(obj, prop) { - return !isPrimitive(obj) && prop in obj; - } - - function isObjectType(obj, type) { - return !!obj && (type || typeof obj) === 'object'; - } - - function isPrimitive(obj, type) { - type = type || typeof obj; - return obj == null || type === 'string' || type === 'number' || type === 'boolean'; - } - - function isPlainObject(obj, className) { - return isObjectType(obj) && - isClass(obj, 'Object', className) && - hasValidPlainObjectPrototype(obj) && - hasOwnEnumeratedProperties(obj); - } - - function hasValidPlainObjectPrototype(obj) { - var hasToString = 'toString' in obj; - var hasConstructor = 'constructor' in obj; - // An object created with Object.create(null) has no methods in the - // prototype chain, so check if any are missing. The additional hasToString - // check is for false positives on some host objects in old IE which have - // toString but no constructor. If the object has an inherited constructor, - // then check if it is Object (the "isPrototypeOf" tapdance here is a more - // robust way of ensuring this if the global has been hijacked). Note that - // accessing the constructor directly (without "in" or "hasOwnProperty") - // will throw a permissions error in IE8 on cross-domain windows. - return (!hasConstructor && !hasToString) || - (hasConstructor && !hasOwn(obj, 'constructor') && - hasOwn(obj.constructor.prototype, 'isPrototypeOf')); - } - - function hasOwnEnumeratedProperties(obj) { - // Plain objects are generally defined as having enumerated properties - // all their own, however in early IE environments without defineProperty, - // there may also be enumerated methods in the prototype chain, so check - // for both of these cases. - var objectProto = Object.prototype; - for (var key in obj) { - var val = obj[key]; - if (!hasOwn(obj, key) && val !== objectProto[key]) { - return false; - } - } - return true; - } - - function simpleRepeat(n, fn) { - for (var i = 0; i < n; i++) { - fn(i); - } - } - - function simpleClone(obj) { - return simpleMerge({}, obj); - } - - // TODO: Use Object.assign here going forward. - function simpleMerge(target, source) { - forEachProperty(source, function(val, key) { - target[key] = val; - }); - return target; - } - - // Make primtives types like strings into objects. - function coercePrimitiveToObject(obj) { - if (isPrimitive(obj)) { - obj = Object(obj); - } - // istanbul ignore next - if (NO_KEYS_IN_STRING_OBJECTS && isString(obj)) { - forceStringCoercion(obj); - } - return obj; - } - - // Force strings to have their indexes set in - // environments that don't do this automatically. - // istanbul ignore next - function forceStringCoercion(obj) { - var i = 0, chr; - while (chr = obj.charAt(i)) { - obj[i++] = chr; - } - } - - // Equality helpers - - // Perf - function isEqual(a, b, stack) { - var aClass, bClass; - if (a === b) { - // Return quickly up front when matched by reference, - // but be careful about 0 !== -0. - return a !== 0 || 1 / a === 1 / b; - } - aClass = classToString(a); - bClass = classToString(b); - if (aClass !== bClass) { - return false; - } - - if (isSerializable(a, aClass) && isSerializable(b, bClass)) { - return objectIsEqual(a, b, aClass, stack); - } else if (isSet(a, aClass) && isSet(b, bClass)) { - return a.size === b.size && isEqual(setToArray(a), setToArray(b), stack); - } else if (isMap(a, aClass) && isMap(b, bClass)) { - return a.size === b.size && isEqual(mapToArray(a), mapToArray(b), stack); - } else if (isError(a, aClass) && isError(b, bClass)) { - return a.toString() === b.toString(); - } - - return false; - } - - // Perf - function objectIsEqual(a, b, aClass, stack) { - var aType = typeof a, bType = typeof b, propsEqual, count; - if (aType !== bType) { - return false; - } - if (isObjectType(a.valueOf())) { - if (a.length !== b.length) { - // perf: Quickly returning up front for arrays. - return false; - } - count = 0; - propsEqual = true; - iterateWithCyclicCheck(a, false, stack, function(key, val, cyc, stack) { - if (!cyc && (!(key in b) || !isEqual(val, b[key], stack))) { - propsEqual = false; - } - count++; - return propsEqual; - }); - if (!propsEqual || count !== getKeys(b).length) { - return false; - } - } - // Stringifying the value handles NaN, wrapped primitives, dates, and errors in one go. - return a.valueOf().toString() === b.valueOf().toString(); - } - - // Serializes an object in a way that will provide a token unique - // to the type, class, and value of an object. Host objects, class - // instances etc, are not serializable, and are held in an array - // of references that will return the index as a unique identifier - // for the object. This array is passed from outside so that the - // calling function can decide when to dispose of this array. - function serializeInternal(obj, refs, stack) { - var type = typeof obj, sign = '', className, value, ref; - - // Return up front on - if (1 / obj === -Infinity) { - sign = '-'; - } - - // Return quickly for primitives to save cycles - if (isPrimitive(obj, type) && !isRealNaN(obj)) { - return type + sign + obj; - } - - className = classToString(obj); - - if (!isSerializable(obj, className)) { - ref = indexOf(refs, obj); - if (ref === -1) { - ref = refs.length; - refs.push(obj); - } - return ref; - } else if (isObjectType(obj)) { - value = serializeDeep(obj, refs, stack) + obj.toString(); - } else if (obj.valueOf) { - value = obj.valueOf(); - } - return type + className + sign + value; - } - - function serializeDeep(obj, refs, stack) { - var result = ''; - iterateWithCyclicCheck(obj, true, stack, function(key, val, cyc, stack) { - result += cyc ? 'CYC' : key + serializeInternal(val, refs, stack); - }); - return result; - } - - function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { - - function next(val, key) { - var cyc = false; - - // Allowing a step into the structure before triggering this check to save - // cycles on standard JSON structures and also to try as hard as possible to - // catch basic properties that may have been modified. - if (stack.length > 1) { - var i = stack.length; - while (i--) { - if (stack[i] === val) { - cyc = true; - } - } - } - - stack.push(val); - fn(key, val, cyc, stack); - stack.pop(); - } - - function iterateWithSortedKeys() { - // Sorted keys is required for serialization, where object order - // does not matter but stringified order does. - var arr = getKeys(obj).sort(), key; - for (var i = 0; i < arr.length; i++) { - key = arr[i]; - next(obj[key], arr[i]); - } - } - - // This method for checking for cyclic structures was egregiously stolen from - // the ingenious method by @kitcambridge from the Underscore script: - // https://github.com/documentcloud/underscore/issues/240 - if (!stack) { - stack = []; - } - - if (sortedKeys) { - iterateWithSortedKeys(); - } else { - forEachProperty(obj, next); - } - } - - - // Array helpers - - function isArrayIndex(n) { - return n >>> 0 == n && n != 0xFFFFFFFF; - } - - function iterateOverSparseArray(arr, fn, fromIndex, loop) { - var indexes = getSparseArrayIndexes(arr, fromIndex, loop), index; - for (var i = 0, len = indexes.length; i < len; i++) { - index = indexes[i]; - fn.call(arr, arr[index], index, arr); - } - return arr; - } - - // It's unclear whether or not sparse arrays qualify as "simple enumerables". - // If they are not, however, the wrapping function will be deoptimized, so - // isolate here (also to share between es5 and array modules). - function getSparseArrayIndexes(arr, fromIndex, loop, fromRight) { - var indexes = [], i; - for (i in arr) { - // istanbul ignore next - if (isArrayIndex(i) && (loop || (fromRight ? i <= fromIndex : i >= fromIndex))) { - indexes.push(+i); - } - } - indexes.sort(function(a, b) { - var aLoop = a > fromIndex; - var bLoop = b > fromIndex; - // This block cannot be reached unless ES5 methods are being shimmed. - // istanbul ignore if - if (aLoop !== bLoop) { - return aLoop ? -1 : 1; - } - return a - b; - }); - return indexes; - } - - function getEntriesForIndexes(obj, find, loop, isString) { - var result, length = obj.length; - if (!isArray(find)) { - return entryAtIndex(obj, find, length, loop, isString); - } - result = new Array(find.length); - forEach(find, function(index, i) { - result[i] = entryAtIndex(obj, index, length, loop, isString); - }); - return result; - } - - function getNormalizedIndex(index, length, loop) { - if (index && loop) { - index = index % length; - } - if (index < 0) index = length + index; - return index; - } - - function entryAtIndex(obj, index, length, loop, isString) { - index = getNormalizedIndex(index, length, loop); - return isString ? obj.charAt(index) : obj[index]; - } - - function mapWithShortcuts(el, f, context, mapArgs) { - if (!f) { - return el; - } else if (f.apply) { - return f.apply(context, mapArgs); - } else if (isArray(f)) { - return map(f, function(m) { - return mapWithShortcuts(el, m, context, mapArgs); - }); - } else if (isFunction(el[f])) { - return el[f].call(el); - } else { - return deepGetProperty(el, f, true); - } - } - - function spaceSplit(str) { - return str.split(' '); - } - - function commaSplit(str) { - return str.split(HALF_WIDTH_COMMA); - } - - function periodSplit(str) { - return str.split(HALF_WIDTH_PERIOD); - } - - function forEach(arr, fn) { - for (var i = 0, len = arr.length; i < len; i++) { - if (!(i in arr)) { - return iterateOverSparseArray(arr, fn, i); - } - fn(arr[i], i); - } - } - - function filter(arr, fn) { - var result = []; - for (var i = 0, len = arr.length; i < len; i++) { - var el = arr[i]; - if (i in arr && fn(el, i)) { - result.push(el); - } - } - return result; - } - - function map(arr, fn) { - // perf: Not using fixed array len here as it may be sparse. - var result = []; - for (var i = 0, len = arr.length; i < len; i++) { - if (i in arr) { - result.push(fn(arr[i], i)); - } - } - return result; - } - - function indexOf(arr, el) { - for (var i = 0, len = arr.length; i < len; i++) { - if (i in arr && arr[i] === el) return i; - } - return -1; - } - - // Number helpers - - // istanbul ignore next - var trunc = Math.trunc || function(n) { - if (n === 0 || !isFinite(n)) return n; - return n < 0 ? ceil(n) : floor(n); - }; - - function isRealNaN(obj) { - // This is only true of NaN - return obj != null && obj !== obj; - } - - function withPrecision(val, precision, fn) { - var multiplier = pow(10, abs(precision || 0)); - fn = fn || round; - if (precision < 0) multiplier = 1 / multiplier; - return fn(val * multiplier) / multiplier; - } - - function padNumber(num, place, sign, base, replacement) { - var str = abs(num).toString(base || 10); - str = repeatString(replacement || '0', place - str.replace(/\.\d+/, '').length) + str; - if (sign || num < 0) { - str = (num < 0 ? '-' : '+') + str; - } - return str; - } - - function getOrdinalSuffix(num) { - if (num >= 11 && num <= 13) { - return 'th'; - } else { - switch(num % 10) { - case 1: return 'st'; - case 2: return 'nd'; - case 3: return 'rd'; - default: return 'th'; - } - } - } - - // Fullwidth number helpers - var fullWidthNumberReg, fullWidthNumberMap, fullWidthNumbers; - - function buildFullWidthNumber() { - var fwp = FULL_WIDTH_PERIOD, hwp = HALF_WIDTH_PERIOD, hwc = HALF_WIDTH_COMMA, fwn = ''; - fullWidthNumberMap = {}; - for (var i = 0, digit; i <= 9; i++) { - digit = chr(i + FULL_WIDTH_ZERO); - fwn += digit; - fullWidthNumberMap[digit] = chr(i + HALF_WIDTH_ZERO); - } - fullWidthNumberMap[hwc] = ''; - fullWidthNumberMap[fwp] = hwp; - // Mapping this to itself to capture it easily - // in stringToNumber to detect decimals later. - fullWidthNumberMap[hwp] = hwp; - fullWidthNumberReg = allCharsReg(fwn + fwp + hwc + hwp); - fullWidthNumbers = fwn; - } - - // Takes into account full-width characters, commas, and decimals. - function stringToNumber(str, base) { - var sanitized, isDecimal; - sanitized = str.replace(fullWidthNumberReg, function(chr) { - var replacement = getOwn(fullWidthNumberMap, chr); - if (replacement === HALF_WIDTH_PERIOD) { - isDecimal = true; - } - return replacement; - }); - return isDecimal ? parseFloat(sanitized) : parseInt(sanitized, base || 10); - } - - // Math aliases - var abs = Math.abs, - pow = Math.pow, - min = Math.min, - max = Math.max, - ceil = Math.ceil, - floor = Math.floor, - round = Math.round; - - - // String helpers - - var chr = String.fromCharCode; - - function trim(str) { - return str.trim(); - } - - function repeatString(str, num) { - var result = ''; - str = str.toString(); - while (num > 0) { - if (num & 1) { - result += str; - } - if (num >>= 1) { - str += str; - } - } - return result; - } - - function simpleCapitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - function createFormatMatcher(bracketMatcher, percentMatcher, precheck) { - - var reg = STRING_FORMAT_REG; - var compileMemoized = memoizeFunction(compile); - - function getToken(format, match) { - var get, token, literal, fn; - var bKey = match[2]; - var pLit = match[3]; - var pKey = match[5]; - if (match[4] && percentMatcher) { - token = pKey; - get = percentMatcher; - } else if (bKey) { - token = bKey; - get = bracketMatcher; - } else if (pLit && percentMatcher) { - literal = pLit; - } else { - literal = match[1] || match[0]; - } - if (get) { - assertPassesPrecheck(precheck, bKey, pKey); - fn = function(obj, opt) { - return get(obj, token, opt); - }; - } - format.push(fn || getLiteral(literal)); - } - - function getSubstring(format, str, start, end) { - if (end > start) { - var sub = str.slice(start, end); - assertNoUnmatched(sub, OPEN_BRACE); - assertNoUnmatched(sub, CLOSE_BRACE); - format.push(function() { - return sub; - }); - } - } - - function getLiteral(str) { - return function() { - return str; - }; - } - - function assertPassesPrecheck(precheck, bt, pt) { - if (precheck && !precheck(bt, pt)) { - throw new TypeError('Invalid token '+ (bt || pt) +' in format string'); - } - } - - function assertNoUnmatched(str, chr) { - if (str.indexOf(chr) !== -1) { - throw new TypeError('Unmatched '+ chr +' in format string'); - } - } - - function compile(str) { - var format = [], lastIndex = 0, match; - reg.lastIndex = 0; - while(match = reg.exec(str)) { - getSubstring(format, str, lastIndex, match.index); - getToken(format, match); - lastIndex = reg.lastIndex; - } - getSubstring(format, str, lastIndex, str.length); - return format; - } - - return function(str, obj, opt) { - var format = compileMemoized(str), result = ''; - for (var i = 0; i < format.length; i++) { - result += format[i](obj, opt); - } - return result; - }; - } - - // Inflection helper - - var Inflections = {}; - - function getAcronym(str) { - // istanbul ignore next - return Inflections.acronyms && Inflections.acronyms.find(str); - } - - function getHumanWord(str) { - // istanbul ignore next - return Inflections.human && Inflections.human.find(str); - } - - function runHumanRules(str) { - // istanbul ignore next - return Inflections.human && Inflections.human.runRules(str) || str; - } - - // RegExp helpers - - function allCharsReg(src) { - return RegExp('[' + src + ']', 'g'); - } - - function getRegExpFlags(reg, add) { - var flags = ''; - add = add || ''; - function checkFlag(prop, flag) { - if (prop || add.indexOf(flag) > -1) { - flags += flag; - } - } - checkFlag(reg.global, 'g'); - checkFlag(reg.ignoreCase, 'i'); - checkFlag(reg.multiline, 'm'); - checkFlag(reg.sticky, 'y'); - return flags; - } - - function escapeRegExp(str) { - if (!isString(str)) str = String(str); - return str.replace(/([\\/'*+?|()[\]{}.^$-])/g,'\\$1'); - } - - // Date helpers - - var _utc = privatePropertyAccessor('utc'); - - function callDateGet(d, method) { - return d['get' + (_utc(d) ? 'UTC' : '') + method](); - } - - function callDateSet(d, method, value, safe) { - // "Safe" denotes not setting the date if the value is the same as what is - // currently set. In theory this should be a noop, however it will cause - // timezone shifts when in the middle of a DST fallback. This is unavoidable - // as the notation itself is ambiguous (i.e. there are two "1:00ams" on - // November 1st, 2015 in northern hemisphere timezones that follow DST), - // however when advancing or rewinding dates this can throw off calculations - // so avoiding this unintentional shifting on an opt-in basis. - if (safe && value === callDateGet(d, method, value)) { - return; - } - d['set' + (_utc(d) ? 'UTC' : '') + method](value); - } - - // Memoization helpers - - var INTERNAL_MEMOIZE_LIMIT = 1000; - - // Note that attemps to consolidate this with Function#memoize - // ended up clunky as that is also serializing arguments. Separating - // these implementations turned out to be simpler. - function memoizeFunction(fn) { - var memo = {}, counter = 0; - - return function(key) { - if (hasOwn(memo, key)) { - return memo[key]; - } - // istanbul ignore if - if (counter === INTERNAL_MEMOIZE_LIMIT) { - memo = {}; - counter = 0; - } - counter++; - return memo[key] = fn(key); - }; - } - - // ES6 helpers - - function setToArray(set) { - var arr = new Array(set.size), i = 0; - set.forEach(function(val) { - arr[i++] = val; - }); - return arr; - } - - function mapToArray(map) { - var arr = new Array(map.size), i = 0; - map.forEach(function(val, key) { - arr[i++] = [key, val]; - }); - return arr; - } - - buildClassChecks(); - buildFullWidthNumber(); - - /*** - * @module ES6 - * @description Polyfills that provide basic ES6 compatibility. This module - * provides the base for Sugar functionality, but is not a full - * polyfill suite. - * - ***/ - - - /*** @namespace String ***/ - - function getCoercedStringSubject(obj) { - if (obj == null) { - throw new TypeError('String required.'); - } - return String(obj); - } - - function getCoercedSearchString(obj) { - if (isRegExp(obj)) { - throw new TypeError(); - } - return String(obj); - } - - defineInstancePolyfill(sugarString, { - - /*** - * @method includes(search, [pos] = 0) - * @returns Boolean - * @polyfill ES6 - * @short Returns true if `search` is contained within the string. - * @extra Search begins at [pos], which defaults to the beginning of the - * string. Sugar enhances this method to allow matching a regex. - * - * @example - * - * 'jumpy'.includes('py') -> true - * 'broken'.includes('ken', 3) -> true - * 'broken'.includes('bro', 3) -> false - * - ***/ - 'includes': function(searchString) { - // Force compiler to respect argument length. - var argLen = arguments.length, pos = arguments[1]; - var str = getCoercedStringSubject(this); - searchString = getCoercedSearchString(searchString); - return str.indexOf(searchString, pos) !== -1; - }, - - /*** - * @method startsWith(search, [pos] = 0) - * @returns Boolean - * @polyfill ES6 - * @short Returns true if the string starts with substring `search`. - * @extra Search begins at [pos], which defaults to the entire string length. - * - * @example - * - * 'hello'.startsWith('hell') -> true - * 'hello'.startsWith('HELL') -> false - * 'hello'.startsWith('ell', 1) -> true - * - ***/ - 'startsWith': function(searchString) { - // Force compiler to respect argument length. - var argLen = arguments.length, position = arguments[1]; - var str, start, pos, len, searchLength; - str = getCoercedStringSubject(this); - searchString = getCoercedSearchString(searchString); - pos = +position || 0; - len = str.length; - start = min(max(pos, 0), len); - searchLength = searchString.length; - if (searchLength + start > len) { - return false; - } - if (str.substr(start, searchLength) === searchString) { - return true; - } - return false; - }, - - /*** - * @method endsWith(search, [pos] = length) - * @returns Boolean - * @polyfill ES6 - * @short Returns true if the string ends with substring `search`. - * @extra Search ends at [pos], which defaults to the entire string length. - * - * @example - * - * 'jumpy'.endsWith('py') -> true - * 'jumpy'.endsWith('MPY') -> false - * 'jumpy'.endsWith('mp', 4) -> false - * - ***/ - 'endsWith': function(searchString) { - // Force compiler to respect argument length. - var argLen = arguments.length, endPosition = arguments[1]; - var str, start, end, pos, len, searchLength; - str = getCoercedStringSubject(this); - searchString = getCoercedSearchString(searchString); - len = str.length; - pos = len; - if (isDefined(endPosition)) { - pos = +endPosition || 0; - } - end = min(max(pos, 0), len); - searchLength = searchString.length; - start = end - searchLength; - if (start < 0) { - return false; - } - if (str.substr(start, searchLength) === searchString) { - return true; - } - return false; - }, - - /*** - * @method repeat([num] = 0) - * @returns String - * @polyfill ES6 - * @short Returns the string repeated [num] times. - * - * @example - * - * 'jumpy'.repeat(2) -> 'jumpyjumpy' - * 'a'.repeat(5) -> 'aaaaa' - * 'a'.repeat(0) -> '' - * - ***/ - 'repeat': function(num) { - num = coercePositiveInteger(num); - return repeatString(this, num); - } - - }); - - - /*** @namespace Number ***/ - - // istanbul ignore next - defineStaticPolyfill(sugarNumber, { - - /*** - * @method isNaN(value) - * @returns Boolean - * @polyfill ES6 - * @static - * @short Returns true only if the number is `NaN`. - * @extra This is differs from the global `isNaN`, which returns true for - * anything that is not a number. - * - * @example - * - * Number.isNaN(NaN) -> true - * Number.isNaN('n') -> false - * - ***/ - 'isNaN': function(obj) { - return isRealNaN(obj); - } - - }); - - - /*** @namespace Array ***/ - - function getCoercedObject(obj) { - if (obj == null) { - throw new TypeError('Object required.'); - } - return coercePrimitiveToObject(obj); - } - - defineStaticPolyfill(sugarArray, { - - /*** - * @method from(a, [mapFn], [context]) - * @returns Mixed - * @polyfill ES6 - * @static - * @short Creates an array from an array-like object. - * @extra If [mapFn] is passed, it will be map each element of the array. - * [context] is the `this` object if passed. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * Array.from({0:'a',1:'b',length:2}); -> ['a','b'] - * - ***/ - 'from': function(a) { - // Force compiler to respect argument length. - var argLen = arguments.length, mapFn = arguments[1], context = arguments[2]; - var len, arr; - if (isDefined(mapFn)) { - assertCallable(mapFn); - } - a = getCoercedObject(a); - len = trunc(max(0, a.length || 0)); - if (!isArrayIndex(len)) { - throw new RangeError('Invalid array length'); - } - if (isFunction(this)) { - arr = new this(len); - arr.length = len; - } else { - arr = new Array(len); - } - for (var i = 0; i < len; i++) { - setProperty(arr, i, isDefined(mapFn) ? mapFn.call(context, a[i], i) : a[i], true); - } - return arr; - } - - }); - - defineInstancePolyfill(sugarArray, { - - 'find': function(f) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - assertCallable(f); - for (var i = 0, len = this.length; i < len; i++) { - if (f.call(context, this[i], i, this)) { - return this[i]; - } - } - }, - - 'findIndex': function(f) { - // Force compiler to respect argument length. - var argLen = arguments.length, context = arguments[1]; - assertCallable(f); - for (var i = 0, len = this.length; i < len; i++) { - if (f.call(context, this[i], i, this)) { - return i; - } - } - return -1; - } - - }); - - /*** - * @module ES7 - * @description Polyfills that provide basic ES7 compatibility. This module - * provides the base for Sugar functionality, but is not a full - * polyfill suite. - * - ***/ - - - /*** @namespace Array ***/ - - function sameValueZero(a, b) { - if (isRealNaN(a)) { - return isRealNaN(b); - } - return a === b ? a !== 0 || 1 / a === 1 / b : false; - } - - defineInstancePolyfill(sugarArray, { - - /*** - * @method includes(search, [fromIndex] = 0) - * @returns Boolean - * @polyfill ES7 - * @short Returns true if `search` is contained within the array. - * @extra Search begins at [fromIndex], which defaults to the beginning of the - * array. - * - * @example - * - * [1,2,3].includes(2) -> true - * [1,2,3].includes(4) -> false - * [1,2,3].includes(2, 3) -> false - * - ***/ - 'includes': function(search) { - // Force compiler to respect argument length. - var argLen = arguments.length, fromIndex = arguments[1]; - var arr = this, len; - if (isString(arr)) { - return arr.includes(search, fromIndex); - } - fromIndex = fromIndex ? fromIndex.valueOf() : 0; - len = arr.length; - if (fromIndex < 0) { - fromIndex = max(0, fromIndex + len); - } - for (var i = fromIndex; i < len; i++) { - if (sameValueZero(search, arr[i])) { - return true; - } - } - return false; - } - - }); - - /*** - * @module Date - * @description Date parsing and formatting, relative formats, number shortcuts, - * and locale support with default English locales. - * - ***/ - - var DATE_OPTIONS = { - 'newDateInternal': defaultNewDate - }; - - var LOCALE_ARRAY_FIELDS = [ - 'months', 'weekdays', 'units', 'numerals', 'placeholders', - 'articles', 'tokens', 'timeMarkers', 'ampm', 'timeSuffixes', - 'parse', 'timeParse', 'timeFrontParse', 'modifiers' - ]; - - // Regex for stripping Timezone Abbreviations - var TIMEZONE_ABBREVIATION_REG = /\(([-+]\d{2,4}|\w{3,5})\)$/; - - // Regex for years with 2 digits or less - var ABBREVIATED_YEAR_REG = /^'?(\d{1,2})$/; - - // One minute in milliseconds - var MINUTES = 60 * 1000; - - // Date unit indexes - var HOURS_INDEX = 3, - DAY_INDEX = 4, - WEEK_INDEX = 5, - MONTH_INDEX = 6, - YEAR_INDEX = 7; - - // ISO Defaults - var ISO_FIRST_DAY_OF_WEEK = 1, - ISO_FIRST_DAY_OF_WEEK_YEAR = 4; - - var CoreParsingTokens = { - 'yyyy': { - param: 'year', - src: '[-−+]?\\d{4,6}' - }, - 'yy': { - param: 'year', - src: '\\d{2}' - }, - 'y': { - param: 'year', - src: '\\d' - }, - 'ayy': { - param: 'year', - src: '\'\\d{2}' - }, - 'MM': { - param: 'month', - src: '(?:1[012]|0?[1-9])' - }, - 'dd': { - param: 'date', - src: '(?:3[01]|[12][0-9]|0?[1-9])' - }, - 'hh': { - param: 'hour', - src: '(?:2[0-4]|[01]?[0-9])' - }, - 'mm': { - param: 'minute', - src: '[0-5]\\d' - }, - 'ss': { - param: 'second', - src: '[0-5]\\d(?:[,.]\\d+)?' - }, - 'tzHour': { - src: '[-−+](?:2[0-4]|[01]?[0-9])' - }, - 'tzMinute': { - src: '[0-5]\\d' - }, - 'iyyyy': { - param: 'year', - src: '(?:[-−+]?\\d{4}|[-−+]\\d{5,6})' - }, - 'ihh': { - param: 'hour', - src: '(?:2[0-4]|[01][0-9])(?:[,.]\\d+)?' - }, - 'imm': { - param: 'minute', - src: '[0-5]\\d(?:[,.]\\d+)?' - }, - 'GMT': { - param: 'utc', - src: 'GMT' - }, - 'Z': { - param: 'utc', - src: 'Z' - }, - 'timestamp': { - src: '\\d+' - } - }; - - var LocalizedParsingTokens = { - 'year': { - base: 'yyyy|ayy', - requiresSuffix: true - }, - 'month': { - base: 'MM', - requiresSuffix: true - }, - 'date': { - base: 'dd', - requiresSuffix: true - }, - 'hour': { - base: 'hh', - requiresSuffixOr: ':' - }, - 'minute': { - base: 'mm' - }, - 'second': { - base: 'ss' - }, - 'num': { - src: '\\d+', - requiresNumerals: true - } - }; - - var CoreParsingFormats = [ - { - // 12-1978 - // 08-1978 (MDY) - src: '{MM}[-.\\/]{yyyy}' - }, - { - // 12/08/1978 - // 08/12/1978 (MDY) - time: true, - src: '{dd}[-\\/]{MM}(?:[-\\/]{yyyy|yy|y})?', - mdy: '{MM}[-\\/]{dd}(?:[-\\/]{yyyy|yy|y})?' - }, - { - // 12.08.1978 - // 08.12.1978 (MDY) - time: true, - src: '{dd}\\.{MM}(?:\\.{yyyy|yy|y})?', - mdy: '{MM}\\.{dd}(?:\\.{yyyy|yy|y})?', - localeCheck: function(loc) { - // Do not allow this format if the locale - // uses a period as a time separator. - return loc.timeSeparator !== '.'; - } - }, - { - // 1975-08-25 - time: true, - src: '{yyyy}[-.\\/]{MM}(?:[-.\\/]{dd})?' - }, - { - // .NET JSON - src: '\\\\/Date\\({timestamp}(?:[-+]\\d{4,4})?\\)\\\\/' - }, - { - // ISO-8601 - src: '{iyyyy}(?:-?{MM}(?:-?{dd}(?:T{ihh}(?::?{imm}(?::?{ss})?)?)?)?)?{tzOffset?}' - } - ]; - - var CoreOutputFormats = { - 'ISO8601': '{yyyy}-{MM}-{dd}T{HH}:{mm}:{ss}.{SSS}{Z}', - 'RFC1123': '{Dow}, {dd} {Mon} {yyyy} {HH}:{mm}:{ss} {ZZ}', - 'RFC1036': '{Weekday}, {dd}-{Mon}-{yy} {HH}:{mm}:{ss} {ZZ}' - }; - - var FormatTokensBase = [ - { - ldml: 'Dow', - strf: 'a', - lowerToken: 'dow', - get: function(d, localeCode) { - return localeManager.get(localeCode).getWeekdayName(getWeekday(d), 2); - } - }, - { - ldml: 'Weekday', - strf: 'A', - lowerToken: 'weekday', - allowAlternates: true, - get: function(d, localeCode, alternate) { - return localeManager.get(localeCode).getWeekdayName(getWeekday(d), alternate); - } - }, - { - ldml: 'Mon', - strf: 'b h', - lowerToken: 'mon', - get: function(d, localeCode) { - return localeManager.get(localeCode).getMonthName(getMonth(d), 2); - } - }, - { - ldml: 'Month', - strf: 'B', - lowerToken: 'month', - allowAlternates: true, - get: function(d, localeCode, alternate) { - return localeManager.get(localeCode).getMonthName(getMonth(d), alternate); - } - }, - { - strf: 'C', - get: function(d) { - return getYear(d).toString().slice(0, 2); - } - }, - { - ldml: 'd date day', - strf: 'd', - strfPadding: 2, - ldmlPaddedToken: 'dd', - ordinalToken: 'do', - get: function(d) { - return getDate(d); - } - }, - { - strf: 'e', - get: function(d) { - return padNumber(getDate(d), 2, false, 10, ' '); - } - }, - { - ldml: 'H 24hr', - strf: 'H', - strfPadding: 2, - ldmlPaddedToken: 'HH', - get: function(d) { - return getHours(d); - } - }, - { - ldml: 'h hours 12hr', - strf: 'I', - strfPadding: 2, - ldmlPaddedToken: 'hh', - get: function(d) { - return getHours(d) % 12 || 12; - } - }, - { - ldml: 'D', - strf: 'j', - strfPadding: 3, - ldmlPaddedToken: 'DDD', - get: function(d) { - var s = setUnitAndLowerToEdge(cloneDate(d), MONTH_INDEX); - return getDaysSince(d, s) + 1; - } - }, - { - ldml: 'M', - strf: 'm', - strfPadding: 2, - ordinalToken: 'Mo', - ldmlPaddedToken: 'MM', - get: function(d) { - return getMonth(d) + 1; - } - }, - { - ldml: 'm minutes', - strf: 'M', - strfPadding: 2, - ldmlPaddedToken: 'mm', - get: function(d) { - return callDateGet(d, 'Minutes'); - } - }, - { - ldml: 'Q', - get: function(d) { - return ceil((getMonth(d) + 1) / 3); - } - }, - { - ldml: 'TT', - strf: 'p', - get: function(d, localeCode) { - return getMeridiemToken(d, localeCode); - } - }, - { - ldml: 'tt', - strf: 'P', - get: function(d, localeCode) { - return getMeridiemToken(d, localeCode).toLowerCase(); - } - }, - { - ldml: 'T', - lowerToken: 't', - get: function(d, localeCode) { - return getMeridiemToken(d, localeCode).charAt(0); - } - }, - { - ldml: 's seconds', - strf: 'S', - strfPadding: 2, - ldmlPaddedToken: 'ss', - get: function(d) { - return callDateGet(d, 'Seconds'); - } - }, - { - ldml: 'S ms', - strfPadding: 3, - ldmlPaddedToken: 'SSS', - get: function(d) { - return callDateGet(d, 'Milliseconds'); - } - }, - { - ldml: 'e', - strf: 'u', - ordinalToken: 'eo', - get: function(d) { - return getWeekday(d) || 7; - } - }, - { - strf: 'U', - strfPadding: 2, - get: function(d) { - // Sunday first, 0-53 - return getWeekNumber(d, false, 0); - } - }, - { - ldml: 'W', - strf: 'V', - strfPadding: 2, - ordinalToken: 'Wo', - ldmlPaddedToken: 'WW', - get: function(d) { - // Monday first, 1-53 (ISO8601) - return getWeekNumber(d, true); - } - }, - { - strf: 'w', - get: function(d) { - return getWeekday(d); - } - }, - { - ldml: 'w', - ordinalToken: 'wo', - ldmlPaddedToken: 'ww', - get: function(d, localeCode) { - // Locale dependent, 1-53 - var loc = localeManager.get(localeCode), - dow = loc.getFirstDayOfWeek(localeCode), - doy = loc.getFirstDayOfWeekYear(localeCode); - return getWeekNumber(d, true, dow, doy); - } - }, - { - strf: 'W', - strfPadding: 2, - get: function(d) { - // Monday first, 0-53 - return getWeekNumber(d, false); - } - }, - { - ldmlPaddedToken: 'gggg', - ldmlTwoDigitToken: 'gg', - get: function(d, localeCode) { - return getWeekYear(d, localeCode); - } - }, - { - strf: 'G', - strfPadding: 4, - strfTwoDigitToken: 'g', - ldmlPaddedToken: 'GGGG', - ldmlTwoDigitToken: 'GG', - get: function(d, localeCode) { - return getWeekYear(d, localeCode, true); - } - }, - { - ldml: 'year', - ldmlPaddedToken: 'yyyy', - ldmlTwoDigitToken: 'yy', - strf: 'Y', - strfPadding: 4, - strfTwoDigitToken: 'y', - get: function(d) { - return getYear(d); - } - }, - { - ldml: 'ZZ', - strf: 'z', - get: function(d) { - return getUTCOffset(d); - } - }, - { - ldml: 'X', - get: function(d) { - return trunc(d.getTime() / 1000); - } - }, - { - ldml: 'x', - get: function(d) { - return d.getTime(); - } - }, - { - ldml: 'Z', - get: function(d) { - return getUTCOffset(d, true); - } - }, - { - ldml: 'z', - strf: 'Z', - get: function(d) { - // Note that this is not accurate in all browsing environments! - // https://github.com/moment/moment/issues/162 - // It will continue to be supported for Node and usage with the - // understanding that it may be blank. - var match = d.toString().match(TIMEZONE_ABBREVIATION_REG); - // istanbul ignore next - return match ? match[1] : ''; - } - }, - { - strf: 'D', - alias: '%m/%d/%y' - }, - { - strf: 'F', - alias: '%Y-%m-%d' - }, - { - strf: 'r', - alias: '%I:%M:%S %p' - }, - { - strf: 'R', - alias: '%H:%M' - }, - { - strf: 'T', - alias: '%H:%M:%S' - }, - { - strf: 'x', - alias: '{short}' - }, - { - strf: 'X', - alias: '{time}' - }, - { - strf: 'c', - alias: '{stamp}' - } - ]; - - var DateUnits = [ - { - name: 'millisecond', - method: 'Milliseconds', - multiplier: 1, - start: 0, - end: 999 - }, - { - name: 'second', - method: 'Seconds', - multiplier: 1000, - start: 0, - end: 59 - }, - { - name: 'minute', - method: 'Minutes', - multiplier: 60 * 1000, - start: 0, - end: 59 - }, - { - name: 'hour', - method: 'Hours', - multiplier: 60 * 60 * 1000, - start: 0, - end: 23 - }, - { - name: 'day', - alias: 'date', - method: 'Date', - ambiguous: true, - multiplier: 24 * 60 * 60 * 1000, - start: 1, - end: function(d) { - return getDaysInMonth(d); - } - }, - { - name: 'week', - method: 'ISOWeek', - ambiguous: true, - multiplier: 7 * 24 * 60 * 60 * 1000 - }, - { - name: 'month', - method: 'Month', - ambiguous: true, - multiplier: 30.4375 * 24 * 60 * 60 * 1000, - start: 0, - end: 11 - }, - { - name: 'year', - method: 'FullYear', - ambiguous: true, - multiplier: 365.25 * 24 * 60 * 60 * 1000, - start: 0 - } - ]; - - /*** - * @method getOption(name) - * @returns Mixed - * @accessor - * @short Gets an option used internally by Date. - * @example - * - * Sugar.Date.getOption('newDateInternal'); - * - * @param {string} name - * - *** - * @method setOption(name, value) - * @accessor - * @short Sets an option used internally by Date. - * @extra If `value` is `null`, the default value will be restored. - * @options - * - * newDateInternal Sugar's internal date constructor. Date methods often - * construct a `new Date()` internally as a reference point - * (`isToday`, relative formats like `tomorrow`, etc). This - * can be overridden if you need it to be something else. - * Most commonly, this allows you to return a shifted date - * to simulate a specific timezone, as dates in Javascript - * are always local. - * - * @example - * - * Sugar.Date.setOption('newDateInternal', function() { - * var d = new Date(), offset; - * offset = (d.getTimezoneOffset() - 600) * 60 * 1000; // Hawaii time! - * d.setTime(d.getTime() + offset); - * return d; - * }); - * - * @signature setOption(options) - * @param {DateOptions} options - * @param {string} name - * @param {any} value - * @option {Function} newDateInternal - * - ***/ - var _dateOptions = defineOptionsAccessor(sugarDate, DATE_OPTIONS); - - function setDateChainableConstructor() { - setChainableConstructor(sugarDate, createDate); - } - - // General helpers - - function getNewDate() { - return _dateOptions('newDateInternal')(); - } - - function defaultNewDate() { - return new Date; - } - - function cloneDate(d) { - // Rhino environments have a bug where new Date(d) truncates - // milliseconds so need to call getTime() here. - var clone = new Date(d.getTime()); - _utc(clone, !!_utc(d)); - return clone; - } - - function dateIsValid(d) { - return !isNaN(d.getTime()); - } - - function assertDateIsValid(d) { - if (!dateIsValid(d)) { - throw new TypeError('Date is not valid'); - } - } - - function getHours(d) { - return callDateGet(d, 'Hours'); - } - - function getWeekday(d) { - return callDateGet(d, 'Day'); - } - - function getDate(d) { - return callDateGet(d, 'Date'); - } - - function getMonth(d) { - return callDateGet(d, 'Month'); - } - - function getYear(d) { - return callDateGet(d, 'FullYear'); - } - - function setDate(d, val) { - callDateSet(d, 'Date', val); - } - - function setMonth(d, val) { - callDateSet(d, 'Month', val); - } - - function setYear(d, val) { - callDateSet(d, 'FullYear', val); - } - - function getDaysInMonth(d) { - return 32 - callDateGet(new Date(getYear(d), getMonth(d), 32), 'Date'); - } - - function setWeekday(d, dow, dir) { - if (!isNumber(dow)) return; - var currentWeekday = getWeekday(d); - if (dir) { - // Allow a "direction" parameter to determine whether a weekday can - // be set beyond the current weekday in either direction. - var ndir = dir > 0 ? 1 : -1; - var offset = dow % 7 - currentWeekday; - if (offset && offset / abs(offset) !== ndir) { - dow += 7 * ndir; - } - } - setDate(d, getDate(d) + dow - currentWeekday); - return d.getTime(); - } - - // Normal callDateSet method with ability - // to handle ISOWeek setting as well. - function callDateSetWithWeek(d, method, value, safe) { - if (method === 'ISOWeek') { - setISOWeekNumber(d, value); - } else { - callDateSet(d, method, value, safe); - } - } - - // UTC helpers - - function isUTC(d) { - return !!_utc(d) || tzOffset(d) === 0; - } - - function getUTCOffset(d, iso) { - var offset = _utc(d) ? 0 : tzOffset(d), hours, mins, colon; - colon = iso === true ? ':' : ''; - if (!offset && iso) return 'Z'; - hours = padNumber(trunc(-offset / 60), 2, true); - mins = padNumber(abs(offset % 60), 2); - return hours + colon + mins; - } - - function tzOffset(d) { - return d.getTimezoneOffset(); - } - - // Argument helpers - - function collectUpdateDateArguments(args, allowDuration) { - var arg1 = args[0], arg2 = args[1], params, reset; - if (allowDuration && isString(arg1)) { - params = getDateParamsFromString(arg1); - reset = arg2; - } else if (isNumber(arg1) && isNumber(arg2)) { - params = collectDateParamsFromArguments(args); - } else { - params = isObjectType(arg1) ? simpleClone(arg1) : arg1; - reset = arg2; - } - return [params, reset]; - } - - function collectDateParamsFromArguments(args) { - var params = {}, index = 0; - walkUnitDown(YEAR_INDEX, function(unit) { - var arg = args[index++]; - if (isDefined(arg)) { - params[unit.name] = arg; - } - }); - return params; - } - - function getDateParamsFromString(str) { - var match, num, params = {}; - match = str.match(/^(-?\d*[\d.]\d*)?\s?(\w+?)s?$/i); - if (match) { - if (isUndefined(num)) { - num = match[1] ? +match[1] : 1; - } - params[match[2].toLowerCase()] = num; - } - return params; - } - - // Iteration helpers - - // Years -> Milliseconds - function iterateOverDateUnits(fn, startIndex, endIndex) { - endIndex = endIndex || 0; - if (isUndefined(startIndex)) { - startIndex = YEAR_INDEX; - } - for (var index = startIndex; index >= endIndex; index--) { - if (fn(DateUnits[index], index) === false) { - break; - } - } - } - - // Years -> Milliseconds using getLower/Higher methods - function walkUnitDown(unitIndex, fn) { - while (unitIndex >= 0) { - if (fn(DateUnits[unitIndex], unitIndex) === false) { - break; - } - unitIndex = getLowerUnitIndex(unitIndex); - } - } - - // Moving lower from specific unit - function getLowerUnitIndex(index) { - if (index === MONTH_INDEX) { - return DAY_INDEX; - } else if (index === WEEK_INDEX) { - return HOURS_INDEX; - } - return index - 1; - } - - // Moving higher from specific unit - function getHigherUnitIndex(index) { - return index === DAY_INDEX ? MONTH_INDEX : index + 1; - } - - // Years -> Milliseconds checking all date params including "weekday" - function iterateOverDateParams(params, fn, startIndex, endIndex) { - - function run(name, unit, i) { - var val = getDateParam(params, name); - if (isDefined(val)) { - fn(name, val, unit, i); - } - } - - iterateOverDateUnits(function (unit, i) { - var result = run(unit.name, unit, i); - if (result !== false && i === DAY_INDEX) { - // Check for "weekday", which has a distinct meaning - // in the context of setting a date, but has the same - // meaning as "day" as a unit of time. - result = run('weekday', unit, i); - } - return result; - }, startIndex, endIndex); - - } - - // Years -> Days - function iterateOverHigherDateParams(params, fn) { - iterateOverDateParams(params, fn, YEAR_INDEX, DAY_INDEX); - } - - // Advancing helpers - - function advanceDate(d, unit, num, reset) { - var set = {}; - set[unit] = num; - return updateDate(d, set, reset, 1); - } - - function advanceDateWithArgs(d, args, dir) { - args = collectUpdateDateArguments(args, true); - return updateDate(d, args[0], args[1], dir); - } - - // Edge helpers - - function resetTime(d) { - return setUnitAndLowerToEdge(d, HOURS_INDEX); - } - - function resetLowerUnits(d, unitIndex) { - return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex)); - } - - function moveToBeginningOfWeek(d, firstDayOfWeek) { - setWeekday(d, floor((getWeekday(d) - firstDayOfWeek) / 7) * 7 + firstDayOfWeek); - return d; - } - - function moveToEndOfWeek(d, firstDayOfWeek) { - var target = firstDayOfWeek - 1; - setWeekday(d, ceil((getWeekday(d) - target) / 7) * 7 + target); - return d; - } - - function moveToBeginningOfUnit(d, unitIndex, localeCode) { - if (unitIndex === WEEK_INDEX) { - moveToBeginningOfWeek(d, localeManager.get(localeCode).getFirstDayOfWeek()); - } - return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex)); - } - - function moveToEndOfUnit(d, unitIndex, localeCode, stopIndex) { - if (unitIndex === WEEK_INDEX) { - moveToEndOfWeek(d, localeManager.get(localeCode).getFirstDayOfWeek()); - } - return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex), stopIndex, true); - } - - function setUnitAndLowerToEdge(d, startIndex, stopIndex, end) { - walkUnitDown(startIndex, function(unit, i) { - var val = end ? unit.end : unit.start; - if (isFunction(val)) { - val = val(d); - } - callDateSet(d, unit.method, val); - return !isDefined(stopIndex) || i > stopIndex; - }); - return d; - } - - // Param helpers - - function getDateParamKey(params, key) { - return getOwnKey(params, key) || - getOwnKey(params, key + 's') || - (key === 'day' && getOwnKey(params, 'date')); - } - - function getDateParam(params, key) { - return getOwn(params, getDateParamKey(params, key)); - } - - function deleteDateParam(params, key) { - delete params[getDateParamKey(params, key)]; - } - - function getUnitIndexForParamName(name) { - var params = {}, unitIndex; - params[name] = 1; - iterateOverDateParams(params, function(name, val, unit, i) { - unitIndex = i; - return false; - }); - return unitIndex; - } - - // Time distance helpers - - function getDaysSince(d1, d2) { - return getTimeDistanceForUnit(d1, d2, DateUnits[DAY_INDEX]); - } - - function getTimeDistanceForUnit(d1, d2, unit) { - var fwd = d2 > d1, num, tmp; - if (!fwd) { - tmp = d2; - d2 = d1; - d1 = tmp; - } - num = d2 - d1; - if (unit.multiplier > 1) { - num = trunc(num / unit.multiplier); - } - // For higher order with potential ambiguity, use the numeric calculation - // as a starting point, then iterate until we pass the target date. Decrement - // starting point by 1 to prevent overshooting the date due to inconsistencies - // in ambiguous units numerically. For example, calculating the number of days - // from the beginning of the year to August 5th at 11:59:59 by doing a simple - // d2 - d1 will produce different results depending on whether or not a - // timezone shift was encountered due to DST, however that should not have an - // effect on our calculation here, so subtract by 1 to ensure that the - // starting point has not already overshot our target date. - if (unit.ambiguous) { - d1 = cloneDate(d1); - if (num) { - num -= 1; - advanceDate(d1, unit.name, num); - } - while (d1 < d2) { - advanceDate(d1, unit.name, 1); - if (d1 > d2) { - break; - } - num += 1; - } - } - return fwd ? -num : num; - } - - // Parsing helpers - - function getYearFromAbbreviation(str, d, prefer) { - // Following IETF here, adding 1900 or 2000 depending on the last two digits. - // Note that this makes no accordance for what should happen after 2050, but - // intentionally ignoring this for now. https://www.ietf.org/rfc/rfc2822.txt - var val = +str, delta; - val += val < 50 ? 2000 : 1900; - if (prefer) { - delta = val - getYear(d); - if (delta / abs(delta) !== prefer) { - val += prefer * 100; - } - } - return val; - } - - // Week number helpers - - function setISOWeekNumber(d, num) { - if (isNumber(num)) { - // Intentionally avoiding updateDate here to prevent circular dependencies. - var isoWeek = cloneDate(d), dow = getWeekday(d); - moveToFirstDayOfWeekYear(isoWeek, ISO_FIRST_DAY_OF_WEEK, ISO_FIRST_DAY_OF_WEEK_YEAR); - setDate(isoWeek, getDate(isoWeek) + 7 * (num - 1)); - setYear(d, getYear(isoWeek)); - setMonth(d, getMonth(isoWeek)); - setDate(d, getDate(isoWeek)); - setWeekday(d, dow || 7); - } - return d.getTime(); - } - - function getWeekNumber(d, allowPrevious, firstDayOfWeek, firstDayOfWeekYear) { - var isoWeek, n = 0; - if (isUndefined(firstDayOfWeek)) { - firstDayOfWeek = ISO_FIRST_DAY_OF_WEEK; - } - if (isUndefined(firstDayOfWeekYear)) { - firstDayOfWeekYear = ISO_FIRST_DAY_OF_WEEK_YEAR; - } - // Moving to the end of the week allows for forward year traversal, ie - // Dec 29 2014 is actually week 01 of 2015. - isoWeek = moveToEndOfWeek(cloneDate(d), firstDayOfWeek); - moveToFirstDayOfWeekYear(isoWeek, firstDayOfWeek, firstDayOfWeekYear); - if (allowPrevious && d < isoWeek) { - // If the date is still before the start of the year, then it should be - // the last week of the previous year, ie Jan 1 2016 is actually week 53 - // of 2015, so move to the beginning of the week to traverse the year. - isoWeek = moveToBeginningOfWeek(cloneDate(d), firstDayOfWeek); - moveToFirstDayOfWeekYear(isoWeek, firstDayOfWeek, firstDayOfWeekYear); - } - while (isoWeek <= d) { - // Doing a very simple walk to get the week number. - setDate(isoWeek, getDate(isoWeek) + 7); - n++; - } - return n; - } - - // Week year helpers - - function getWeekYear(d, localeCode, iso) { - var year, month, firstDayOfWeek, firstDayOfWeekYear, week, loc; - year = getYear(d); - month = getMonth(d); - if (month === 0 || month === 11) { - if (!iso) { - loc = localeManager.get(localeCode); - firstDayOfWeek = loc.getFirstDayOfWeek(localeCode); - firstDayOfWeekYear = loc.getFirstDayOfWeekYear(localeCode); - } - week = getWeekNumber(d, false, firstDayOfWeek, firstDayOfWeekYear); - if (month === 0 && week === 0) { - year -= 1; - } else if (month === 11 && week === 1) { - year += 1; - } - } - return year; - } - - function moveToFirstDayOfWeekYear(d, firstDayOfWeek, firstDayOfWeekYear) { - setUnitAndLowerToEdge(d, MONTH_INDEX); - setDate(d, firstDayOfWeekYear); - moveToBeginningOfWeek(d, firstDayOfWeek); - } - - // Relative helpers - - function dateRelative(d, dRelative, arg1, arg2) { - var adu, format, type, localeCode, fn; - assertDateIsValid(d); - if (isFunction(arg1)) { - fn = arg1; - } else { - localeCode = arg1; - fn = arg2; - } - adu = getAdjustedUnitForDate(d, dRelative); - if (fn) { - format = fn.apply(d, adu.concat(localeManager.get(localeCode))); - if (format) { - return dateFormat(d, format, localeCode); - } - } - // Adjust up if time is in ms, as this doesn't - // look very good for a standard relative date. - if (adu[1] === 0) { - adu[1] = 1; - adu[0] = 1; - } - if (dRelative) { - type = 'duration'; - } else if (adu[2] > 0) { - type = 'future'; - } else { - type = 'past'; - } - return localeManager.get(localeCode).getRelativeFormat(adu, type); - } - - // Gets an "adjusted date unit" which is a way of representing - // the largest possible meaningful unit. In other words, if passed - // 3600000, this will return an array which represents "1 hour". - function getAdjustedUnit(ms, fn) { - var unitIndex = 0, value = 0; - iterateOverDateUnits(function(unit, i) { - value = abs(fn(unit)); - if (value >= 1) { - unitIndex = i; - return false; - } - }); - return [value, unitIndex, ms]; - } - - // Gets the adjusted unit based on simple division by - // date unit multiplier. - function getAdjustedUnitForNumber(ms) { - return getAdjustedUnit(ms, function(unit) { - return trunc(withPrecision(ms / unit.multiplier, 1)); - }); - } - - // Gets the adjusted unit using the unitsFromNow methods, - // which use internal date methods that neatly avoid vaguely - // defined units of time (days in month, leap years, etc). - // Reserving dRelative to allow another date to be relative to. - function getAdjustedUnitForDate(d, dRelative) { - var ms; - if (!dRelative) { - dRelative = getNewDate(); - if (d > dRelative) { - // If our date is greater than the one that we got from getNewDate, it - // means that we are finding the unit for a date that is in the future - // relative to now. However, often the incoming date was created in - // the same cycle as our comparison, but our "now" date will have been - // created an instant after it, creating situations where "5 minutes from - // now" becomes "4 minutes from now" in the same tick. To prevent this, - // subtract a buffer of 10ms to compensate. - dRelative = new Date(dRelative.getTime() - 10); - } - } - ms = d - dRelative; - return getAdjustedUnit(ms, function(u) { - return abs(getTimeDistanceForUnit(d, dRelative, u)); - }); - } - - // Foramtting helpers - - // Formatting tokens - var ldmlTokens, strfTokens; - - function dateFormat(d, format, localeCode) { - assertDateIsValid(d); - format = CoreOutputFormats[format] || format || '{long}'; - return dateFormatMatcher(format, d, localeCode); - } - - function getMeridiemToken(d, localeCode) { - var hours = getHours(d); - return localeManager.get(localeCode).ampm[trunc(hours / 12)] || ''; - } - - function buildDateFormatTokens() { - - function addFormats(target, tokens, fn) { - if (tokens) { - forEach(spaceSplit(tokens), function(token) { - target[token] = fn; - }); - } - } - - function buildLowercase(get) { - return function(d, localeCode) { - return get(d, localeCode).toLowerCase(); - }; - } - - function buildOrdinal(get) { - return function(d, localeCode) { - var n = get(d, localeCode); - return n + localeManager.get(localeCode).getOrdinal(n); - }; - } - - function buildPadded(get, padding) { - return function(d, localeCode) { - return padNumber(get(d, localeCode), padding); - }; - } - - function buildTwoDigits(get) { - return function(d, localeCode) { - return get(d, localeCode) % 100; - }; - } - - function buildAlias(alias) { - return function(d, localeCode) { - return dateFormatMatcher(alias, d, localeCode); - }; - } - - function buildAlternates(f) { - for (var n = 1; n <= 5; n++) { - buildAlternate(f, n); - } - } - - function buildAlternate(f, n) { - var alternate = function(d, localeCode) { - return f.get(d, localeCode, n); - }; - addFormats(ldmlTokens, f.ldml + n, alternate); - if (f.lowerToken) { - ldmlTokens[f.lowerToken + n] = buildLowercase(alternate); - } - } - - function getIdentityFormat(name) { - return function(d, localeCode) { - var loc = localeManager.get(localeCode); - return dateFormatMatcher(loc[name], d, localeCode); - }; - } - - ldmlTokens = {}; - strfTokens = {}; - - forEach(FormatTokensBase, function(f) { - var get = f.get, getPadded; - if (f.lowerToken) { - ldmlTokens[f.lowerToken] = buildLowercase(get); - } - if (f.ordinalToken) { - ldmlTokens[f.ordinalToken] = buildOrdinal(get, f); - } - if (f.ldmlPaddedToken) { - ldmlTokens[f.ldmlPaddedToken] = buildPadded(get, f.ldmlPaddedToken.length); - } - if (f.ldmlTwoDigitToken) { - ldmlTokens[f.ldmlTwoDigitToken] = buildPadded(buildTwoDigits(get), 2); - } - if (f.strfTwoDigitToken) { - strfTokens[f.strfTwoDigitToken] = buildPadded(buildTwoDigits(get), 2); - } - if (f.strfPadding) { - getPadded = buildPadded(get, f.strfPadding); - } - if (f.alias) { - get = buildAlias(f.alias); - } - if (f.allowAlternates) { - buildAlternates(f); - } - addFormats(ldmlTokens, f.ldml, get); - addFormats(strfTokens, f.strf, getPadded || get); - }); - - forEachProperty(CoreOutputFormats, function(src, name) { - addFormats(ldmlTokens, name, buildAlias(src)); - }); - - defineInstanceSimilar(sugarDate, 'short medium long full', function(methods, name) { - var fn = getIdentityFormat(name); - addFormats(ldmlTokens, name, fn); - methods[name] = fn; - }); - - addFormats(ldmlTokens, 'time', getIdentityFormat('time')); - addFormats(ldmlTokens, 'stamp', getIdentityFormat('stamp')); - } - - // Format matcher - - var dateFormatMatcher; - - function buildDateFormatMatcher() { - - function getLdml(d, token, localeCode) { - return getOwn(ldmlTokens, token)(d, localeCode); - } - - function getStrf(d, token, localeCode) { - return getOwn(strfTokens, token)(d, localeCode); - } - - function checkDateToken(ldml, strf) { - return hasOwn(ldmlTokens, ldml) || hasOwn(strfTokens, strf); - } - - // Format matcher for LDML or STRF tokens. - dateFormatMatcher = createFormatMatcher(getLdml, getStrf, checkDateToken); - } - - // Comparison helpers - - function fullCompareDate(date, d, margin) { - var tmp; - if (!dateIsValid(date)) return; - if (isString(d)) { - d = trim(d).toLowerCase(); - switch(true) { - case d === 'future': return date.getTime() > getNewDate().getTime(); - case d === 'past': return date.getTime() < getNewDate().getTime(); - case d === 'today': return compareDay(date); - case d === 'tomorrow': return compareDay(date, 1); - case d === 'yesterday': return compareDay(date, -1); - case d === 'weekday': return getWeekday(date) > 0 && getWeekday(date) < 6; - case d === 'weekend': return getWeekday(date) === 0 || getWeekday(date) === 6; - - case (isDefined(tmp = English.weekdayMap[d])): - return getWeekday(date) === tmp; - case (isDefined(tmp = English.monthMap[d])): - return getMonth(date) === tmp; - } - } - return compareDate(date, d, margin); - } - - function compareDate(date, d, margin, localeCode, options) { - var loMargin = 0, hiMargin = 0, timezoneShift, compareEdges, override, min, max, p, t; - - function getTimezoneShift() { - // If there is any specificity in the date then we're implicitly not - // checking absolute time, so ignore timezone shifts. - if (p.set && p.set.specificity) { - return 0; - } - return (tzOffset(p.date) - tzOffset(date)) * MINUTES; - } - - function addSpecificUnit() { - var unit = DateUnits[p.set.specificity]; - return advanceDate(cloneDate(p.date), unit.name, 1).getTime() - 1; - } - - if (_utc(date)) { - options = options || {}; - options.fromUTC = true; - options.setUTC = true; - } - - p = getExtendedDate(null, d, options, true); - - if (margin > 0) { - loMargin = hiMargin = margin; - override = true; - } - if (!dateIsValid(p.date)) return false; - if (p.set && p.set.specificity) { - if (isDefined(p.set.edge) || isDefined(p.set.shift)) { - compareEdges = true; - moveToBeginningOfUnit(p.date, p.set.specificity, localeCode); - } - if (compareEdges || p.set.specificity === MONTH_INDEX) { - max = moveToEndOfUnit(cloneDate(p.date), p.set.specificity, localeCode).getTime(); - } else { - max = addSpecificUnit(); - } - if (!override && isDefined(p.set.sign) && p.set.specificity) { - // If the time is relative, there can occasionally be an disparity between - // the relative date and "now", which it is being compared to, so set an - // extra margin to account for this. - loMargin = 50; - hiMargin = -50; - } - } - t = date.getTime(); - min = p.date.getTime(); - max = max || min; - timezoneShift = getTimezoneShift(); - // istanbul ignore if - if (timezoneShift) { - min -= timezoneShift; - max -= timezoneShift; - } - return t >= (min - loMargin) && t <= (max + hiMargin); - } - - function compareDay(d, shift) { - var comp = getNewDate(); - if (shift) { - setDate(comp, getDate(comp) + shift); - } - return getYear(d) === getYear(comp) && - getMonth(d) === getMonth(comp) && - getDate(d) === getDate(comp); - } - - // Create helpers - - function createDate(d, options, forceClone) { - return getExtendedDate(null, d, options, forceClone).date; - } - - function createDateWithContext(contextDate, d, options, forceClone) { - return getExtendedDate(contextDate, d, options, forceClone).date; - } - - function getExtendedDate(contextDate, d, opt, forceClone) { - - // Locals - var date, set, loc, afterCallbacks, relative, weekdayDir; - - // Options - var optPrefer, optLocale, optFromUTC, optSetUTC, optParams, optClone; - - afterCallbacks = []; - - setupOptions(opt); - - function setupOptions(opt) { - opt = isString(opt) ? { locale: opt } : opt || {}; - optPrefer = +!!getOwn(opt, 'future') - +!!getOwn(opt, 'past'); - optLocale = getOwn(opt, 'locale'); - optFromUTC = getOwn(opt, 'fromUTC'); - optSetUTC = getOwn(opt, 'setUTC'); - optParams = getOwn(opt, 'params'); - optClone = getOwn(opt, 'clone'); - } - - function parseFormatValues(match, dif) { - var set = optParams || {}; - forEach(dif.to, function(param, i) { - var str = match[i + 1], val; - if (!str) return; - - val = parseIrregular(str, param); - - if (isUndefined(val)) { - val = loc.parseValue(str, param); - } - - set[param] = val; - }); - return set; - } - - function parseIrregular(str, param) { - if (param === 'utc') { - return 1; - } else if (param === 'year') { - var match = str.match(ABBREVIATED_YEAR_REG); - if (match) { - return getYearFromAbbreviation(match[1], date, optPrefer); - } - } - } - - // Force the UTC flags to be true if the source date - // date is UTC, as they will be overwritten later. - function cloneDateByFlag(d, clone) { - if (_utc(d) && !isDefined(optFromUTC)) { - optFromUTC = true; - } - if (_utc(d) && !isDefined(optSetUTC)) { - optSetUTC = true; - } - if (clone) { - d = new Date(d.getTime()); - } - return d; - } - - function afterDateSet(fn) { - afterCallbacks.push(fn); - } - - function fireCallbacks() { - forEach(afterCallbacks, function(fn) { - fn.call(); - }); - } - - function parseStringDate(str) { - - str = str.toLowerCase(); - - // The act of getting the locale will initialize - // if it is missing and add the required formats. - loc = localeManager.get(optLocale); - - for (var i = 0, dif, match; dif = loc.compiledFormats[i]; i++) { - match = str.match(dif.reg); - if (match) { - - // Note that caching the format will modify the compiledFormats array - // which is not a good idea to do inside its for loop, however we - // know at this point that we have a matched format and that we will - // break out below, so simpler to do it here. - loc.cacheFormat(dif, i); - - set = parseFormatValues(match, dif); - - if (isDefined(set.timestamp)) { - date.setTime(set.timestamp); - break; - } - - if (isDefined(set.ampm)) { - handleAmpm(set.ampm); - } - - if (set.utc || isDefined(set.tzHour)) { - handleTimezoneOffset(set.tzHour, set.tzMinute); - } - - if (isDefined(set.shift) && isUndefined(set.unit)) { - // "next january", "next monday", etc - handleUnitlessShift(); - } - - if (isDefined(set.num) && isUndefined(set.unit)) { - // "the second of January", etc - handleUnitlessNum(set.num); - } - - if (set.midday) { - // "noon" and "midnight" - handleMidday(set.midday); - } - - if (isDefined(set.day)) { - // Relative day localizations such as "today" and "tomorrow". - handleRelativeDay(set.day); - } - - if (isDefined(set.unit)) { - // "3 days ago", etc - handleRelativeUnit(set.unit); - } - - if (set.edge) { - // "the end of January", etc - handleEdge(set.edge, set); - } - - break; - } - } - - if (!set) { - // TODO: remove in next major version - // Fall back to native parsing - date = new Date(str); - if (optFromUTC && dateIsValid(date)) { - // Falling back to system date here which cannot be parsed as UTC, - // so if we're forcing UTC then simply add the offset. - date.setTime(date.getTime() + (tzOffset(date) * MINUTES)); - } - } else if (relative) { - updateDate(date, set, false, 1); - } else { - updateDate(date, set, true, 0, optPrefer, weekdayDir, contextDate); - } - fireCallbacks(); - return date; - } - - function handleAmpm(ampm) { - if (ampm === 1 && set.hour < 12) { - // If the time is 1pm-11pm advance the time by 12 hours. - set.hour += 12; - } else if (ampm === 0 && set.hour === 12) { - // If it is 12:00am then set the hour to 0. - set.hour = 0; - } - } - - function handleTimezoneOffset(tzHour, tzMinute) { - // Adjust for timezone offset - _utc(date, true); - - // Sign is parsed as part of the hour, so flip - // the minutes if it's negative. - - if (tzHour < 0) { - tzMinute *= -1; - } - - var offset = tzHour * 60 + (tzMinute || 0); - if (offset) { - set.minute = (set.minute || 0) - offset; - } - } - - function handleUnitlessShift() { - if (isDefined(set.month)) { - // "next January" - set.unit = YEAR_INDEX; - } else if (isDefined(set.weekday)) { - // "next Monday" - set.unit = WEEK_INDEX; - } - } - - function handleUnitlessNum(num) { - if (isDefined(set.weekday)) { - // "The second Tuesday of March" - setOrdinalWeekday(num); - } else if (isDefined(set.month)) { - // "The second of March" - set.date = set.num; - } - } - - function handleMidday(hour) { - set.hour = hour % 24; - if (hour > 23) { - // If the date has hours past 24, we need to prevent it from traversing - // into a new day as that would make it being part of a new week in - // ambiguous dates such as "Monday". - afterDateSet(function() { - advanceDate(date, 'date', trunc(hour / 24)); - }); - } - } - - function handleRelativeDay() { - resetTime(date); - if (isUndefined(set.unit)) { - set.unit = DAY_INDEX; - set.num = set.day; - delete set.day; - } - } - - function handleRelativeUnit(unitIndex) { - var num; - - if (isDefined(set.num)) { - num = set.num; - } else if (isDefined(set.edge) && isUndefined(set.shift)) { - num = 0; - } else { - num = 1; - } - - // If a weekday is defined, there are 3 possible formats being applied: - // - // 1. "the day after monday": unit is days - // 2. "next monday": short for "next week monday", unit is weeks - // 3. "the 2nd monday of next month": unit is months - // - // In the first case, we need to set the weekday up front, as the day is - // relative to it. The second case also needs to be handled up front for - // formats like "next monday at midnight" which will have its weekday reset - // if not set up front. The last case will set up the params necessary to - // shift the weekday and allow separateAbsoluteUnits below to handle setting - // it after the date has been shifted. - if(isDefined(set.weekday)) { - if(unitIndex === MONTH_INDEX) { - setOrdinalWeekday(num); - num = 1; - } else { - updateDate(date, { weekday: set.weekday }, true); - delete set.weekday; - } - } - - if (set.half) { - // Allow localized "half" as a standalone colloquialism. Purposely avoiding - // the locale number system to reduce complexity. The units "month" and - // "week" are purposely excluded in the English date formats below, as - // "half a week" and "half a month" are meaningless as exact dates. - num *= set.half; - } - - if (isDefined(set.shift)) { - // Shift and unit, ie "next month", "last week", etc. - num *= set.shift; - } else if (set.sign) { - // Unit and sign, ie "months ago", "weeks from now", etc. - num *= set.sign; - } - - if (isDefined(set.day)) { - // "the day after tomorrow" - num += set.day; - delete set.day; - } - - // Formats like "the 15th of last month" or "6:30pm of next week" - // contain absolute units in addition to relative ones, so separate - // them here, remove them from the params, and set up a callback to - // set them after the relative ones have been set. - separateAbsoluteUnits(unitIndex); - - // Finally shift the unit. - set[English.units[unitIndex]] = num; - relative = true; - } - - function handleEdge(edge, params) { - var edgeIndex = params.unit, weekdayOfMonth; - if (!edgeIndex) { - // If we have "the end of January", then we need to find the unit index. - iterateOverHigherDateParams(params, function(unitName, val, unit, i) { - if (unitName === 'weekday' && isDefined(params.month)) { - // If both a month and weekday exist, then we have a format like - // "the last tuesday in November, 2012", where the "last" is still - // relative to the end of the month, so prevent the unit "weekday" - // from taking over. - return; - } - edgeIndex = i; - }); - } - if (edgeIndex === MONTH_INDEX && isDefined(params.weekday)) { - // If a weekday in a month exists (as described above), - // then set it up to be set after the date has been shifted. - weekdayOfMonth = params.weekday; - delete params.weekday; - } - afterDateSet(function() { - var stopIndex; - // "edge" values that are at the very edge are "2" so the beginning of the - // year is -2 and the end of the year is 2. Conversely, the "last day" is - // actually 00:00am so it is 1. -1 is reserved but unused for now. - if (edge < 0) { - moveToBeginningOfUnit(date, edgeIndex, optLocale); - } else if (edge > 0) { - if (edge === 1) { - stopIndex = DAY_INDEX; - moveToBeginningOfUnit(date, DAY_INDEX); - } - moveToEndOfUnit(date, edgeIndex, optLocale, stopIndex); - } - if (isDefined(weekdayOfMonth)) { - setWeekday(date, weekdayOfMonth, -edge); - resetTime(date); - } - }); - if (edgeIndex === MONTH_INDEX) { - params.specificity = DAY_INDEX; - } else { - params.specificity = edgeIndex - 1; - } - } - - function setOrdinalWeekday(num) { - // If we have "the 2nd Tuesday of June", then pass the "weekdayDir" - // flag along to updateDate so that the date does not accidentally traverse - // into the previous month. This needs to be independent of the "prefer" - // flag because we are only ensuring that the weekday is in the future, not - // the entire date. - set.weekday = 7 * (num - 1) + set.weekday; - set.date = 1; - weekdayDir = 1; - } - - function separateAbsoluteUnits(unitIndex) { - var params; - - iterateOverDateParams(set, function(name, val, unit, i) { - // If there is a time unit set that is more specific than - // the matched unit we have a string like "5:30am in 2 minutes", - // which is meaningless, so invalidate the date... - if (i >= unitIndex) { - date.setTime(NaN); - return false; - } else if (i < unitIndex) { - // ...otherwise set the params to set the absolute date - // as a callback after the relative date has been set. - params = params || {}; - params[name] = val; - deleteDateParam(set, name); - } - }); - if (params) { - afterDateSet(function() { - updateDate(date, params, true, 0, false, weekdayDir); - if (optParams) { - simpleMerge(optParams, params); - } - }); - if (set.edge) { - // "the end of March of next year" - handleEdge(set.edge, params); - delete set.edge; - } - } - } - - if (contextDate && d) { - // If a context date is passed ("get" and "unitsFromNow"), - // then use it as the starting point. - date = cloneDateByFlag(contextDate, true); - } else { - date = getNewDate(); - } - - _utc(date, optFromUTC); - - if (isString(d)) { - date = parseStringDate(d); - } else if (isDate(d)) { - date = cloneDateByFlag(d, optClone || forceClone); - } else if (isObjectType(d)) { - set = simpleClone(d); - updateDate(date, set, true); - } else if (isNumber(d) || d === null) { - date.setTime(d); - } - // A date created by parsing a string presumes that the format *itself* is - // UTC, but not that the date, once created, should be manipulated as such. In - // other words, if you are creating a date object from a server time - // "2012-11-15T12:00:00Z", in the majority of cases you are using it to create - // a date that will, after creation, be manipulated as local, so reset the utc - // flag here unless "setUTC" is also set. - _utc(date, !!optSetUTC); - return { - set: set, - date: date - }; - } - - // TODO: consolidate arguments into options - function updateDate(d, params, reset, advance, prefer, weekdayDir, contextDate) { - var upperUnitIndex; - - function setUpperUnit(unitName, unitIndex) { - if (prefer && !upperUnitIndex) { - if (unitName === 'weekday') { - upperUnitIndex = WEEK_INDEX; - } else { - upperUnitIndex = getHigherUnitIndex(unitIndex); - } - } - } - - function setSpecificity(unitIndex) { - // Other functions may preemptively set the specificity before arriving - // here so concede to them if they have already set more specific units. - if (unitIndex > params.specificity) { - return; - } - params.specificity = unitIndex; - } - - function canDisambiguate() { - if (!upperUnitIndex || upperUnitIndex > YEAR_INDEX) { - return; - } - - switch(prefer) { - case -1: return d >= (contextDate || getNewDate()); - case 1: return d <= (contextDate || getNewDate()); - } - } - - function disambiguateHigherUnit() { - var unit = DateUnits[upperUnitIndex]; - advance = prefer; - setUnit(unit.name, 1, unit, upperUnitIndex); - } - - function handleFraction(unit, unitIndex, fraction) { - if (unitIndex) { - var lowerUnit = DateUnits[getLowerUnitIndex(unitIndex)]; - var val = round(unit.multiplier / lowerUnit.multiplier * fraction); - params[lowerUnit.name] = val; - } - } - - function monthHasShifted(d, targetMonth) { - if (targetMonth < 0) { - targetMonth = targetMonth % 12 + 12; - } - return targetMonth % 12 !== getMonth(d); - } - - function setUnit(unitName, value, unit, unitIndex) { - var method = unit.method, checkMonth, fraction; - - setUpperUnit(unitName, unitIndex); - setSpecificity(unitIndex); - - fraction = value % 1; - if (fraction) { - handleFraction(unit, unitIndex, fraction); - value = trunc(value); - } - - if (unitName === 'weekday') { - if (!advance) { - // Weekdays are always considered absolute units so simply set them - // here even if it is an "advance" operation. This is to help avoid - // ambiguous meanings in "advance" as well as to neatly allow formats - // like "Wednesday of next week" without more complex logic. - setWeekday(d, value, weekdayDir); - } - return; - } - checkMonth = unitIndex === MONTH_INDEX && getDate(d) > 28; - - // If we are advancing or rewinding, then we need we need to set the - // absolute time if the unit is "hours" or less. This is due to the fact - // that setting by method is ambiguous during DST shifts. For example, - // 1:00am on November 1st 2015 occurs twice in North American timezones - // with DST, the second time being after the clocks are rolled back at - // 2:00am. When springing forward this is automatically handled as there - // is no 2:00am so the date automatically jumps to 3:00am. However, when - // rolling back, setHours(2) will always choose the first "2am" even if - // the date is currently set to the second, causing unintended jumps. - // This ambiguity is unavoidable when setting dates as the notation is - // ambiguous. However when advancing, we clearly want the resulting date - // to be an acutal hour ahead, which can only be accomplished by setting - // the absolute time. Conversely, any unit higher than "hours" MUST use - // the internal set methods, as they are ambiguous as absolute units of - // time. Years may be 365 or 366 days depending on leap years, months are - // all over the place, and even days may be 23-25 hours depending on DST - // shifts. Finally, note that the kind of jumping described above will - // occur when calling ANY "set" method on the date and will occur even if - // the value being set is identical to the one currently set (i.e. - // setHours(2) on a date at 2am may not be a noop). This is precarious, - // so avoiding this situation in callDateSet by checking up front that - // the value is not the same before setting. - if (advance && !unit.ambiguous) { - d.setTime(d.getTime() + (value * advance * unit.multiplier)); - return; - } else if (advance) { - if (unitIndex === WEEK_INDEX) { - value *= 7; - method = DateUnits[DAY_INDEX].method; - } - value = (value * advance) + callDateGet(d, method); - } - callDateSetWithWeek(d, method, value, advance); - if (checkMonth && monthHasShifted(d, value)) { - // As we are setting the units in reverse order, there is a chance that - // our date may accidentally traverse into a new month, such as setting - // { month: 1, date 15 } on January 31st. Check for this here and reset - // the date to the last day of the previous month if this has happened. - setDate(d, 0); - } - } - - if (isNumber(params) && advance) { - // If param is a number and advancing, the number is in milliseconds. - params = { millisecond: params }; - } else if (isNumber(params)) { - // Otherwise just set the timestamp and return. - d.setTime(params); - return d; - } - - iterateOverDateParams(params, setUnit); - - if (reset && params.specificity) { - resetLowerUnits(d, params.specificity); - } - - // If past or future is preferred, then the process of "disambiguation" will - // ensure that an ambiguous time/date ("4pm", "thursday", "June", etc.) will - // be in the past or future. Weeks are only considered ambiguous if there is - // a weekday, i.e. "thursday" is an ambiguous week, but "the 4th" is an - // ambiguous month. - if (canDisambiguate()) { - disambiguateHigherUnit(); - } - return d; - } - - // Locales - - // Locale helpers - var English, localeManager; - - function getEnglishVariant(v) { - return simpleMerge(simpleClone(EnglishLocaleBaseDefinition), v); - } - - function arrayToRegAlternates(arr) { - var joined = arr.join(''); - if (!arr || !arr.length) { - return ''; - } - if (joined.length === arr.length) { - return '[' + joined + ']'; - } - // map handles sparse arrays so no need to compact the array here. - return map(arr, escapeRegExp).join('|'); - } - - function getRegNonCapturing(src, opt) { - if (src.length > 1) { - src = '(?:' + src + ')'; - } - if (opt) { - src += '?'; - } - return src; - } - - function getParsingTokenWithSuffix(field, src, suffix) { - var token = LocalizedParsingTokens[field]; - if (token.requiresSuffix) { - src = getRegNonCapturing(src + getRegNonCapturing(suffix)); - } else if (token.requiresSuffixOr) { - src += getRegNonCapturing(token.requiresSuffixOr + '|' + suffix); - } else { - src += getRegNonCapturing(suffix, true); - } - return src; - } - - function getArrayWithOffset(arr, n, alternate, offset) { - var val; - if (alternate > 1) { - val = arr[n + (alternate - 1) * offset]; - } - return val || arr[n]; - } - - function buildLocales() { - - function LocaleManager(loc) { - this.locales = {}; - this.add(loc); - } - - LocaleManager.prototype = { - - get: function(code, fallback) { - var loc = this.locales[code]; - if (!loc && LazyLoadedLocales[code]) { - loc = this.add(code, LazyLoadedLocales[code]); - } else if (!loc && code) { - loc = this.locales[code.slice(0, 2)]; - } - return loc || fallback === false ? loc : this.current; - }, - - getAll: function() { - return this.locales; - }, - - set: function(code) { - var loc = this.get(code, false); - if (!loc) { - throw new TypeError('Invalid Locale: ' + code); - } - return this.current = loc; - }, - - add: function(code, def) { - if (!def) { - def = code; - code = def.code; - } else { - def.code = code; - } - var loc = def.compiledFormats ? def : getNewLocale(def); - this.locales[code] = loc; - if (!this.current) { - this.current = loc; - } - return loc; - }, - - remove: function(code) { - if (this.current.code === code) { - this.current = this.get('en'); - } - return delete this.locales[code]; - } - - }; - - // Sorry about this guys... - English = getNewLocale(AmericanEnglishDefinition); - localeManager = new LocaleManager(English); - } - - function getNewLocale(def) { - - function Locale(def) { - this.init(def); - } - - Locale.prototype = { - - getMonthName: function(n, alternate) { - if (this.monthSuffix) { - return (n + 1) + this.monthSuffix; - } - return getArrayWithOffset(this.months, n, alternate, 12); - }, - - getWeekdayName: function(n, alternate) { - return getArrayWithOffset(this.weekdays, n, alternate, 7); - }, - - // TODO: rename to parse in next major version - parseValue: function(str, param) { - var map = this[param + 'Map']; - if (hasOwn(map, str)) { - return map[str]; - } - return this.parseNumber(str, param); - }, - - // TODO: analyze performance of parsing first vs checking - // numeralMap first. - parseNumber: function(str, param) { - var val; - - // Simple numerals such as "one" are mapped directly in - // the numeral map so catch up front if there is a match. - if (hasOwn(this.numeralMap, str)) { - val = this.numeralMap[str]; - } - - // TODO: perf test isNaN vs other methods - if (isNaN(val)) { - val = this.parseRegularNumerals(str); - } - - if (isNaN(val)) { - val = this.parseIrregularNumerals(str); - } - - if (param === 'month') { - // Months are the only numeric date field - // whose value is not the same as its number. - val -= 1; - } - - return val; - }, - - // TODO: perf test returning up front if no regular decimals exist - parseRegularNumerals: function(str) { - // Allow decimals as commas and the minus-sign as per ISO-8601. - str = str.replace(/^−/, '-').replace(/,/, '.'); - - // The unary plus operator here shows better performance and handles - // every format that parseFloat does with the exception of trailing - // characters, which are guaranteed not to be in our string at this point. - return +str; - }, - - parseIrregularNumerals: function(str) { - var place = 1, num = 0, lastWasPlace, isPlace, numeral, digit, arr; - - // Note that "numerals" that need to be converted through this method are - // all considered to be single characters in order to handle CJK. This - // method is by no means unique to CJK, but the complexity of handling - // inflections in non-CJK languages adds too much overhead for not enough - // value, so avoiding for now. - arr = str.split(''); - for (var i = arr.length - 1; numeral = arr[i]; i--) { - digit = getOwn(this.numeralMap, numeral); - if (isUndefined(digit)) { - digit = getOwn(fullWidthNumberMap, numeral) || 0; - } - isPlace = digit > 0 && digit % 10 === 0; - if (isPlace) { - if (lastWasPlace) { - num += place; - } - if (i) { - place = digit; - } else { - num += digit; - } - } else { - num += digit * place; - place *= 10; - } - lastWasPlace = isPlace; - } - return num; - }, - - getOrdinal: function(n) { - var suffix = this.ordinalSuffix; - return suffix || getOrdinalSuffix(n); - }, - - getRelativeFormat: function(adu, type) { - return this.convertAdjustedToFormat(adu, type); - }, - - getDuration: function(ms) { - return this.convertAdjustedToFormat(getAdjustedUnitForNumber(max(0, ms)), 'duration'); - }, - - getFirstDayOfWeek: function() { - var val = this.firstDayOfWeek; - return isDefined(val) ? val : ISO_FIRST_DAY_OF_WEEK; - }, - - getFirstDayOfWeekYear: function() { - return this.firstDayOfWeekYear || ISO_FIRST_DAY_OF_WEEK_YEAR; - }, - - convertAdjustedToFormat: function(adu, type) { - var sign, unit, mult, - num = adu[0], - u = adu[1], - ms = adu[2], - format = this[type] || this.relative; - if (isFunction(format)) { - return format.call(this, num, u, ms, type); - } - mult = !this.plural || num === 1 ? 0 : 1; - unit = this.units[mult * 8 + u] || this.units[u]; - sign = this[ms > 0 ? 'fromNow' : 'ago']; - return format.replace(/\{(.*?)\}/g, function(full, match) { - switch(match) { - case 'num': return num; - case 'unit': return unit; - case 'sign': return sign; - } - }); - }, - - cacheFormat: function(dif, i) { - this.compiledFormats.splice(i, 1); - this.compiledFormats.unshift(dif); - }, - - addFormat: function(format) { - var loc = this, src, to; - - function getTokenSrc(token) { - var suffix, src, tmp, - opt = token.match(/\?$/), - nc = token.match(/^(\d+)\??$/), - slice = token.match(/(\d)(?:-(\d))?/), - param = token.replace(/[^a-z]+$/i, ''); - - // Allowing alias tokens such as {time} - if (tmp = getOwn(loc.parsingAliases, param)) { - src = formatToSrc(tmp); - if (opt) { - src = getRegNonCapturing(src, true); - } - return src; - } - - if (nc) { - src = loc.tokens[nc[1]]; - } else if (tmp = getOwn(CoreParsingTokens, param)) { - src = tmp.src; - param = tmp.param || param; - } else { - tmp = getOwn(loc.parsingTokens, param) || getOwn(loc, param); - - // Both the "months" array and the "month" parsing token can be accessed - // by either {month} or {months}, falling back as necessary, however - // regardless of whether or not a fallback occurs, the final field to - // be passed to addRawFormat must be normalized as singular. - param = param.replace(/s$/, ''); - - if (!tmp) { - tmp = getOwn(loc.parsingTokens, param) || getOwn(loc, param + 's'); - } - - if (isString(tmp)) { - src = tmp; - suffix = loc[param + 'Suffix']; - } else { - - // This is a hack to temporarily disallow parsing of single character - // weekdays until the format can be changed to allow for this. - if (param === 'weekday' && loc.code === 'ko') { - tmp = filter(tmp, function(str) { - return str.length > 1; - }); - } - - if (slice) { - tmp = filter(tmp, function(m, i) { - var mod = i % (loc.units ? 8 : tmp.length); - return mod >= slice[1] && mod <= (slice[2] || slice[1]); - }); - } - src = arrayToRegAlternates(tmp); - } - } - if (!src) { - return ''; - } - if (nc) { - // Non-capturing tokens like {0} - src = getRegNonCapturing(src); - } else { - // Capturing group and add to parsed tokens - to.push(param); - src = '(' + src + ')'; - } - if (suffix) { - // Date/time suffixes such as those in CJK - src = getParsingTokenWithSuffix(param, src, suffix); - } - if (opt) { - src += '?'; - } - return src; - } - - function formatToSrc(str) { - - // Make spaces optional - str = str.replace(/ /g, ' ?'); - - str = str.replace(/\{([^,]+?)\}/g, function(match, token) { - var tokens = token.split('|'); - if (tokens.length > 1) { - return getRegNonCapturing(map(tokens, getTokenSrc).join('|')); - } else { - return getTokenSrc(token); - } - }); - - return str; - } - - function parseInputFormat() { - to = []; - src = formatToSrc(format); - } - - parseInputFormat(); - loc.addRawFormat(src, to); - }, - - addRawFormat: function(format, to) { - this.compiledFormats.unshift({ - reg: RegExp('^ *' + format + ' *$', 'i'), - to: to - }); - }, - - init: function(def) { - var loc = this; - - // -- Initialization helpers - - function initFormats() { - loc.compiledFormats = []; - loc.parsingAliases = {}; - loc.parsingTokens = {}; - } - - function initDefinition() { - simpleMerge(loc, def); - } - - function initArrayFields() { - forEach(LOCALE_ARRAY_FIELDS, function(name) { - var val = loc[name]; - if (isString(val)) { - loc[name] = commaSplit(val); - } else if (!val) { - loc[name] = []; - } - }); - } - - // -- Value array build helpers - - function buildValueArray(name, mod, map, fn) { - var field = name, all = [], setMap; - if (!loc[field]) { - field += 's'; - } - if (!map) { - map = {}; - setMap = true; - } - forAllAlternates(field, function(alt, j, i) { - var idx = j * mod + i, val; - val = fn ? fn(i) : i; - map[alt] = val; - map[alt.toLowerCase()] = val; - all[idx] = alt; - }); - loc[field] = all; - if (setMap) { - loc[name + 'Map'] = map; - } - } - - function forAllAlternates(field, fn) { - forEach(loc[field], function(str, i) { - forEachAlternate(str, function(alt, j) { - fn(alt, j, i); - }); - }); - } - - function forEachAlternate(str, fn) { - var arr = map(str.split('+'), function(split) { - return split.replace(/(.+):(.+)$/, function(full, base, suffixes) { - return map(suffixes.split('|'), function(suffix) { - return base + suffix; - }).join('|'); - }); - }).join('|'); - forEach(arr.split('|'), fn); - } - - function buildNumerals() { - var map = {}; - buildValueArray('numeral', 10, map); - buildValueArray('article', 1, map, function() { - return 1; - }); - buildValueArray('placeholder', 4, map, function(n) { - return pow(10, n + 1); - }); - loc.numeralMap = map; - } - - function buildTimeFormats() { - loc.parsingAliases['time'] = getTimeFormat(); - loc.parsingAliases['tzOffset'] = getTZOffsetFormat(); - } - - function getTimeFormat(standalone) { - var src, sep; - sep = getTimeSeparatorSrc(standalone); - if (loc.ampmFront) { - // "ampmFront" exists mostly for CJK locales, which also presume that - // time suffixes exist, allowing this to be a simpler regex. - src = '{ampm?} {hour} (?:{minute} (?::?{second})?)?'; - } else if(loc.ampm.length) { - src = '{hour}(?:'+sep+'{minute?}(?:'+sep+'{second?})? {ampm?}| {ampm})'; - } else { - src = '{hour}(?:'+sep+'{minute?}(?:'+sep+'{second?})?)'; - } - return src; - } - - function getTimeSeparatorSrc() { - if (loc.timeSeparator) { - return '[:' + loc.timeSeparator + ']'; - } else { - return ':'; - } - } - - function getTZOffsetFormat() { - return '(?:{Z}|{GMT?}(?:{tzHour}(?::?{tzMinute}(?: \\([\\w\\s]+\\))?)?)?)?'; - } - - function buildParsingTokens() { - forEachProperty(LocalizedParsingTokens, function(token, name) { - var src = token.base ? getCoreTokensForBase(token.base) : token.src, arr; - if (token.requiresNumerals || loc.numeralUnits) { - src += getNumeralSrc(); - } - arr = loc[name + 's']; - if (arr && arr.length) { - src += '|' + arrayToRegAlternates(arr); - } - loc.parsingTokens[name] = src; - }); - } - - function getCoreTokensForBase(base) { - return map(base.split('|'), function(key) { - return CoreParsingTokens[key].src; - }).join('|'); - } - - function getNumeralSrc() { - var all, src = ''; - all = loc.numerals.concat(loc.placeholders).concat(loc.articles); - if (loc.allowsFullWidth) { - all = all.concat(fullWidthNumbers.split('')); - } - if (all.length) { - src = '|(?:' + arrayToRegAlternates(all) + ')+'; - } - return src; - } - - function buildTimeSuffixes() { - iterateOverDateUnits(function(unit, i) { - var token = loc.timeSuffixes[i]; - if (token) { - loc[(unit.alias || unit.name) + 'Suffix'] = token; - } - }); - } - - function buildModifiers() { - forEach(loc.modifiers, function(modifier) { - var name = modifier.name, mapKey = name + 'Map', map; - map = loc[mapKey] || {}; - forEachAlternate(modifier.src, function(alt, j) { - var token = getOwn(loc.parsingTokens, name), val = modifier.value; - map[alt] = val; - loc.parsingTokens[name] = token ? token + '|' + alt : alt; - if (modifier.name === 'sign' && j === 0) { - // Hooking in here to set the first "fromNow" or "ago" modifier - // directly on the locale, so that it can be reused in the - // relative format. - loc[val === 1 ? 'fromNow' : 'ago'] = alt; - } - }); - loc[mapKey] = map; - }); - } - - // -- Format adding helpers - - function addCoreFormats() { - forEach(CoreParsingFormats, function(df) { - var src = df.src; - if (df.localeCheck && !df.localeCheck(loc)) { - return; - } - if (df.mdy && loc.mdy) { - // Use the mm/dd/yyyy variant if it - // exists and the locale requires it - src = df.mdy; - } - if (df.time) { - // Core formats that allow time require the time - // reg on both sides, so add both versions here. - loc.addFormat(getFormatWithTime(src, true)); - loc.addFormat(getFormatWithTime(src)); - } else { - loc.addFormat(src); - } - }); - loc.addFormat('{time}'); - } - - function addLocaleFormats() { - addFormatSet('parse'); - addFormatSet('timeParse', true); - addFormatSet('timeFrontParse', true, true); - } - - function addFormatSet(field, allowTime, timeFront) { - forEach(loc[field], function(format) { - if (allowTime) { - format = getFormatWithTime(format, timeFront); - } - loc.addFormat(format); - }); - } - - function getFormatWithTime(baseFormat, timeBefore) { - if (timeBefore) { - return getTimeBefore() + baseFormat; - } - return baseFormat + getTimeAfter(); - } - - function getTimeBefore() { - return getRegNonCapturing('{time}[,\\s\\u3000]', true); - } - - function getTimeAfter() { - var markers = ',?[\\s\\u3000]', localized; - localized = arrayToRegAlternates(loc.timeMarkers); - if (localized) { - markers += '| (?:' + localized + ') '; - } - markers = getRegNonCapturing(markers, loc.timeMarkerOptional); - return getRegNonCapturing(markers + '{time}{tzOffset}', true); - } - - initFormats(); - initDefinition(); - initArrayFields(); - - buildValueArray('month', 12); - buildValueArray('weekday', 7); - buildValueArray('unit', 8); - buildValueArray('ampm', 2); - - buildNumerals(); - buildTimeFormats(); - buildParsingTokens(); - buildTimeSuffixes(); - buildModifiers(); - - // The order of these formats is important. Order is reversed so formats - // that are initialized later will take precedence. Generally, this means - // that more specific formats should come later. - addCoreFormats(); - addLocaleFormats(); - - } - - }; - - return new Locale(def); - } - - - /*** - * @method [units]Since(d, [options]) - * @returns Number - * @short Returns the time since [d]. - * @extra [d] will accept a date object, timestamp, or string. If not specified, - * [d] is assumed to be now. `unitsAgo` is provided as an alias to make - * this more readable when [d] is assumed to be the current date. - * [options] can be an object or a locale code as a string. See `create` - * for more. - * - * @set - * millisecondsSince - * secondsSince - * minutesSince - * hoursSince - * daysSince - * weeksSince - * monthsSince - * yearsSince - * - * @example - * - * new Date().millisecondsSince('1 hour ago') -> 3,600,000 - * new Date().daysSince('1 week ago') -> 7 - * new Date().yearsSince('15 years ago') -> 15 - * lastYear.yearsAgo() -> 1 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [units]Ago() - * @returns Number - * @short Returns the time ago in the appropriate unit. - * - * @set - * millisecondsAgo - * secondsAgo - * minutesAgo - * hoursAgo - * daysAgo - * weeksAgo - * monthsAgo - * yearsAgo - * - * @example - * - * lastYear.millisecondsAgo() -> 3,600,000 - * lastYear.daysAgo() -> 7 - * lastYear.yearsAgo() -> 15 - * - *** - * @method [units]Until([d], [options]) - * @returns Number - * @short Returns the time until [d]. - * @extra [d] will accept a date object, timestamp, or string. If not specified, - * [d] is assumed to be now. `unitsFromNow` is provided as an alias to - * make this more readable when [d] is assumed to be the current date. - * [options] can be an object or a locale code as a string. See `create` - * for more. - * - * - * @set - * millisecondsUntil - * secondsUntil - * minutesUntil - * hoursUntil - * daysUntil - * weeksUntil - * monthsUntil - * yearsUntil - * - * @example - * - * new Date().millisecondsUntil('1 hour from now') -> 3,600,000 - * new Date().daysUntil('1 week from now') -> 7 - * new Date().yearsUntil('15 years from now') -> 15 - * nextYear.yearsFromNow() -> 1 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [units]FromNow() - * @returns Number - * @short Returns the time from now in the appropriate unit. - * - * @set - * millisecondsFromNow - * secondsFromNow - * minutesFromNow - * hoursFromNow - * daysFromNow - * weeksFromNow - * monthsFromNow - * yearsFromNow - * - * @example - * - * nextYear.millisecondsFromNow() -> 3,600,000 - * nextYear.daysFromNow() -> 7 - * nextYear.yearsFromNow() -> 15 - * - *** - * @method add[Units](n, [reset] = false) - * @returns Date - * @short Adds `n` units to the date. If [reset] is true, all lower units will - * be reset. - * @extra This method modifies the date! Note that in the case of `addMonths`, - * the date may fall on a date that doesn't exist (i.e. February 30). In - * this case the date will be shifted to the last day of the month. Don't - * use `addMonths` if you need precision. - * - * @set - * addMilliseconds - * addSeconds - * addMinutes - * addHours - * addDays - * addWeeks - * addMonths - * addYears - * - * @example - * - * new Date().addYears(5) -> current time + 5 years - * new Date().addDays(5) -> current time + 5 days - * new Date().addDays(5, true) -> current time + 5 days (time reset) - * - * @param {number} n - * @param {boolean} [reset] - * - *** - * @method isLast[Unit]([localeCode]) - * @returns Boolean - * @short Returns true if the date is last week, month, or year. - * @extra This method takes an optional locale code for `isLastWeek`, which is - * locale dependent. The default locale code is `en`, which places - * Sunday at the beginning of the week. You can pass `en-GB` as a quick - * way to force Monday as the beginning of the week. - * - * @set - * isLastWeek - * isLastMonth - * isLastYear - * - * @example - * - * yesterday.isLastWeek() -> true or false? - * yesterday.isLastMonth() -> probably not... - * yesterday.isLastYear() -> even less likely... - * - * @param {string} [localeCode] - * - *** - * @method isThis[Unit]([localeCode]) - * @returns Boolean - * @short Returns true if the date is this week, month, or year. - * @extra This method takes an optional locale code for `isThisWeek`, which is - * locale dependent. The default locale code is `en`, which places - * Sunday at the beginning of the week. You can pass `en-GB` as a quick - * way to force Monday as the beginning of the week. - * - * @set - * isThisWeek - * isThisMonth - * isThisYear - * - * @example - * - * tomorrow.isThisWeek() -> true or false? - * tomorrow.isThisMonth() -> probably... - * tomorrow.isThisYear() -> signs point to yes... - * - * @param {string} [localeCode] - * - *** - * @method isNext[Unit]([localeCode]) - * @returns Boolean - * @short Returns true if the date is next week, month, or year. - * @extra This method takes an optional locale code for `isNextWeek`, which is - * locale dependent. The default locale code is `en`, which places - * Sunday at the beginning of the week. You can pass `en-GB` as a quick - * way to force Monday as the beginning of the week. - * - * @set - * isNextWeek - * isNextMonth - * isNextYear - * - * @example - * - * tomorrow.isNextWeek() -> true or false? - * tomorrow.isNextMonth() -> probably not... - * tomorrow.isNextYear() -> even less likely... - * - * @param {string} [localeCode] - * - *** - * @method beginningOf[Unit]([localeCode]) - * @returns Date - * @short Sets the date to the beginning of the appropriate unit. - * @extra This method modifies the date! A locale code can be passed for - * `beginningOfWeek`, which is locale dependent. If consistency is - * needed, use `beginningOfISOWeek` instead. - * - * @set - * beginningOfDay - * beginningOfWeek - * beginningOfMonth - * beginningOfYear - * - * @example - * - * new Date().beginningOfDay() -> the beginning of today (resets the time) - * new Date().beginningOfWeek() -> the beginning of the week - * new Date().beginningOfMonth() -> the beginning of the month - * new Date().beginningOfYear() -> the beginning of the year - * - * @param {string} [localeCode] - * - *** - * @method endOf[Unit]([localeCode]) - * @returns Date - * @short Sets the date to the end of the appropriate unit. - * @extra This method modifies the date! A locale code can be passed for - * `endOfWeek`, which is locale dependent. If consistency is needed, use - * `endOfISOWeek` instead. - * - * @set - * endOfDay - * endOfWeek - * endOfMonth - * endOfYear - * - * @example - * - * new Date().endOfDay() -> the end of today (sets the time to 23:59:59.999) - * new Date().endOfWeek() -> the end of the week - * new Date().endOfMonth() -> the end of the month - * new Date().endOfYear() -> the end of the year - * - * @param {string} [localeCode] - * - ***/ - function buildDateUnitMethods() { - - defineInstanceSimilar(sugarDate, DateUnits, function(methods, unit, index) { - var name = unit.name, caps = simpleCapitalize(name); - - if (index > DAY_INDEX) { - forEach(['Last','This','Next'], function(shift) { - methods['is' + shift + caps] = function(d, localeCode) { - return compareDate(d, shift + ' ' + name, 0, localeCode, { locale: 'en' }); - }; - }); - } - if (index > HOURS_INDEX) { - methods['beginningOf' + caps] = function(d, localeCode) { - return moveToBeginningOfUnit(d, index, localeCode); - }; - methods['endOf' + caps] = function(d, localeCode) { - return moveToEndOfUnit(d, index, localeCode); - }; - } - - methods['add' + caps + 's'] = function(d, num, reset) { - return advanceDate(d, name, num, reset); - }; - - var since = function(date, d, options) { - return getTimeDistanceForUnit(date, createDate(d, options, true), unit); - }; - var until = function(date, d, options) { - return getTimeDistanceForUnit(createDate(d, options, true), date, unit); - }; - - methods[name + 'sAgo'] = methods[name + 'sUntil'] = until; - methods[name + 'sSince'] = methods[name + 'sFromNow'] = since; - - }); - - } - - /*** - * @method is[Day]() - * @returns Boolean - * @short Returns true if the date falls on the specified day. - * - * @set - * isToday - * isYesterday - * isTomorrow - * isWeekday - * isWeekend - * isSunday - * isMonday - * isTuesday - * isWednesday - * isThursday - * isFriday - * isSaturday - * - * @example - * - * tomorrow.isToday() -> false - * thursday.isTomorrow() -> ? - * yesterday.isWednesday() -> ? - * today.isWeekend() -> ? - * - *** - * @method isFuture() - * @returns Boolean - * @short Returns true if the date is in the future. - * - * @example - * - * lastWeek.isFuture() -> false - * nextWeek.isFuture() -> true - * - *** - * @method isPast() - * @returns Boolean - * @short Returns true if the date is in the past. - * - * @example - * - * lastWeek.isPast() -> true - * nextWeek.isPast() -> false - * - ***/ - function buildRelativeAliases() { - var special = spaceSplit('Today Yesterday Tomorrow Weekday Weekend Future Past'); - var weekdays = English.weekdays.slice(0, 7); - var months = English.months.slice(0, 12); - var together = special.concat(weekdays).concat(months); - defineInstanceSimilar(sugarDate, together, function(methods, name) { - methods['is'+ name] = function(d) { - return fullCompareDate(d, name); - }; - }); - } - - defineStatic(sugarDate, { - - /*** - * @method create(d, [options]) - * @returns Date - * @static - * @short Alternate date constructor which accepts text formats, a timestamp, - * objects, or another date. - * @extra If no argument is given, the date is assumed to be now. The second - * argument can either be an options object or a locale code as a - * shortcut. For more, see `date parsing`. - * - * @options - * - * locale A locale code to parse the date in. This can also be passed as - * the second argument to this method. Default is the current - * locale, which is `en` if none is set. - * - * past If `true`, ambiguous dates like `Sunday` will be parsed as - * `last Sunday`. Note that non-ambiguous dates are not - * guaranteed to be in the past. - * Default is `false`. - * - * future If `true`, ambiguous dates like `Sunday` will be parsed as - * `next Sunday`. Note that non-ambiguous dates are not - * guaranteed to be in the future. - * Default is `false`. - * - * fromUTC If `true`, dates with no timezone notation will be parsed as - * UTC (no timezone offset). This is useful for server - * timestamps, etc. Note that this flag is not required if the - * timezone is specified in the string, either as an explicit - * value (ex. +0900 or -09:00) or "Z", which is UTC time. - * - * setUTC If `true`, this will set a flag on the date that tells Sugar - * to internally use UTC methods like `getUTCHours` when handling - * it. This flag is the same as calling the `setUTC` method on - * the date after parsing is complete. Note that this is - * different from `fromUTC`, which parses a string as UTC, but - * does not set this flag. - * - * clone If `true` and `d` is a date, it will be cloned. - * - * params An optional object that is populated with properties that are - * parsed from string input. This option is useful when parsed - * properties need to be retained. - * - * @example - * - * Date.create('July') -> July of this year - * Date.create('1776') -> 1776 - * Date.create('today') -> today - * Date.create('Wednesday') -> This wednesday - * Date.create('next Friday') -> Next friday - * Date.create('July 4, 1776') -> July 4, 1776 - * Date.create(-446806800000) -> November 5, 1955 - * Date.create('1776年07月04日', 'ja') -> July 4, 1776 - * Date.create('August', {past: true}) -> August of this or last year - * Date.create('August', {future: true}) -> August of this or next year - * Date.create('Thursday', {fromUTC: true}) -> Thursday at 12:00am UTC time - * - * @param {string|number|Date} d - * @param {DateCreateOptions} [options] - * - * @option {string} [locale] - * @option {boolean} [past] - * @option {boolean} [future] - * @option {boolean} [fromUTC] - * @option {boolean} [setUTC] - * @option {boolean} [clone] - * @option {Object} [params] - * - ***/ - 'create': function(d, options) { - return createDate(d, options); - }, - - /*** - * @method getLocale([localeCode] = current) - * @returns Locale - * @static - * @short Gets the locale object for the given code, or the current locale. - * @extra The locale object has various properties that dictate how dates are - * parsed and formatted for that locale. The locale object is exposed - * here mostly for introspection - it should be uncommon to need to - * maniplate the object itself. For more, see `date locales`. - * - * @example - * - * Date.getLocale() -> Returns the current locale - * Date.getLocale('en') -> Returns the EN locale - * - * @param {string} [localeCode] - * - ***/ - 'getLocale': function(code) { - return localeManager.get(code, !code); - }, - - /*** - * @method getAllLocales() - * @returns Array - * @static - * @short Returns all available locales as an object. - * @extra For more, see `date locales`. - * @example - * - * Date.getAllLocales() - * - ***/ - 'getAllLocales': function() { - return localeManager.getAll(); - }, - - /*** - * @method getAllLocaleCodes() - * @returns string[] - * @static - * @short Returns all available locale codes as an array of strings. - * @extra For more, see `date locales`. - * @example - * - * Date.getAllLocaleCodes() - * - ***/ - 'getAllLocaleCodes': function() { - return getKeys(localeManager.getAll()); - }, - - /*** - * @method setLocale(localeCode) - * @returns Locale - * @static - * @short Sets the current locale to be used with dates. - * @extra Sugar has native support for 17 major locales. In addition, you can - * define a new locale with `addLocale`. For more, see `date locales`. - * @example - * - * Date.setLocale('en') - * - * @param {string} localeCode - * - ***/ - 'setLocale': function(code) { - return localeManager.set(code); - }, - - /*** - * @method addLocale(localeCode, def) - * @returns Locale - * @static - * @short Adds a locale definition to the locales understood by Sugar. - * @extra This method should only be required for adding locale definitions - * that don't already exist. For more, see `date locales`. - * @example - * - * Date.addLocale('eo', {}) - * - * @param {string} localeCode - * @param {Object} def - * - ***/ - 'addLocale': function(code, set) { - return localeManager.add(code, set); - }, - - /*** - * @method removeLocale(localeCode) - * @returns Locale - * @static - * @short Deletes the the locale by `localeCode` from Sugar's known locales. - * @extra For more, see `date locales`. - * @example - * - * Date.removeLocale('foo') - * - * @param {string} localeCode - * - ***/ - 'removeLocale': function(code) { - return localeManager.remove(code); - } - - }); - - defineInstanceWithArguments(sugarDate, { - - /*** - * @method set(set, [reset] = false) - * @returns Date - * @short Sets the date object. - * @extra This method accepts multiple formats including a single number as - * a timestamp, an object, or enumerated arguments. If [reset] is - * `true`, any units more specific than those passed will be reset. - * - * @example - * - * new Date().set({year:2011,month:11,day:31}) -> December 31, 2011 - * new Date().set(2011, 11, 31) -> December 31, 2011 - * new Date().set(86400000) -> 1 day after Jan 1, 1970 - * new Date().set({year:2004,month:6}, true) -> June 1, 2004, 00:00:00.000 - * - * @signature set(milliseconds) - * @signature set(year, month, [day], [hour], [minute], [second], [millliseconds]) - * @param {Object} set - * @param {boolean} [reset] - * @param {number} year - * @param {number} month - * @param {number} [day] - * @param {number} [hour] - * @param {number} [minute] - * @param {number} [second] - * @param {number} [milliseconds] - * - ***/ - 'set': function(d, args) { - args = collectUpdateDateArguments(args); - return updateDate(d, args[0], args[1]); - }, - - /*** - * @method advance(set, [reset] = false) - * @returns Date - * @short Shifts the date forward. - * @extra `set` accepts multiple formats including an object, a string in the - * format "3 days", a single number as milliseconds, or enumerated - * parameters (as with the Date constructor). If [reset] is `true`, any - * units more specific than those passed will be reset. This method - * modifies the date! - * - * @example - * - * new Date().advance({ year: 2 }) -> 2 years in the future - * new Date().advance('2 hours') -> 2 hours in the future - * new Date().advance(0, 2, 3) -> 2 months 3 days in the future - * new Date().advance(86400000) -> 1 day in the future - * - * @signature advance(milliseconds) - * @signature advance(year, month, [day], [hour], [minute], [second], [millliseconds]) - * @param {string|Object} set - * @param {boolean} [reset] - * @param {number} year - * @param {number} month - * @param {number} [day] - * @param {number} [hour] - * @param {number} [minute] - * @param {number} [second] - * @param {number} [milliseconds] - * - ***/ - 'advance': function(d, args) { - return advanceDateWithArgs(d, args, 1); - }, - - /*** - * @method rewind(set, [reset] = false) - * @returns Date - * @short Shifts the date backward. - * @extra [set] accepts multiple formats including an object, a string in the - * format "3 days", a single number as milliseconds, or enumerated - * parameters (as with the Date constructor). If [reset] is `true`, any - * units more specific than those passed will be reset. This method - * modifies the date! - * - * @example - * - * new Date().rewind({ year: 2 }) -> 2 years in the past - * new Date().rewind('2 weeks') -> 2 weeks in the past - * new Date().rewind(0, 2, 3) -> 2 months 3 days in the past - * new Date().rewind(86400000) -> 1 day in the past - * - * @signature advance(milliseconds) - * @signature advance(year, month, [day], [hour], [minute], [second], [millliseconds]) - * @param {string|Object} set - * @param {boolean} [reset] - * @param {number} year - * @param {number} month - * @param {number} [day] - * @param {number} [hour] - * @param {number} [minute] - * @param {number} [second] - * @param {number} [milliseconds] - * - ***/ - 'rewind': function(d, args) { - return advanceDateWithArgs(d, args, -1); - } - - }); - - defineInstance(sugarDate, { - - /*** - * @method get(d, [options]) - * @returns Date - * @short Gets a new date using the current one as a starting point. - * @extra This method is identical to `Date.create`, except that relative - * formats like `next month` are relative to the date instance rather - * than the current date. Accepts a locale code as a string in place - * of [options]. See `create` for more. - * - * @example - * - * nextYear.get('monday') -> monday of the week exactly 1 year from now - * millenium.get('2 years before') -> 2 years before Jan 1, 2000. - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - ***/ - 'get': function(date, d, options) { - return createDateWithContext(date, d, options); - }, - - /*** - * @method setWeekday(dow) - * @short Sets the weekday of the date, starting with Sunday at `0`. - * @extra This method modifies the date! - * - * @example - * - * d = new Date(); d.setWeekday(1); d; -> Monday of this week - * d = new Date(); d.setWeekday(6); d; -> Saturday of this week - * - * @param {number} dow - * - ***/ - 'setWeekday': function(date, dow) { - return setWeekday(date, dow); - }, - - /*** - * @method setISOWeek(num) - * @short Sets the week (of the year) as defined by the ISO8601 standard. - * @extra Note that this standard places Sunday at the end of the week (day 7). - * This method modifies the date! - * - * @example - * - * d = new Date(); d.setISOWeek(15); d; -> 15th week of the year - * - * @param {number} num - * - ***/ - 'setISOWeek': function(date, num) { - return setISOWeekNumber(date, num); - }, - - /*** - * @method getISOWeek() - * @returns Number - * @short Gets the date's week (of the year) as defined by the ISO8601 standard. - * @extra Note that this standard places Sunday at the end of the week (day 7). - * If `utc` is set on the date, the week will be according to UTC time. - * - * @example - * - * new Date().getISOWeek() -> today's week of the year - * - ***/ - 'getISOWeek': function(date) { - return getWeekNumber(date, true); - }, - - /*** - * @method beginningOfISOWeek() - * @returns Date - * @short Set the date to the beginning of week as defined by ISO8601. - * @extra Note that this standard places Monday at the start of the week. - * This method modifies the date! - * - * @example - * - * new Date().beginningOfISOWeek() -> Monday - * - ***/ - 'beginningOfISOWeek': function(date) { - var day = getWeekday(date); - if (day === 0) { - day = -6; - } else if (day !== 1) { - day = 1; - } - setWeekday(date, day); - return resetTime(date); - }, - - /*** - * @method endOfISOWeek() - * @returns Date - * @short Set the date to the end of week as defined by this ISO8601 standard. - * @extra Note that this standard places Sunday at the end of the week. - * This method modifies the date! - * - * @example - * - * new Date().endOfISOWeek() -> Sunday - * - ***/ - 'endOfISOWeek': function(date) { - if (getWeekday(date) !== 0) { - setWeekday(date, 7); - } - return moveToEndOfUnit(date, DAY_INDEX); - }, - - /*** - * @method getUTCOffset([iso] = false) - * @returns String - * @short Returns a string representation of the offset from UTC time. If [iso] - * is true the offset will be in ISO8601 format. - * - * @example - * - * new Date().getUTCOffset() -> "+0900" - * new Date().getUTCOffset(true) -> "+09:00" - * - * @param {boolean} iso - * - ***/ - 'getUTCOffset': function(date, iso) { - return getUTCOffset(date, iso); - }, - - /*** - * @method setUTC([on] = false) - * @returns Date - * @short Controls a flag on the date that tells Sugar to internally use UTC - * methods like `getUTCHours`. - * @extra This flag is most commonly used for output in UTC time with the - * `format` method. Note that this flag only governs which native - * methods are called internally – date native methods like `setHours` - * will still return local non-UTC values. Also note that other date - * operations such as comparison and subtraction still work as normal. - * This effectively makes it not meaningful to use date comparison - * methods like `isBefore` or difference methods like `hoursBefore` - * unless these flags are both the same, as the date is not actually - * in UTC time. If such a usage is required, the timezone offset should - * instead be manually subtracted. This method will modify the date! - * - * @example - * - * new Date().setUTC(true).long() -> formatted with UTC methods - * new Date().setUTC(false).long() -> formatted without UTC methods - * - * @param {boolean} on - * - ***/ - 'setUTC': function(date, on) { - return _utc(date, on); - }, - - /*** - * @method isUTC() - * @returns Boolean - * @short Returns true if the date has no timezone offset. - * @extra This will also return true for dates whose internal utc flag is set - * with `setUTC`. Even if the utc flag is set, `getTimezoneOffset` - * will always report the same thing as Javascript always reports that - * based on the environment's locale. - * - * @example - * - * new Date().isUTC() -> true or false (depends on the local offset) - * new Date().setUTC(true).isUTC() -> true - * - ***/ - 'isUTC': function(date) { - return isUTC(date); - }, - - /*** - * @method isValid() - * @returns Boolean - * @short Returns true if the date is valid. - * - * @example - * - * new Date().isValid() -> true - * new Date('flexor').isValid() -> false - * - ***/ - 'isValid': function(date) { - return dateIsValid(date); - }, - - /*** - * @method isAfter(d, [margin] = 0) - * @returns Boolean - * @short Returns true if the date is after `d`. - * @extra [margin] is to allow extra margin of error in ms. `d` will accept - * a date object, timestamp, or string. If not specified, `d` is - * assumed to be now. See `create` for formats. - * - * @example - * - * today.isAfter('tomorrow') -> false - * today.isAfter('yesterday') -> true - * - * @param {string|number|Date} d - * @param {number} [margin] - * - ***/ - 'isAfter': function(date, d, margin) { - return date.getTime() > createDate(d).getTime() - (margin || 0); - }, - - /*** - * @method isBefore(d, [margin] = 0) - * @returns Boolean - * @short Returns true if the date is before `d`. - * @extra [margin] is to allow extra margin of error in ms. `d` will accept - * a date object, timestamp, or text format. If not specified, `d` is - * assumed to be now. See `create` for formats. - * - * @example - * - * today.isBefore('tomorrow') -> true - * today.isBefore('yesterday') -> false - * - * @param {string|number|Date} d - * @param {number} [margin] - * - ***/ - 'isBefore': function(date, d, margin) { - return date.getTime() < createDate(d).getTime() + (margin || 0); - }, - - /*** - * @method isBetween(d1, d2, [margin] = 0) - * @returns Boolean - * @short Returns true if the date is later or equal to `d1` and before or - * equal to `d2`. - * @extra [margin] is to allow extra margin of error in ms. `d1` and `d2` will - * accept a date object, timestamp, or text format. If not specified, - * they are assumed to be now. See `create` for formats. - * - * @example - * - * new Date().isBetween('yesterday', 'tomorrow') -> true - * new Date().isBetween('last year', '2 years ago') -> false - * - * @param {string|number|Date} d1 - * @param {string|number|Date} d2 - * @param {number} [margin] - * - ***/ - 'isBetween': function(date, d1, d2, margin) { - var t = date.getTime(); - var t1 = createDate(d1).getTime(); - var t2 = createDate(d2).getTime(); - var lo = min(t1, t2); - var hi = max(t1, t2); - margin = margin || 0; - return (lo - margin <= t) && (hi + margin >= t); - }, - - /*** - * @method isLeapYear() - * @returns Boolean - * @short Returns true if the date is a leap year. - * - * @example - * - * millenium.isLeapYear() -> true - * - ***/ - 'isLeapYear': function(date) { - var year = getYear(date); - return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); - }, - - /*** - * @method daysInMonth() - * @returns Number - * @short Returns the number of days in the date's month. - * - * @example - * - * may.daysInMonth() -> 31 - * feb.daysInMonth() -> 28 or 29 - * - ***/ - 'daysInMonth': function(date) { - return getDaysInMonth(date); - }, - - /*** - * @method format([f], [localeCode] = currentLocaleCode) - * @returns String - * @short Returns the date as a string using the format `f`. - * @extra `f` is a string that contains tokens in either LDML format using - * curly braces, or "strftime" format using a percent sign. If `f` is - * not specified, the locale specific `{long}` format is used. [localeCode] - * is a locale code to use (if not specified the current locale is - * used). For more, see `date formatting`. - * - * @example - * - * new Date().format() -> ex. February 13, 2012 11:21 AM - * new Date().format('{Weekday} {d} {Month}') -> ex. Monday July 4 - * new Date().format('{hh}:{mm}') -> ex. 15:57 - * new Date().format('%H:%M') -> ex. 15:57 - * new Date().format('{12hr}:{mm}{tt}') -> ex. 3:57pm - * new Date().format('ISO8601') -> ex. 2011-07-05 12:24:55.528Z - * new Date().format('{Weekday}', 'ja') -> ex. 先週 - * - * @param {string} f - * @param {string} [localeCode] - * - *** - * @method short([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the short format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().short() -> ex. 02/13/2016 - * new Date().short('fi') -> ex. 13.2.2016 - * - * @param {string} [localeCode] - * - *** - * @method medium([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the medium format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().medium() -> ex. February 13, 2016 - * new Date().medium('ja') -> ex. 2016年2月13日 - * - * @param {string} [localeCode] - * - *** - * @method long([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the long format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().long() -> ex. February 13, 2016 6:22 PM - * new Date().long('es') -> ex. 13 de febrero de 2016 18:22 - * - * @param {string} [localeCode] - * - *** - * @method full([localeCode] = currentLocaleCode) - * @returns String - * @short Outputs the date in the full format for the current locale. - * @extra [localeCode] overrides the current locale code if passed. - * - * @example - * - * new Date().full() -> ex. Saturday, February 13, 2016 6:23 PM - * new Date().full('ru') -> ex. суббота, 13 февраля 2016 г., 18:23 - * - * @param {string} [localeCode] - * - ***/ - 'format': function(date, f, localeCode) { - return dateFormat(date, f, localeCode); - }, - - /*** - * @method relative([localeCode] = currentLocaleCode, [relativeFn]) - * @returns String - * @short Returns the date in a text format relative to the current time, - * such as "5 minutes ago". - * @extra [relativeFn] is a function that can be passed to provide more granular - * control over the resulting string. Its return value will be passed - * to `format`. If nothing is returned, the relative format will be - * used. [relativeFn] can be passed as the first argument in place of - * [locale]. For more about formats, see `date formatting`. - * - * @callback relativeFn - * - * num The offset number in `unit`. - * unit A numeric representation of the unit that `num` is in, starting at - * 0 for ms. - * ms The absolute offset in milliseconds. - * loc The locale object, either specified by [locale] or default. - * - * @example - * - * hourAgo.relative() -> 1 hour ago - * jan.relative() -> ex. 5 months ago - * jan.relative('ja') -> 3ヶ月前 - * jan.relative(function(num, unit, ms, loc) { - * // Return an absolute date for anything over 6 months. - * if(unit == 6 && num > 6 || unit > 6) { - * return '{Month} {d}, {yyyy}'; - * } - * }); -> ex. 5 months ago - * - * @signature relative([relativeFn]) - * @param {string} [localeCode] - * @param {relativeFn} [relativeFn] - * @callbackParam {number} num - * @callbackParam {number} unit - * @callbackParam {number} ms - * @callbackParam {Locale} loc - * @callbackReturns {string} relativeFn - * - ***/ - 'relative': function(date, localeCode, relativeFn) { - return dateRelative(date, null, localeCode, relativeFn); - }, - - /*** - * @method relativeTo(d, [localeCode] = currentLocaleCode) - * @returns String - * @short Returns the date in a text format relative to `d`, such as - * "5 minutes". - * @extra `d` will accept a date object, timestamp, or string. [localeCode] - * applies to the method output, not `d`. - * - * @example - * - * jan.relativeTo(jul) -> 5 months - * yesterday.relativeTo('today', 'ja') -> 一日 - * - * @param {string|number|Date} d - * @param {string} localeCode - * - * - ***/ - 'relativeTo': function(date, d, localeCode) { - return dateRelative(date, createDate(d), localeCode); - }, - - /*** - * @method is(d, [margin] = 0) - * @returns Boolean - * @short Returns true if the date matches `d`. - * @extra `d` will accept a date object, timestamp, or text format. In the - * case of objects and text formats, `is` will additionally compare - * based on the precision implied in the input. In the case of text - * formats `d` will use the currently set locale. [margin] allows an - * extra margin of error in milliseconds. See `create` for formats. - * - * @example - * - * new Date().is('July') -> true or false? - * new Date().is('1776') -> false - * new Date().is('today') -> true - * new Date().is('weekday') -> true or false? - * new Date().is('July 4, 1776') -> false - * new Date().is(-6106093200000) -> false - * new Date().is(new Date(1776, 6, 4)) -> false - * - * @param {string|number|Date} d - * @param {number} [margin] - * - ***/ - 'is': function(date, d, margin) { - return fullCompareDate(date, d, margin); - }, - - /*** - * @method reset([unit] = 'day', [localeCode] = currentLocaleCode) - * @returns Date - * @short Resets the date to the beginning of [unit]. - * @extra This method effectively resets all smaller units, pushing the date - * to the beginning of [unit]. Default is `day`, which effectively - * resets the time. [localeCode] is provided for resetting weeks, which - * is locale dependent. This method modifies the date! - * - * @example - * - * new Date().reset('day') -> Beginning of the day - * new Date().reset('month') -> Beginning of the month - * - * @param {string} [unit] - * @param {string} [localeCode] - * - ***/ - 'reset': function(date, unit, localeCode) { - var unitIndex = unit ? getUnitIndexForParamName(unit) : DAY_INDEX; - moveToBeginningOfUnit(date, unitIndex, localeCode); - return date; - }, - - /*** - * @method clone() - * @returns Date - * @short Clones the date. - * @extra Note that the UTC flag will be preserved if set. This flag is - * set via the `setUTC` method or an option on `Date.create`. - * - * @example - * - * new Date().clone() -> Copy of now - * - ***/ - 'clone': function(date) { - return cloneDate(date); - }, - - /*** - * @method iso() - * @alias toISOString - * - ***/ - 'iso': function(date) { - return date.toISOString(); - }, - - /*** - * @method getWeekday() - * @returns Number - * @short Alias for `getDay`. - * - * @example - * - * new Date().getWeekday(); -> (ex.) 3 - * - ***/ - 'getWeekday': function(date) { - return getWeekday(date); - }, - - /*** - * @method getUTCWeekday() - * @returns Number - * @short Alias for `getUTCDay`. - * - * @example - * - * new Date().getUTCWeekday(); -> (ex.) 3 - * - ***/ - 'getUTCWeekday': function(date) { - return date.getUTCDay(); - } - - }); - - - /*** @namespace Number ***/ - - /*** - * @method [dateUnit]() - * @returns Number - * @short Takes the number as a unit of time and converts to milliseconds. - * @extra Method names can be singular or plural. Note that as "a month" is - * ambiguous as a unit of time, `months` will be equivalent to 30.4375 - * days, the average number in a month. Be careful using `months` if you - * need exact precision. - * - * @set - * millisecond - * milliseconds - * second - * seconds - * minute - * minutes - * hour - * hours - * day - * days - * week - * weeks - * month - * months - * year - * years - * - * @example - * - * (5).milliseconds() -> 5 - * (10).hours() -> 36000000 - * (1).day() -> 86400000 - * - *** - * @method [dateUnit]Before(d, [options]) - * @returns Date - * @short Returns a date that is `n` units before [d], where `n` is the number. - * @extra [d] will accept a date object, timestamp, or text format. Note that - * "months" is ambiguous as a unit of time. If the target date falls on a - * day that does not exist (i.e. August 31 -> February 31), the date will - * be shifted to the last day of the month. Be careful using - * `monthsBefore` if you need exact precision. [options] can be an object - * or a locale code as a string. See `create` for more. - * - * - * @set - * millisecondBefore - * millisecondsBefore - * secondBefore - * secondsBefore - * minuteBefore - * minutesBefore - * hourBefore - * hoursBefore - * dayBefore - * daysBefore - * weekBefore - * weeksBefore - * monthBefore - * monthsBefore - * yearBefore - * yearsBefore - * - * @example - * - * (5).daysBefore('tuesday') -> 5 days before tuesday of this week - * (1).yearBefore('January 23, 1997') -> January 23, 1996 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [dateUnit]Ago() - * @returns Date - * @short Returns a date that is `n` units ago. - * @extra Note that "months" is ambiguous as a unit of time. If the target date - * falls on a day that does not exist (i.e. August 31 -> February 31), the - * date will be shifted to the last day of the month. Be careful using - * `monthsAgo` if you need exact precision. - * - * @set - * millisecondAgo - * millisecondsAgo - * secondAgo - * secondsAgo - * minuteAgo - * minutesAgo - * hourAgo - * hoursAgo - * dayAgo - * daysAgo - * weekAgo - * weeksAgo - * monthAgo - * monthsAgo - * yearAgo - * yearsAgo - * - * @example - * - * (5).weeksAgo() -> 5 weeks ago - * (1).yearAgo() -> January 23, 1996 - * - *** - * @method [dateUnit]After(d, [options]) - * @returns Date - * @short Returns a date `n` units after [d], where `n` is the number. - * @extra [d] will accept a date object, timestamp, or text format. Note that - * "months" is ambiguous as a unit of time. If the target date falls on a - * day that does not exist (i.e. August 31 -> February 31), the date will - * be shifted to the last day of the month. Be careful using - * `monthsAfter` if you need exact precision. [options] can be an object - * or a locale code as a string. See `create` for more. - * - * @set - * millisecondAfter - * millisecondsAfter - * secondAfter - * secondsAfter - * minuteAfter - * minutesAfter - * hourAfter - * hoursAfter - * dayAfter - * daysAfter - * weekAfter - * weeksAfter - * monthAfter - * monthsAfter - * yearAfter - * yearsAfter - * - * @example - * - * (5).daysAfter('tuesday') -> 5 days after tuesday of this week - * (1).yearAfter('January 23, 1997') -> January 23, 1998 - * - * @param {string|number|Date} d - * @param {DateCreateOptions} options - * - *** - * @method [dateUnit]FromNow() - * @returns Date - * @short Returns a date `n` units from now. - * @extra Note that "months" is ambiguous as a unit of time. If the target date - * falls on a day that does not exist (i.e. August 31 -> February 31), the - * date will be shifted to the last day of the month. Be careful using - * `monthsFromNow` if you need exact precision. - * - * @set - * millisecondFromNow - * millisecondsFromNow - * secondFromNow - * secondsFromNow - * minuteFromNow - * minutesFromNow - * hourFromNow - * hoursFromNow - * dayFromNow - * daysFromNow - * weekFromNow - * weeksFromNow - * monthFromNow - * monthsFromNow - * yearFromNow - * yearsFromNow - * - * @example - * - * (5).weeksFromNow() -> 5 weeks ago - * (1).yearFromNow() -> January 23, 1998 - * - ***/ - function buildNumberUnitMethods() { - defineInstanceSimilar(sugarNumber, DateUnits, function(methods, unit) { - var name = unit.name, base, after, before; - base = function(n) { - return round(n * unit.multiplier); - }; - after = function(n, d, options) { - return advanceDate(createDate(d, options, true), name, n); - }; - before = function(n, d, options) { - return advanceDate(createDate(d, options, true), name, -n); - }; - methods[name] = base; - methods[name + 's'] = base; - methods[name + 'Before'] = before; - methods[name + 'sBefore'] = before; - methods[name + 'Ago'] = before; - methods[name + 'sAgo'] = before; - methods[name + 'After'] = after; - methods[name + 'sAfter'] = after; - methods[name + 'FromNow'] = after; - methods[name + 'sFromNow'] = after; - }); - } - - defineInstance(sugarNumber, { - - /*** - * @method duration([localeCode] = currentLocaleCode) - * @returns String - * @short Takes the number as milliseconds and returns a localized string. - * @extra This method is the same as `Date#relative` without the localized - * equivalent of "from now" or "ago". [localeCode] can be passed as the - * first (and only) parameter. Note that this method is only available - * when the dates module is included. - * - * @example - * - * (500).duration() -> '500 milliseconds' - * (1200).duration() -> '1 second' - * (75).minutes().duration() -> '1 hour' - * (75).minutes().duration('es') -> '1 hora' - * - * @param {string} [localeCode] - * - ***/ - 'duration': function(n, localeCode) { - return localeManager.get(localeCode).getDuration(n); - } - - }); - - - var EnglishLocaleBaseDefinition = { - 'code': 'en', - 'plural': true, - 'timeMarkers': 'at', - 'ampm': 'AM|A.M.|a,PM|P.M.|p', - 'units': 'millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s', - 'months': 'Jan:uary|,Feb:ruary|,Mar:ch|,Apr:il|,May,Jun:e|,Jul:y|,Aug:ust|,Sep:tember|t|,Oct:ober|,Nov:ember|,Dec:ember|', - 'weekdays': 'Sun:day|,Mon:day|,Tue:sday|,Wed:nesday|,Thu:rsday|,Fri:day|,Sat:urday|+weekend', - 'numerals': 'zero,one|first,two|second,three|third,four:|th,five|fifth,six:|th,seven:|th,eight:|h,nin:e|th,ten:|th', - 'articles': 'a,an,the', - 'tokens': 'the,st|nd|rd|th,of|in,a|an,on', - 'time': '{H}:{mm}', - 'past': '{num} {unit} {sign}', - 'future': '{num} {unit} {sign}', - 'duration': '{num} {unit}', - 'modifiers': [ - { 'name': 'half', 'src': 'half', 'value': .5 }, - { 'name': 'midday', 'src': 'noon', 'value': 12 }, - { 'name': 'midday', 'src': 'midnight', 'value': 24 }, - { 'name': 'day', 'src': 'yesterday', 'value': -1 }, - { 'name': 'day', 'src': 'today|tonight', 'value': 0 }, - { 'name': 'day', 'src': 'tomorrow', 'value': 1 }, - { 'name': 'sign', 'src': 'ago|before', 'value': -1 }, - { 'name': 'sign', 'src': 'from now|after|from|in|later', 'value': 1 }, - { 'name': 'edge', 'src': 'first day|first|beginning', 'value': -2 }, - { 'name': 'edge', 'src': 'last day', 'value': 1 }, - { 'name': 'edge', 'src': 'end|last', 'value': 2 }, - { 'name': 'shift', 'src': 'last', 'value': -1 }, - { 'name': 'shift', 'src': 'the|this', 'value': 0 }, - { 'name': 'shift', 'src': 'next', 'value': 1 } - ], - 'parse': [ - '(?:just)? now', - '{shift} {unit:5-7}', - '{months?} {year}', - '{midday} {4?} {day|weekday}', - '{months},?[-.\\/\\s]?{year?}', - '{edge} of (?:day)? {day|weekday}', - '{0} {num}{1?} {weekday} {2} {months},? {year?}', - '{shift?} {day?} {weekday?} (?:at)? {midday}', - '{sign?} {3?} {half} {3?} {unit:3-4|unit:7} {sign?}', - '{0?} {edge} {weekday?} {2} {shift?} {unit:4-7?} {months?},? {year?}' - ], - 'timeParse': [ - '{day|weekday}', - '{shift} {unit:5?} {weekday}', - '{0?} {date}{1?} {2?} {months?}', - '{weekday} {2?} {shift} {unit:5}', - '{0?} {num} {2?} {months}\\.?,? {year?}', - '{num?} {unit:4-5} {sign} {day|weekday}', - '{0|months} {date?}{1?} of {shift} {unit:6-7}', - '{0?} {num}{1?} {weekday} of {shift} {unit:6}', - '{year?}[-.\\/\\s]?{months}[-.\\/\\s]{date}', - '{date}[-.\\/\\s]{months}(?:[-.\\/\\s]{year|yy})?', - '{weekday?}\\.?,? {months}\\.?,? {date}{1?},? {year?}', - '{weekday?}\\.?,? {date} {months} {year}' - ], - 'timeFrontParse': [ - '{sign} {num} {unit}', - '{num} {unit} {sign}', - '{4?} {day|weekday}' - ] - }; - - var AmericanEnglishDefinition = getEnglishVariant({ - 'mdy': true, - 'firstDayOfWeek': 0, - 'firstDayOfWeekYear': 1, - 'short': '{MM}/{dd}/{yyyy}', - 'medium': '{Month} {d}, {yyyy}', - 'long': '{Month} {d}, {yyyy} {time}', - 'full': '{Weekday}, {Month} {d}, {yyyy} {time}', - 'stamp': '{Dow} {Mon} {d} {yyyy} {time}', - 'time': '{h}:{mm} {TT}' - }); - - var BritishEnglishDefinition = getEnglishVariant({ - 'short': '{dd}/{MM}/{yyyy}', - 'medium': '{d} {Month} {yyyy}', - 'long': '{d} {Month} {yyyy} {H}:{mm}', - 'full': '{Weekday}, {d} {Month}, {yyyy} {time}', - 'stamp': '{Dow} {d} {Mon} {yyyy} {time}' - }); - - var CanadianEnglishDefinition = getEnglishVariant({ - 'short': '{yyyy}-{MM}-{dd}', - 'medium': '{d} {Month}, {yyyy}', - 'long': '{d} {Month}, {yyyy} {H}:{mm}', - 'full': '{Weekday}, {d} {Month}, {yyyy} {time}', - 'stamp': '{Dow} {d} {Mon} {yyyy} {time}' - }); - - var LazyLoadedLocales = { - 'en-US': AmericanEnglishDefinition, - 'en-GB': BritishEnglishDefinition, - 'en-AU': BritishEnglishDefinition, - 'en-CA': CanadianEnglishDefinition - }; - - buildLocales(); - buildDateFormatTokens(); - buildDateFormatMatcher(); - buildDateUnitMethods(); - buildNumberUnitMethods(); - buildRelativeAliases(); - setDateChainableConstructor(); - - /*** - * @module String - * @description String manupulation, encoding, truncation, and formatting, and more. - * - ***/ - - // Flag allowing native string methods to be enhanced. - var STRING_ENHANCEMENTS_FLAG = 'enhanceString'; - - // Matches non-punctuation characters except apostrophe for capitalization. - var CAPITALIZE_REG = /[^\u0000-\u0040\u005B-\u0060\u007B-\u007F]+('s)?/g; - - // Regex matching camelCase. - var CAMELIZE_REG = /(^|_)([^_]+)/g; - - // Regex matching any HTML entity. - var HTML_ENTITY_REG = /&#?(x)?([\w\d]{0,5});/gi; - - // Very basic HTML escaping regex. - var HTML_ESCAPE_REG = /[&<>]/g; - - // Special HTML entities. - var HTMLFromEntityMap = { - 'lt': '<', - 'gt': '>', - 'amp': '&', - 'nbsp': ' ', - 'quot': '"', - 'apos': "'" - }; - - var HTMLToEntityMap; - - // Words that should not be capitalized in titles - var DOWNCASED_WORDS = [ - 'and', 'or', 'nor', 'a', 'an', 'the', 'so', 'but', 'to', 'of', 'at', - 'by', 'from', 'into', 'on', 'onto', 'off', 'out', 'in', 'over', - 'with', 'for' - ]; - - // HTML tags that do not have inner content. - var HTML_VOID_ELEMENTS = [ - 'area','base','br','col','command','embed','hr','img', - 'input','keygen','link','meta','param','source','track','wbr' - ]; - - var LEFT_TRIM_REG = RegExp('^['+ TRIM_CHARS +']+'); - var RIGHT_TRIM_REG = RegExp('['+ TRIM_CHARS +']+$'); - var TRUNC_REG = RegExp('(?=[' + TRIM_CHARS + '])'); - - // Reference to native String#includes to enhance later. - var nativeIncludes = String.prototype.includes; - - // Base64 - var encodeBase64, decodeBase64; - - // Format matcher for String#format. - var stringFormatMatcher = createFormatMatcher(deepGetProperty); - - function padString(num, padding) { - return repeatString(isDefined(padding) ? padding : ' ', num); - } - - function truncateString(str, length, from, ellipsis, split) { - var str1, str2, len1, len2; - if (str.length <= length) { - return str.toString(); - } - ellipsis = isUndefined(ellipsis) ? '...' : ellipsis; - switch(from) { - case 'left': - str2 = split ? truncateOnWord(str, length, true) : str.slice(str.length - length); - return ellipsis + str2; - case 'middle': - len1 = ceil(length / 2); - len2 = floor(length / 2); - str1 = split ? truncateOnWord(str, len1) : str.slice(0, len1); - str2 = split ? truncateOnWord(str, len2, true) : str.slice(str.length - len2); - return str1 + ellipsis + str2; - default: - str1 = split ? truncateOnWord(str, length) : str.slice(0, length); - return str1 + ellipsis; - } - } - - function stringEach(str, search, fn) { - var chunks, chunk, reg, result = []; - if (isFunction(search)) { - fn = search; - reg = /[\s\S]/g; - } else if (!search) { - reg = /[\s\S]/g; - } else if (isString(search)) { - reg = RegExp(escapeRegExp(search), 'gi'); - } else if (isRegExp(search)) { - reg = RegExp(search.source, getRegExpFlags(search, 'g')); - } - // Getting the entire array of chunks up front as we need to - // pass this into the callback function as an argument. - chunks = runGlobalMatch(str, reg); - - if (chunks) { - for(var i = 0, len = chunks.length, r; i < len; i++) { - chunk = chunks[i]; - result[i] = chunk; - if (fn) { - r = fn.call(str, chunk, i, chunks); - if (r === false) { - break; - } else if (isDefined(r)) { - result[i] = r; - } - } - } - } - return result; - } - - // "match" in < IE9 has enumable properties that will confuse for..in - // loops, so ensure that the match is a normal array by manually running - // "exec". Note that this method is also slightly more performant. - function runGlobalMatch(str, reg) { - var result = [], match, lastLastIndex; - while ((match = reg.exec(str)) != null) { - if (reg.lastIndex === lastLastIndex) { - reg.lastIndex += 1; - } else { - result.push(match[0]); - } - lastLastIndex = reg.lastIndex; - } - return result; - } - - function eachWord(str, fn) { - return stringEach(trim(str), /\S+/g, fn); - } - - function stringCodes(str, fn) { - var codes = new Array(str.length), i, len; - for(i = 0, len = str.length; i < len; i++) { - var code = str.charCodeAt(i); - codes[i] = code; - if (fn) { - fn.call(str, code, i, str); - } - } - return codes; - } - - function stringUnderscore(str) { - var areg = Inflections.acronyms && Inflections.acronyms.reg; - // istanbul ignore if - if (areg) { - str = str.replace(areg, function(acronym, index) { - return (index > 0 ? '_' : '') + acronym.toLowerCase(); - }) - } - return str - .replace(/[-\s]+/g, '_') - .replace(/([A-Z\d]+)([A-Z][a-z])/g,'$1_$2') - .replace(/([a-z\d])([A-Z])/g,'$1_$2') - .toLowerCase(); - } - - function stringCamelize(str, upper) { - str = stringUnderscore(str); - return str.replace(CAMELIZE_REG, function(match, pre, word, index) { - var cap = upper !== false || index > 0, acronym; - acronym = getAcronym(word); - // istanbul ignore if - if (acronym && cap) { - return acronym; - } - return cap ? stringCapitalize(word, true) : word; - }); - } - - function stringSpacify(str) { - return stringUnderscore(str).replace(/_/g, ' '); - } - - function stringCapitalize(str, downcase, all) { - if (downcase) { - str = str.toLowerCase(); - } - return all ? str.replace(CAPITALIZE_REG, simpleCapitalize) : simpleCapitalize(str); - } - - function stringTitleize(str) { - var fullStopPunctuation = /[.:;!]$/, lastHadPunctuation; - str = runHumanRules(str); - str = stringSpacify(str); - return eachWord(str, function(word, index, words) { - word = getHumanWord(word) || word; - word = getAcronym(word) || word; - var hasPunctuation, isFirstOrLast; - var first = index == 0, last = index == words.length - 1; - hasPunctuation = fullStopPunctuation.test(word); - isFirstOrLast = first || last || hasPunctuation || lastHadPunctuation; - lastHadPunctuation = hasPunctuation; - if (isFirstOrLast || indexOf(DOWNCASED_WORDS, word) === -1) { - return stringCapitalize(word, false, true); - } else { - return word; - } - }).join(' '); - } - - function stringParameterize(str, separator) { - if (separator === undefined) separator = '-'; - str = str.replace(/[^a-z0-9\-_]+/gi, separator); - if (separator) { - var reg = RegExp('^{s}+|{s}+$|({s}){s}+'.split('{s}').join(escapeRegExp(separator)), 'g'); - str = str.replace(reg, '$1'); - } - return encodeURI(str.toLowerCase()); - } - - function reverseString(str) { - return str.split('').reverse().join(''); - } - - function truncateOnWord(str, limit, fromLeft) { - if (fromLeft) { - return reverseString(truncateOnWord(reverseString(str), limit)); - } - var words = str.split(TRUNC_REG); - var count = 0; - return filter(words, function(word) { - count += word.length; - return count <= limit; - }).join(''); - } - - function unescapeHTML(str) { - return str.replace(HTML_ENTITY_REG, function(full, hex, code) { - var special = HTMLFromEntityMap[code]; - return special || chr(hex ? parseInt(code, 16) : +code); - }); - } - - function tagIsVoid(tag) { - return indexOf(HTML_VOID_ELEMENTS, tag.toLowerCase()) !== -1; - } - - function stringReplaceAll(str, f, replace) { - var i = 0, tokens; - if (isString(f)) { - f = RegExp(escapeRegExp(f), 'g'); - } else if (f && !f.global) { - f = RegExp(f.source, getRegExpFlags(f, 'g')); - } - if (!replace) { - replace = ''; - } else { - tokens = replace; - replace = function() { - var t = tokens[i++]; - return t != null ? t : ''; - }; - } - return str.replace(f, replace); - } - - function replaceTags(str, find, replacement, strip) { - var tags = isString(find) ? [find] : find, reg, src; - tags = map(tags || [], function(t) { - return escapeRegExp(t); - }).join('|'); - src = tags.replace('all', '') || '[^\\s>]+'; - src = '<(\\/)?(' + src + ')(\\s+[^<>]*?)?\\s*(\\/)?>'; - reg = RegExp(src, 'gi'); - return runTagReplacements(str.toString(), reg, strip, replacement); - } - - function runTagReplacements(str, reg, strip, replacement, fullString) { - - var match; - var result = ''; - var currentIndex = 0; - var openTagName; - var openTagAttributes; - var openTagCount = 0; - - function processTag(index, tagName, attributes, tagLength, isVoid) { - var content = str.slice(currentIndex, index), s = '', r = ''; - if (isString(replacement)) { - r = replacement; - } else if (replacement) { - r = replacement.call(fullString, tagName, content, attributes, fullString) || ''; - } - if (strip) { - s = r; - } else { - content = r; - } - if (content) { - content = runTagReplacements(content, reg, strip, replacement, fullString); - } - result += s + content + (isVoid ? '' : s); - currentIndex = index + (tagLength || 0); - } - - fullString = fullString || str; - reg = RegExp(reg.source, 'gi'); - - while(match = reg.exec(str)) { - - var tagName = match[2]; - var attributes = (match[3]|| '').slice(1); - var isClosingTag = !!match[1]; - var isSelfClosing = !!match[4]; - var tagLength = match[0].length; - var isVoid = tagIsVoid(tagName); - var isOpeningTag = !isClosingTag && !isSelfClosing && !isVoid; - var isSameAsCurrent = tagName === openTagName; - - if (!openTagName) { - result += str.slice(currentIndex, match.index); - currentIndex = match.index; - } - - if (isOpeningTag) { - if (!openTagName) { - openTagName = tagName; - openTagAttributes = attributes; - openTagCount++; - currentIndex += tagLength; - } else if (isSameAsCurrent) { - openTagCount++; - } - } else if (isClosingTag && isSameAsCurrent) { - openTagCount--; - if (openTagCount === 0) { - processTag(match.index, openTagName, openTagAttributes, tagLength, isVoid); - openTagName = null; - openTagAttributes = null; - } - } else if (!openTagName) { - processTag(match.index, tagName, attributes, tagLength, isVoid); - } - } - if (openTagName) { - processTag(str.length, openTagName, openTagAttributes); - } - result += str.slice(currentIndex); - return result; - } - - function numberOrIndex(str, n, from) { - if (isString(n)) { - n = str.indexOf(n); - if (n === -1) { - n = from ? str.length : 0; - } - } - return n; - } - - function buildBase64() { - var encodeAscii, decodeAscii; - - // istanbul ignore next - function catchEncodingError(fn) { - return function(str) { - try { - return fn(str); - } catch(e) { - return ''; - } - }; - } - - // istanbul ignore if - if (typeof Buffer !== 'undefined') { - encodeBase64 = function(str) { - return Buffer.from(str).toString('base64'); - }; - decodeBase64 = function(str) { - return Buffer.from(str, 'base64').toString('utf8'); - }; - return; - } - - // istanbul ignore if - if (typeof btoa !== 'undefined') { - encodeAscii = catchEncodingError(btoa); - decodeAscii = catchEncodingError(atob); - } else { - var key = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - var base64reg = /[^A-Za-z0-9\+\/\=]/g; - encodeAscii = function(str) { - var output = ''; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - do { - chr1 = str.charCodeAt(i++); - chr2 = str.charCodeAt(i++); - chr3 = str.charCodeAt(i++); - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - output += key.charAt(enc1); - output += key.charAt(enc2); - output += key.charAt(enc3); - output += key.charAt(enc4); - chr1 = chr2 = chr3 = ''; - enc1 = enc2 = enc3 = enc4 = ''; - } while (i < str.length); - return output; - }; - decodeAscii = function(input) { - var output = ''; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - if (input.match(base64reg)) { - return ''; - } - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); - do { - enc1 = key.indexOf(input.charAt(i++)); - enc2 = key.indexOf(input.charAt(i++)); - enc3 = key.indexOf(input.charAt(i++)); - enc4 = key.indexOf(input.charAt(i++)); - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - output = output + chr(chr1); - if (enc3 != 64) { - output = output + chr(chr2); - } - if (enc4 != 64) { - output = output + chr(chr3); - } - chr1 = chr2 = chr3 = ''; - enc1 = enc2 = enc3 = enc4 = ''; - } while (i < input.length); - return output; - }; - } - encodeBase64 = function(str) { - return encodeAscii(unescape(encodeURIComponent(str))); - }; - decodeBase64 = function(str) { - return decodeURIComponent(escape(decodeAscii(str))); - }; - } - - function buildEntities() { - HTMLToEntityMap = {}; - forEachProperty(HTMLFromEntityMap, function(val, key) { - HTMLToEntityMap[val] = '&' + key + ';'; - }); - } - - function callIncludesWithRegexSupport(str, search, position) { - if (!isRegExp(search)) { - return nativeIncludes.call(str, search, position); - } - if (position) { - str = str.slice(position); - } - return search.test(str); - } - - defineInstance(sugarString, { - - // Enhancment to String#includes to allow a regex. - 'includes': fixArgumentLength(callIncludesWithRegexSupport) - - }, [ENHANCEMENTS_FLAG, STRING_ENHANCEMENTS_FLAG]); - - defineInstance(sugarString, { - - /*** - * @method at(index, [loop] = false) - * @returns Mixed - * @short Gets the character(s) at a given index. - * @extra When [loop] is true, overshooting the end of the string will begin - * counting from the other end. `index` may be negative. If `index` is - * an array, multiple elements will be returned. - * @example - * - * 'jumpy'.at(0) -> 'j' - * 'jumpy'.at(2) -> 'm' - * 'jumpy'.at(5) -> '' - * 'jumpy'.at(5, true) -> 'j' - * 'jumpy'.at(-1) -> 'y' - * 'lucky charms'.at([2, 4]) -> ['u','k'] - * - * @param {number|Array} index - * @param {boolean} [loop] - * - ***/ - 'at': function(str, index, loop) { - return getEntriesForIndexes(str, index, loop, true); - }, - - /*** - * @method escapeURL([param] = false) - * @returns String - * @short Escapes characters in a string to make a valid URL. - * @extra If [param] is true, it will also escape valid URL characters. Use - * this when the entire string is meant for use in a query string. - * - * @example - * - * 'a, b, and c'.escapeURL() -> 'a,%20b,%20and%20c' - * 'http://foo.com/'.escapeURL(true) -> 'http%3A%2F%2Ffoo.com%2F' - * - * @param {boolean} [param] - * - ***/ - 'escapeURL': function(str, param) { - return param ? encodeURIComponent(str) : encodeURI(str); - }, - - /*** - * @method unescapeURL([partial] = false) - * @returns String - * @short Restores escaped characters in a URL escaped string. - * @extra If [partial] is true, it will only unescape non-valid URL tokens, - * and is included here for completeness, but should be rarely needed. - * - * @example - * - * 'http%3A%2F%2Ffoo.com%2F'.unescapeURL() -> 'http://foo.com/' - * 'http%3A%2F%2Ffoo.com%2F'.unescapeURL(true) -> 'http%3A%2F%2Ffoo.com%2F' - * - * @param {boolean} [partial] - * - ***/ - 'unescapeURL': function(str, param) { - return param ? decodeURI(str) : decodeURIComponent(str); - }, - - /*** - * @method escapeHTML() - * @returns String - * @short Converts HTML characters to their entity equivalents. - * - * @example - * - * '

some text

'.escapeHTML() -> '<p>some text</p>' - * 'one & two'.escapeHTML() -> 'one & two' - * - ***/ - 'escapeHTML': function(str) { - return str.replace(HTML_ESCAPE_REG, function(chr) { - return getOwn(HTMLToEntityMap, chr); - }); - }, - - /*** - * @method unescapeHTML() - * @returns String - * @short Restores escaped HTML characters. - * - * @example - * - * '<p>some text</p>'.unescapeHTML() -> '

some text

' - * 'one & two'.unescapeHTML() -> 'one & two' - * - ***/ - 'unescapeHTML': function(str) { - return unescapeHTML(str); - }, - - /*** - * @method stripTags([tag] = 'all', [replace]) - * @returns String - * @short Strips HTML tags from the string. - * @extra [tag] may be an array of tags or 'all', in which case all tags will - * be stripped. [replace] will replace what was stripped, and may be a - * string or a function of type `replaceFn` to handle replacements. If - * this function returns a string, then it will be used for the - * replacement. If it returns `undefined`, the tags will be stripped normally. - * - * @callback replaceFn - * - * tag The tag name. - * inner The tag content. - * attr The attributes on the tag, if any, as a string. - * outer The entire matched tag string. - * - * @example - * - * '

just some text

'.stripTags() -> 'just some text' - * '

just some text

'.stripTags('p') -> 'just some text' - * '

hi!

'.stripTags('p', function(all, content) { - * return '|'; - * }); -> '|hi!|' - * - * @param {string} tag - * @param {string|replaceFn} replace - * @callbackParam {string} tag - * @callbackParam {string} inner - * @callbackParam {string} attr - * @callbackParam {string} outer - * @callbackReturns {string} replaceFn - * - ***/ - 'stripTags': function(str, tag, replace) { - return replaceTags(str, tag, replace, true); - }, - - /*** - * @method removeTags([tag] = 'all', [replace]) - * @returns String - * @short Removes HTML tags and their contents from the string. - * @extra [tag] may be an array of tags or 'all', in which case all tags will - * be removed. [replace] will replace what was removed, and may be a - * string or a function of type `replaceFn` to handle replacements. If - * this function returns a string, then it will be used for the - * replacement. If it returns `undefined`, the tags will be removed normally. - * - * @callback replaceFn - * - * tag The tag name. - * inner The tag content. - * attr The attributes on the tag, if any, as a string. - * outer The entire matched tag string. - * - * @example - * - * '

just some text

'.removeTags() -> '' - * '

just some text

'.removeTags('b') -> '

just text

' - * '

hi!

'.removeTags('p', function(all, content) { - * return 'bye!'; - * }); -> 'bye!' - * - * @param {string} tag - * @param {string|replaceFn} replace - * @callbackParam {string} tag - * @callbackParam {string} inner - * @callbackParam {string} attr - * @callbackParam {string} outer - * @callbackReturns {string} replaceFn - * - ***/ - 'removeTags': function(str, tag, replace) { - return replaceTags(str, tag, replace, false); - }, - - /*** - * @method encodeBase64() - * @returns String - * @short Encodes the string into base64 encoding. - * @extra This method wraps native methods when available, and uses a custom - * implementation when not available. It can also handle Unicode - * string encodings. - * - * @example - * - * 'gonna get encoded!'.encodeBase64() -> 'Z29ubmEgZ2V0IGVuY29kZWQh' - * 'http://twitter.com/'.encodeBase64() -> 'aHR0cDovL3R3aXR0ZXIuY29tLw==' - * - ***/ - 'encodeBase64': function(str) { - return encodeBase64(str); - }, - - /*** - * @method decodeBase64() - * @returns String - * @short Decodes the string from base64 encoding. - * @extra This method wraps native methods when available, and uses a custom - * implementation when not available. It can also handle Unicode string - * encodings. - * - * @example - * - * 'aHR0cDovL3R3aXR0ZXIuY29tLw=='.decodeBase64() -> 'http://twitter.com/' - * 'anVzdCBnb3QgZGVjb2RlZA=='.decodeBase64() -> 'just got decoded!' - * - ***/ - 'decodeBase64': function(str) { - return decodeBase64(str); - }, - - /*** - * @method forEach([search], [eachFn]) - * @returns Array - * @short Runs callback [eachFn] against every character in the string, or - * every every occurence of [search] if it is provided. - * @extra Returns an array of matches. [search] may be either a string or - * regex, and defaults to every character in the string. If [eachFn] - * returns false at any time it will break out of the loop. - * - * @callback eachFn - * - * match The current match. - * i The current index. - * arr An array of all matches. - * - * @example - * - * 'jumpy'.forEach(log) -> ['j','u','m','p','y'] - * 'jumpy'.forEach(/[r-z]/) -> ['u','y'] - * 'jumpy'.forEach(/mp/) -> ['mp'] - * 'jumpy'.forEach(/[r-z]/, function(m) { - * // Called twice: "u", "y" - * }); - * - * @signature forEach(eachFn) - * @param {string|RegExp} [search] - * @param {eachFn} [eachFn] - * @callbackParam {string} match - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'forEach': function(str, search, eachFn) { - return stringEach(str, search, eachFn); - }, - - /*** - * @method chars([eachCharFn]) - * @returns Array - * @short Runs [eachCharFn] against each character in the string, and returns an array. - * - * @callback eachCharFn - * - * char The current character. - * i The current index. - * arr An array of all characters. - * - * @example - * - * 'jumpy'.chars() -> ['j','u','m','p','y'] - * 'jumpy'.chars(function(c) { - * // Called 5 times: "j","u","m","p","y" - * }); - * - * @param {eachCharFn} [eachCharFn] - * @callbackParam {string} char - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'chars': function(str, search, eachCharFn) { - return stringEach(str, search, eachCharFn); - }, - - /*** - * @method words([eachWordFn]) - * @returns Array - * @short Runs [eachWordFn] against each word in the string, and returns an array. - * @extra A "word" is defined as any sequence of non-whitespace characters. - * - * @callback eachWordFn - * - * word The current word. - * i The current index. - * arr An array of all words. - * - * @example - * - * 'broken wear'.words() -> ['broken','wear'] - * 'broken wear'.words(function(w) { - * // Called twice: "broken", "wear" - * }); - * - * @param {eachWordFn} [eachWordFn] - * @callbackParam {string} word - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'words': function(str, eachWordFn) { - return stringEach(trim(str), /\S+/g, eachWordFn); - }, - - /*** - * @method lines([eachLineFn]) - * @returns Array - * @short Runs [eachLineFn] against each line in the string, and returns an array. - * - * @callback eachLineFn - * - * line The current line. - * i The current index. - * arr An array of all lines. - * - * @example - * - * lineText.lines() -> array of lines - * lineText.lines(function(l) { - * // Called once per line - * }); - * - * @param {eachLineFn} [eachLineFn] - * @callbackParam {string} line - * @callbackParam {number} i - * @callbackParam {Array} arr - * - ***/ - 'lines': function(str, eachLineFn) { - return stringEach(trim(str), /^.*$/gm, eachLineFn); - }, - - /*** - * @method codes([eachCodeFn]) - * @returns Array - * @short Runs callback [eachCodeFn] against each character code in the string. - * Returns an array of character codes. - * - * @callback eachCodeFn - * - * code The current character code. - * i The current index. - * str The string being operated on. - * - * @example - * - * 'jumpy'.codes() -> [106,117,109,112,121] - * 'jumpy'.codes(function(c) { - * // Called 5 times: 106, 117, 109, 112, 121 - * }); - * - * @param {eachCodeFn} [eachCodeFn] - * @callbackParam {number} code - * @callbackParam {number} i - * @callbackParam {string} str - * - ***/ - 'codes': function(str, eachCodeFn) { - return stringCodes(str, eachCodeFn); - }, - - /*** - * @method shift(n) - * @returns Array - * @short Shifts each character in the string `n` places in the character map. - * - * @example - * - * 'a'.shift(1) -> 'b' - * 'ク'.shift(1) -> 'グ' - * - * @param {number} n - * - ***/ - 'shift': function(str, n) { - var result = ''; - n = n || 0; - stringCodes(str, function(c) { - result += chr(c + n); - }); - return result; - }, - - /*** - * @method isBlank() - * @returns Boolean - * @short Returns true if the string has length 0 or contains only whitespace. - * - * @example - * - * ''.isBlank() -> true - * ' '.isBlank() -> true - * 'noway'.isBlank() -> false - * - ***/ - 'isBlank': function(str) { - return trim(str).length === 0; - }, - - /*** - * @method isEmpty() - * @returns Boolean - * @short Returns true if the string has length 0. - * - * @example - * - * ''.isEmpty() -> true - * 'a'.isBlank() -> false - * ' '.isBlank() -> false - * - ***/ - 'isEmpty': function(str) { - return str.length === 0; - }, - - /*** - * @method insert(str, [index] = length) - * @returns String - * @short Adds `str` at [index]. Allows negative values. - * - * @example - * - * 'dopamine'.insert('e', 3) -> dopeamine - * 'spelling eror'.insert('r', -3) -> spelling error - * - * @param {string} str - * @param {number} [index] - * - ***/ - 'insert': function(str, substr, index) { - index = isUndefined(index) ? str.length : index; - return str.slice(0, index) + substr + str.slice(index); - }, - - /*** - * @method remove(f) - * @returns String - * @short Removes the first occurrence of `f` in the string. - * @extra `f` can be a either case-sensitive string or a regex. In either case - * only the first match will be removed. To remove multiple occurrences, - * use `removeAll`. - * - * @example - * - * 'schfifty five'.remove('f') -> 'schifty five' - * 'schfifty five'.remove(/[a-f]/g) -> 'shfifty five' - * - * @param {string|RegExp} f - * - ***/ - 'remove': function(str, f) { - return str.replace(f, ''); - }, - - /*** - * @method removeAll(f) - * @returns String - * @short Removes any occurences of `f` in the string. - * @extra `f` can be either a case-sensitive string or a regex. In either case - * all matches will be removed. To remove only a single occurence, use - * `remove`. - * - * @example - * - * 'schfifty five'.removeAll('f') -> 'schity ive' - * 'schfifty five'.removeAll(/[a-f]/) -> 'shity iv' - * - * @param {string|RegExp} f - * - ***/ - 'removeAll': function(str, f) { - return stringReplaceAll(str, f); - }, - - /*** - * @method reverse() - * @returns String - * @short Reverses the string. - * - * @example - * - * 'jumpy'.reverse() -> 'ypmuj' - * 'lucky charms'.reverse() -> 'smrahc ykcul' - * - ***/ - 'reverse': function(str) { - return reverseString(str); - }, - - /*** - * @method compact() - * @returns String - * @short Compacts whitespace in the string to a single space and trims the ends. - * - * @example - * - * 'too \n much \n space'.compact() -> 'too much space' - * 'enough \n '.compact() -> 'enought' - * - ***/ - 'compact': function(str) { - return trim(str).replace(/([\r\n\s ])+/g, function(match, whitespace) { - return whitespace === ' ' ? whitespace : ' '; - }); - }, - - /*** - * @method from([index] = 0) - * @returns String - * @short Returns a section of the string starting from [index]. - * - * @example - * - * 'lucky charms'.from() -> 'lucky charms' - * 'lucky charms'.from(7) -> 'harms' - * - * @param {number} [index] - * - ***/ - 'from': function(str, from) { - return str.slice(numberOrIndex(str, from, true)); - }, - - /*** - * @method to([index] = end) - * @returns String - * @short Returns a section of the string ending at [index]. - * - * @example - * - * 'lucky charms'.to() -> 'lucky charms' - * 'lucky charms'.to(7) -> 'lucky ch' - * - * @param {number} [index] - * - ***/ - 'to': function(str, to) { - if (isUndefined(to)) to = str.length; - return str.slice(0, numberOrIndex(str, to)); - }, - - /*** - * @method dasherize() - * @returns String - * @short Converts underscores and camel casing to hypens. - * - * @example - * - * 'a_farewell_to_arms'.dasherize() -> 'a-farewell-to-arms' - * 'capsLock'.dasherize() -> 'caps-lock' - * - ***/ - 'dasherize': function(str) { - return stringUnderscore(str).replace(/_/g, '-'); - }, - - /*** - * @method underscore() - * @returns String - * @short Converts hyphens and camel casing to underscores. - * - * @example - * - * 'a-farewell-to-arms'.underscore() -> 'a_farewell_to_arms' - * 'capsLock'.underscore() -> 'caps_lock' - * - ***/ - 'underscore': function(str) { - return stringUnderscore(str); - }, - - /*** - * @method camelize([upper] = true) - * @returns String - * @short Converts underscores and hyphens to camel case. - * @extra If [upper] is true, the string will be UpperCamelCase. If the - * inflections module is included, acronyms can also be defined that - * will be used when camelizing. - * - * @example - * - * 'caps_lock'.camelize() -> 'CapsLock' - * 'moz-border-radius'.camelize() -> 'MozBorderRadius' - * 'moz-border-radius'.camelize(false) -> 'mozBorderRadius' - * 'http-method'.camelize() -> 'HTTPMethod' - * - * @param {boolean} [upper] - * - ***/ - 'camelize': function(str, upper) { - return stringCamelize(str, upper); - }, - - /*** - * @method spacify() - * @returns String - * @short Converts camelcase, underscores, and hyphens to spaces. - * - * @example - * - * 'camelCase'.spacify() -> 'camel case' - * 'an-ugly-string'.spacify() -> 'an ugly string' - * 'oh-no_youDid-not'.spacify().capitalize(true) -> 'something else' - * - ***/ - 'spacify': function(str) { - return stringSpacify(str); - }, - - /*** - * @method titleize() - * @returns String - * @short Creates a title version of the string. - * @extra Capitalizes all the words and replaces some characters in the string - * to create a nicer looking title. String#titleize is meant for - * creating pretty output. - * - * @example - * - * 'man from the boondocks'.titleize() -> 'Man from the Boondocks' - * 'x-men: apocalypse'.titleize() -> 'X Men: Apocalypse' - * 'TheManWithoutAPast'.titleize() -> 'The Man Without a Past' - * 'raiders_of_the_lost_ark'.titleize() -> 'Raiders of the Lost Ark' - * - ***/ - 'titleize': function(str) { - return stringTitleize(str); - }, - - /*** - * @method parameterize() - * @returns String - * @short Replaces special characters in a string so that it may be used as - * part of a pretty URL. - * - * @example - * - * 'hell, no!'.parameterize() -> 'hell-no' - * - ***/ - 'parameterize': function(str, separator) { - return stringParameterize(str, separator); - }, - - /*** - * @method truncate(length, [from] = 'right', [ellipsis] = '...') - * @returns String - * @short Truncates a string. - * @extra [from] can be `'right'`, `'left'`, or `'middle'`. If the string is - * shorter than `length`, [ellipsis] will not be added. - * - * @example - * - * 'sittin on the dock'.truncate(10) -> 'sittin on ...' - * 'sittin on the dock'.truncate(10, 'left') -> '...n the dock' - * 'sittin on the dock'.truncate(10, 'middle') -> 'sitti... dock' - * - * @param {number} length - * @param {string} [from] - * @param {string} [ellipsis] - * - ***/ - 'truncate': function(str, length, from, ellipsis) { - return truncateString(str, length, from, ellipsis); - }, - - /*** - * @method truncateOnWord(length, [from] = 'right', [ellipsis] = '...') - * @returns String - * @short Truncates a string without splitting up words. - * @extra [from] can be `'right'`, `'left'`, or `'middle'`. If the string is - * shorter than `length`, [ellipsis] will not be added. A "word" is - * defined as any sequence of non-whitespace characters. - * - * @example - * - * 'here we go'.truncateOnWord(5) -> 'here...' - * 'here we go'.truncateOnWord(5, 'left') -> '...we go' - * - * @param {number} length - * @param {string} [from] - * @param {string} [ellipsis] - * - ***/ - 'truncateOnWord': function(str, length, from, ellipsis) { - return truncateString(str, length, from, ellipsis, true); - }, - - /*** - * @method pad(num, [padding] = ' ') - * @returns String - * @short Pads the string out with [padding] to be exactly `num` characters. - * - * @example - * - * 'wasabi'.pad(8) -> ' wasabi ' - * 'wasabi'.pad(8, '-') -> '-wasabi-' - * - * @param {number} num - * @param {string} [padding] - * - ***/ - 'pad': function(str, num, padding) { - var half, front, back; - num = coercePositiveInteger(num); - half = max(0, num - str.length) / 2; - front = floor(half); - back = ceil(half); - return padString(front, padding) + str + padString(back, padding); - }, - - /*** - * @method padLeft(num, [padding] = ' ') - * @returns String - * @short Pads the string out from the left with [padding] to be exactly - * `num` characters. - * - * @example - * - * 'wasabi'.padLeft(8) -> ' wasabi' - * 'wasabi'.padLeft(8, '-') -> '--wasabi' - * - * @param {number} num - * @param {string} [padding] - * - ***/ - 'padLeft': function(str, num, padding) { - num = coercePositiveInteger(num); - return padString(max(0, num - str.length), padding) + str; - }, - - /*** - * @method padRight(num, [padding] = ' ') - * @returns String - * @short Pads the string out from the right with [padding] to be exactly - * `num` characters. - * - * @example - * - * 'wasabi'.padRight(8) -> 'wasabi ' - * 'wasabi'.padRight(8, '-') -> 'wasabi--' - * - * @param {number} num - * @param {string} [padding] - * - ***/ - 'padRight': function(str, num, padding) { - num = coercePositiveInteger(num); - return str + padString(max(0, num - str.length), padding); - }, - - /*** - * @method first([n] = 1) - * @returns String - * @short Returns the first [n] characters of the string. - * - * @example - * - * 'lucky charms'.first() -> 'l' - * 'lucky charms'.first(3) -> 'luc' - * - * @param {number} [n] - * - ***/ - 'first': function(str, num) { - if (isUndefined(num)) num = 1; - return str.substr(0, num); - }, - - /*** - * @method last([n] = 1) - * @returns String - * @short Returns the last [n] characters of the string. - * - * @example - * - * 'lucky charms'.last() -> 's' - * 'lucky charms'.last(3) -> 'rms' - * - * @param {number} [n] - * - ***/ - 'last': function(str, num) { - if (isUndefined(num)) num = 1; - var start = str.length - num < 0 ? 0 : str.length - num; - return str.substr(start); - }, - - /*** - * @method toNumber([base] = 10) - * @returns Number - * @short Converts the string into a number. - * @extra Any value with a "." fill be converted to a floating point value, - * otherwise an integer. - * - * @example - * - * '153'.toNumber() -> 153 - * '12,000'.toNumber() -> 12000 - * '10px'.toNumber() -> 10 - * 'ff'.toNumber(16) -> 255 - * - * @param {number} [base] - * - ***/ - 'toNumber': function(str, base) { - return stringToNumber(str, base); - }, - - /*** - * @method capitalize([lower] = false, [all] = false) - * @returns String - * @short Capitalizes the first character of the string. - * @extra If [lower] is true, the remainder of the string will be downcased. - * If [all] is true, all words in the string will be capitalized. - * - * @example - * - * 'hello'.capitalize() -> 'Hello' - * 'HELLO'.capitalize(true) -> 'Hello' - * 'hello kitty'.capitalize() -> 'Hello kitty' - * 'hEllO kItTy'.capitalize(true, true) -> 'Hello Kitty' - * - * @param {boolean} [lower] - * @param {boolean} [all] - * - ***/ - 'capitalize': function(str, lower, all) { - return stringCapitalize(str, lower, all); - }, - - /*** - * @method trimLeft() - * @returns String - * @short Removes leading whitespace from the string. - * @extra Whitespace is defined as line breaks, tabs, and any character in the - * "Space, Separator" Unicode category, conforming to the the ES5 `trim` - * spec. - * - * @example - * - * ' wasabi '.trimLeft() -> 'wasabi ' - * - ***/ - 'trimLeft': function(str) { - return str.replace(LEFT_TRIM_REG, ''); - }, - - /*** - * @method trimRight() - * @returns String - * @short Removes trailing whitespace from the string. - * @extra Whitespace is defined as line breaks, tabs, and any character in the - * "Space, Separator" Unicode category, conforming to the the ES5 `trim` - * spec. - * - * @example - * - * ' wasabi '.trimRight() -> ' wasabi' - * - ***/ - 'trimRight': function(str) { - return str.replace(RIGHT_TRIM_REG, ''); - } - - }); - - defineInstanceWithArguments(sugarString, { - - /*** - * @method replaceAll(f, [str1], [str2], ...) - * @returns String - * @short Replaces all occurences of `f` with arguments passed. - * @extra This method is intended to be a quick way to perform multiple string - * replacements quickly when the replacement token differs depending on - * position. `f` can be either a case-sensitive string or a regex. - * In either case all matches will be replaced. - * - * @example - * - * '-x -y -z'.replaceAll('-', 1, 2, 3) -> '1x 2y 3z' - * 'one and two'.replaceAll(/one|two/, '1st', '2nd') -> '1st and 2nd' - * - * @param {string|RegExp} f - * @param {string} [str1] - * @param {string} [str2] - * - ***/ - 'replaceAll': function(str, f, args) { - return stringReplaceAll(str, f, args); - }, - - /*** - * @method format(obj1, [obj2], ...) - * @returns String - * @short Replaces `{}` tokens in the string with arguments or properties. - * @extra Tokens support `deep properties`. If a single object is passed, its - * properties can be accessed by keywords such as `{name}`. If multiple - * objects or a non-object are passed, they can be accessed by the - * argument position like `{0}`. Literal braces in the string can be - * escaped by repeating them. - * - * @example - * - * 'Welcome, {name}.'.format({ name: 'Bill' }) -> 'Welcome, Bill.' - * 'You are {0} years old today.'.format(5) -> 'You are 5 years old today.' - * '{0.name} and {1.name}'.format(users) -> logs first two users' names - * '${currencies.usd.balance}'.format(Harry) -> "$500" - * '{{Hello}}'.format('Hello') -> "{Hello}" - * - * @param {any} [obj1] - * @param {any} [obj2] - * - ***/ - 'format': function(str, args) { - var arg1 = args[0] && args[0].valueOf(); - // Unwrap if a single object is passed in. - if (args.length === 1 && isObjectType(arg1)) { - args = arg1; - } - return stringFormatMatcher(str, args); - } - - }); - - buildBase64(); - buildEntities(); - - /*** - * @module Array - * @description Array manipulation and traversal, alphanumeric sorting and collation. - * - ***/ - - var HALF_WIDTH_NINE = 0x39; - var FULL_WIDTH_NINE = 0xff19; - - // Undefined array elements in < IE8 will not be visited by concat - // and so will not be copied. This means that non-sparse arrays will - // become sparse, so detect for this here. - var HAS_CONCAT_BUG = !('0' in [].concat(undefined).concat()); - - var ARRAY_OPTIONS = { - 'sortIgnore': null, - 'sortNatural': true, - 'sortIgnoreCase': true, - 'sortOrder': getSortOrder(), - 'sortCollate': collateStrings, - 'sortEquivalents': getSortEquivalents() - }; - - /*** - * @method getOption(name) - * @returns Mixed - * @accessor - * @short Gets an option used internally by Array. - * @extra Options listed below. Current options are for sorting strings with - * `sortBy`. - * - * @example - * - * Sugar.Array.getOption('sortNatural') - * - * @param {string} name - * - *** - * @method setOption(name, value) - * @accessor - * @short Sets an option used internally by Array. - * @extra Options listed below. Current options are for sorting strings with - * `sortBy`. If `value` is `null`, the default value will be restored. - * - * @options - * - * sortIgnore A regex to ignore when sorting. An example usage of this - * option would be to ignore numbers in a list to instead - * sort by the first text that appears. Default is `null`. - * - * sortIgnoreCase A boolean that ignores case when sorting. - * Default is `true`. - * - * sortNatural A boolean that turns on natural sorting. "Natural" means - * that numerals like "10" will be sorted after "9" instead - * of after "1". Default is `true`. - * - * sortOrder A string of characters to use as the base sort order. The - * default is an order natural to most major world languages. - * - * sortEquivalents A table of equivalent characters used when sorting. The - * default produces a natural sort order for most world - * languages, however can be modified for others. For - * example, setting "ä" and "ö" to `null` in the table would - * produce a Scandanavian sort order. Note that setting this - * option to `null` will restore the default table, but any - * mutations made to that table will persist. - * - * sortCollate The collation function used when sorting strings. The - * default function produces a natural sort order that can - * be customized with the other "sort" options. Overriding - * the function directly here will also override these - * options. - * - * @example - * - * Sugar.Array.setOption('sortIgnore', /^\d+\./) - * Sugar.Array.setOption('sortIgnoreCase', false) - * - * @signature setOption(options) - * @param {ArrayOptions} options - * @param {string} name - * @param {any} value - * @option {RegExp} [sortIgnore] - * @option {boolean} [sortIgnoreCase] - * @option {boolean} [sortNatural] - * @option {string} [sortOrder] - * @option {Object} [sortEquivalents] - * @option {Function} [sortCollate] - * - ***/ - var _arrayOptions = defineOptionsAccessor(sugarArray, ARRAY_OPTIONS); - - - function setArrayChainableConstructor() { - setChainableConstructor(sugarArray, arrayCreate); - } - - function isArrayOrInherited(obj) { - return obj && obj.constructor && isArray(obj.constructor.prototype); - } - - function arrayCreate(obj, clone) { - var arr; - if (isArrayOrInherited(obj)) { - arr = clone ? arrayClone(obj) : obj; - } else if (isObjectType(obj) || isString(obj)) { - arr = Array.from(obj); - } else if (isDefined(obj)) { - arr = [obj]; - } - return arr || []; - } - - function arrayClone(arr) { - var clone = new Array(arr.length); - forEach(arr, function(el, i) { - clone[i] = el; - }); - return clone; - } - - function arrayConcat(arr1, arr2) { - // istanbul ignore if - if (HAS_CONCAT_BUG) { - return arraySafeConcat(arr1, arr2); - } - return arr1.concat(arr2); - } - - // Avoids issues with [undefined] in < IE9 - function arrayWrap(obj) { - var arr = []; - arr.push(obj); - return arr; - } - - // Avoids issues with concat in < IE8 - // istanbul ignore next - function arraySafeConcat(arr, arg) { - var result = arrayClone(arr), len = result.length, arr2; - arr2 = isArray(arg) ? arg : [arg]; - result.length += arr2.length; - forEach(arr2, function(el, i) { - result[len + i] = el; - }); - return result; - } - - - function arrayAppend(arr, el, index) { - var spliceArgs; - index = +index; - if (isNaN(index)) { - index = arr.length; - } - spliceArgs = [index, 0]; - if (isDefined(el)) { - spliceArgs = spliceArgs.concat(el); - } - arr.splice.apply(arr, spliceArgs); - return arr; - } - - function arrayRemove(arr, f) { - var matcher = getMatcher(f), i = 0; - while(i < arr.length) { - if (matcher(arr[i], i, arr)) { - arr.splice(i, 1); - } else { - i++; - } - } - return arr; - } - - function arrayExclude(arr, f) { - var result = [], matcher = getMatcher(f); - for (var i = 0; i < arr.length; i++) { - if (!matcher(arr[i], i, arr)) { - result.push(arr[i]); - } - } - return result; - } - - function arrayUnique(arr, map) { - var result = [], obj = {}, refs = []; - forEach(arr, function(el, i) { - var transformed = map ? mapWithShortcuts(el, map, arr, [el, i, arr]) : el; - var key = serializeInternal(transformed, refs); - if (!hasOwn(obj, key)) { - result.push(el); - obj[key] = true; - } - }); - return result; - } - - function arrayFlatten(arr, level, current) { - var result = []; - level = level || Infinity; - current = current || 0; - forEach(arr, function(el) { - if (isArray(el) && current < level) { - result = result.concat(arrayFlatten(el, level, current + 1)); - } else { - result.push(el); - } - }); - return result; - } - - function arrayCompact(arr, all) { - return filter(arr, function(el) { - return el || (!all && el != null && el.valueOf() === el.valueOf()); - }); - } - - function arrayShuffle(arr) { - arr = arrayClone(arr); - var i = arr.length, j, x; - while(i) { - j = (Math.random() * i) | 0; - x = arr[--i]; - arr[i] = arr[j]; - arr[j] = x; - } - return arr; - } - - function arrayGroupBy(arr, map, fn) { - var result = {}, key; - forEach(arr, function(el, i) { - key = mapWithShortcuts(el, map, arr, [el, i, arr]); - if (!hasOwn(result, key)) { - result[key] = []; - } - result[key].push(el); - }); - if (fn) { - forEachProperty(result, fn); - } - return result; - } - - function arrayIntersectOrSubtract(arr1, arr2, subtract) { - var result = [], obj = {}, refs = []; - if (!isArray(arr2)) { - arr2 = arrayWrap(arr2); - } - forEach(arr2, function(el) { - obj[serializeInternal(el, refs)] = true; - }); - forEach(arr1, function(el) { - var key = serializeInternal(el, refs); - if (hasOwn(obj, key) !== subtract) { - delete obj[key]; - result.push(el); - } - }); - return result; - } - - // Collation helpers - - function compareValue(aVal, bVal) { - var cmp, i, collate; - if (isString(aVal) && isString(bVal)) { - collate = _arrayOptions('sortCollate'); - return collate(aVal, bVal); - } else if (isArray(aVal) && isArray(bVal)) { - if (aVal.length < bVal.length) { - return -1; - } else if (aVal.length > bVal.length) { - return 1; - } else { - for(i = 0; i < aVal.length; i++) { - cmp = compareValue(aVal[i], bVal[i]); - if (cmp !== 0) { - return cmp; - } - } - return 0; - } - } - return aVal < bVal ? -1 : aVal > bVal ? 1 : 0; - } - - function codeIsNumeral(code) { - return (code >= HALF_WIDTH_ZERO && code <= HALF_WIDTH_NINE) || - (code >= FULL_WIDTH_ZERO && code <= FULL_WIDTH_NINE); - } - - function collateStrings(a, b) { - var aValue, bValue, aChar, bChar, aEquiv, bEquiv, index = 0, tiebreaker = 0; - - var sortOrder = _arrayOptions('sortOrder'); - var sortIgnore = _arrayOptions('sortIgnore'); - var sortNatural = _arrayOptions('sortNatural'); - var sortIgnoreCase = _arrayOptions('sortIgnoreCase'); - var sortEquivalents = _arrayOptions('sortEquivalents'); - - a = getCollationReadyString(a, sortIgnore, sortIgnoreCase); - b = getCollationReadyString(b, sortIgnore, sortIgnoreCase); - - do { - - aChar = getCollationCharacter(a, index, sortEquivalents); - bChar = getCollationCharacter(b, index, sortEquivalents); - aValue = getSortOrderIndex(aChar, sortOrder); - bValue = getSortOrderIndex(bChar, sortOrder); - - if (aValue === -1 || bValue === -1) { - aValue = a.charCodeAt(index) || null; - bValue = b.charCodeAt(index) || null; - if (sortNatural && codeIsNumeral(aValue) && codeIsNumeral(bValue)) { - aValue = stringToNumber(a.slice(index)); - bValue = stringToNumber(b.slice(index)); - } - } else { - aEquiv = aChar !== a.charAt(index); - bEquiv = bChar !== b.charAt(index); - if (aEquiv !== bEquiv && tiebreaker === 0) { - tiebreaker = aEquiv - bEquiv; - } - } - index += 1; - } while(aValue != null && bValue != null && aValue === bValue); - if (aValue === bValue) return tiebreaker; - return aValue - bValue; - } - - function getCollationReadyString(str, sortIgnore, sortIgnoreCase) { - if (sortIgnoreCase) { - str = str.toLowerCase(); - } - if (sortIgnore) { - str = str.replace(sortIgnore, ''); - } - return str; - } - - function getCollationCharacter(str, index, sortEquivalents) { - var chr = str.charAt(index); - return getOwn(sortEquivalents, chr) || chr; - } - - function getSortOrderIndex(chr, sortOrder) { - if (!chr) { - return null; - } else { - return sortOrder.indexOf(chr); - } - } - - function getSortOrder() { - var order = 'AÁÀÂÃĄBCĆČÇDĎÐEÉÈĚÊËĘFGĞHıIÍÌİÎÏJKLŁMNŃŇÑOÓÒÔPQRŘSŚŠŞTŤUÚÙŮÛÜVWXYÝZŹŻŽÞÆŒØÕÅÄÖ'; - return map(order.split(''), function(str) { - return str + str.toLowerCase(); - }).join(''); - } - - function getSortEquivalents() { - var equivalents = {}; - forEach(spaceSplit('AÁÀÂÃÄ CÇ EÉÈÊË IÍÌİÎÏ OÓÒÔÕÖ Sß UÚÙÛÜ'), function(set) { - var first = set.charAt(0); - forEach(set.slice(1).split(''), function(chr) { - equivalents[chr] = first; - equivalents[chr.toLowerCase()] = first.toLowerCase(); - }); - }); - return equivalents; - } - - defineStatic(sugarArray, { - - /*** - * - * @method create([obj], [clone] = false) - * @returns Array - * @static - * @short Creates an array from an unknown object. - * @extra This method is similar to native `Array.from` but is faster when - * `obj` is already an array. When [clone] is true, the array will be - * shallow cloned. Additionally, it will not fail on `undefined`, - * `null`, or numbers, producing an empty array in the case of - * `undefined` and wrapping `obj` otherwise. - * - * @example - * - * Array.create() -> [] - * Array.create(8) -> [8] - * Array.create('abc') -> ['a','b','c'] - * Array.create([1,2,3]) -> [1, 2, 3] - * Array.create(undefined) -> [] - * - * @param {number|ArrayLike} [obj] - * @param {boolean} [clone] - * - ***/ - 'create': function(obj, clone) { - return arrayCreate(obj, clone); - }, - - /*** - * - * @method construct(n, indexMapFn) - * @returns Array - * @static - * @short Constructs an array of `n` length from the values of `indexMapFn`. - * @extra This function is essentially a shortcut for using `Array.from` with - * `new Array(n)`. - * - * @callback indexMapFn - * - * i The index of the current iteration. - * - * @example - * - * Array.construct(4, function(i) { - * return i * i; - * }); -> [0, 1, 4] - * - * @param {number} n - * @param {indexMapFn} indexMapFn - * @callbackParam {number} i - * @callbackReturns {ArrayElement} indexMapFn - * - ***/ - 'construct': function(n, indexMapFn) { - n = coercePositiveInteger(n); - return Array.from(new Array(n), function(el, i) { - return indexMapFn && indexMapFn(i); - }); - } - - }); - - defineInstance(sugarArray, { - - /*** - * @method isEmpty() - * @returns Boolean - * @short Returns true if the array has a length of zero. - * - * @example - * - * [].isEmpty() -> true - * ['a'].isEmpty() -> false - * - ***/ - 'isEmpty': function(arr) { - return arr.length === 0; - }, - - /*** - * @method isEqual(arr) - * @returns Boolean - * @short Returns true if the array is equal to `arr`. - * @extra Objects in the array are considered equal if they are not observably - * distinguishable. This method is an instance alias for - * `Object.isEqual()`. - * - * @example - * - * ['a','b'].isEqual(['a','b']) -> true - * ['a','b'].isEqual(['a','c']) -> false - * [{a:'a'}].isEqual([{a:'a'}]) -> true - * [5].isEqual([Object(5)]) -> false - * - * @param {Array} arr - * - ***/ - 'isEqual': function(a, b) { - return isEqual(a, b); - }, - - /*** - * @method clone() - * @returns Array - * @short Creates a shallow clone of the array. - * - * @example - * - * [1,2,3].clone() -> [1,2,3] - * - ***/ - 'clone': function(arr) { - return arrayClone(arr); - }, - - /*** - * @method at(index, [loop] = false) - * @returns ArrayElement - * @short Gets the element(s) at `index`. - * @extra When [loop] is true, overshooting the end of the array will begin - * counting from the other end. `index` can be negative. If `index` is - * an array, multiple elements will be returned. - * - * @example - * - * [1,2,3].at(0) -> 1 - * [1,2,3].at(2) -> 3 - * [1,2,3].at(4) -> undefined - * [1,2,3].at(4, true) -> 2 - * [1,2,3].at(-1) -> 3 - * [1,2,3].at([0, 1]) -> [1, 2] - * - * @param {number|number[]} index - * @param {boolean} [loop] - * - ***/ - 'at': function(arr, index, loop) { - return getEntriesForIndexes(arr, index, loop); - }, - - /*** - * @method add(item, [index]) - * @returns Array - * @short Adds `item` to the array and returns the result as a new array. - * @extra If `item` is also an array, it will be concatenated instead of - * inserted. [index] will control where `item` is added. Use `append` - * to modify the original array. - * - * @example - * - * [1,2,3,4].add(5) -> [1,2,3,4,5] - * [1,2,3,4].add(8, 1) -> [1,8,2,3,4] - * [1,2,3,4].add([5,6,7]) -> [1,2,3,4,5,6,7] - * - * @param {ArrayElement|Array} item - * @param {number} [index] - * - ***/ - 'add': function(arr, item, index) { - return arrayAppend(arrayClone(arr), item, index); - }, - - /*** - * @method subtract(item) - * @returns Array - * @short Subtracts `item` from the array and returns the result as a new array. - * @extra If `item` is also an array, all elements in it will be removed. In - * addition to primitives, this method will also deep-check objects for - * equality. - * - * @example - * - * [1,3,5].subtract([5,7,9]) -> [1,3] - * ['a','b'].subtract(['b','c']) -> ['a'] - * [1,2,3].subtract(2) -> [1,3] - * - * @param {ArrayElement|Array} item - * - ***/ - 'subtract': function(arr, item) { - return arrayIntersectOrSubtract(arr, item, true); - }, - - /*** - * @method append(item, [index]) - * @returns Array - * @short Appends `item` to the array. - * @extra If `item` is also an array, it will be concatenated instead of - * inserted. This method modifies the array! Use `add` to create a new - * array. Additionally, `insert` is provided as an alias that reads - * better when using an index. - * - * @example - * - * [1,2,3,4].append(5) -> [1,2,3,4,5] - * [1,2,3,4].append([5,6,7]) -> [1,2,3,4,5,6,7] - * [1,2,3,4].append(8, 1) -> [1,8,2,3,4] - * - * @param {ArrayElement|Array} item - * @param {number} index - * - ***/ - 'append': function(arr, item, index) { - return arrayAppend(arr, item, index); - }, - - /*** - * @method removeAt(start, [end]) - * @returns Array - * @short Removes element at `start`. If [end] is specified, removes the range - * between `start` and [end]. This method will modify the array! - * - * @example - * - * ['a','b','c'].removeAt(0) -> ['b','c'] - * [1,2,3,4].removeAt(1, 2) -> [1, 4] - * - * @param {number} start - * @param {number} [end] - * - ***/ - 'removeAt': function(arr, start, end) { - if (isUndefined(start)) return arr; - if (isUndefined(end)) end = start; - arr.splice(start, end - start + 1); - return arr; - }, - - /*** - * @method unique([map]) - * @returns Array - * @short Removes all duplicate elements in the array. - * @extra [map] can be a string or callback type `mapFn` that returns the value - * to be uniqued or a string acting as a shortcut. This is most commonly - * used when you only need to check a single field that can ensure the - * object's uniqueness (such as an `id` field). If [map] is not passed, - * then objects will be deep checked for equality. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,2,3].unique() -> [1,2,3] - * [{a:'a'},{a:'a'}].unique() -> [{a:'a'}] - * - * users.unique(function(user) { - * return user.id; - * }); -> users array uniqued by id - * - * users.unique('id') -> users array uniqued by id - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'unique': function(arr, map) { - return arrayUnique(arr, map); - }, - - /*** - * @method flatten([limit] = Infinity) - * @returns Array - * @short Returns a flattened, one-dimensional copy of the array. - * @extra You can optionally specify a [limit], which will only flatten to - * that depth. - * - * @example - * - * [[1], 2, [3]].flatten() -> [1,2,3] - * [[1],[],2,3].flatten() -> [1,2,3] - * - * @param {number} [limit] - * - ***/ - 'flatten': function(arr, limit) { - return arrayFlatten(arr, limit); - }, - - /*** - * @method first([num] = 1) - * @returns Mixed - * @short Returns the first element(s) in the array. - * @extra When `num` is passed, returns the first `num` elements in the array. - * - * @example - * - * [1,2,3].first() -> 1 - * [1,2,3].first(2) -> [1,2] - * - * @param {number} [num] - * - ***/ - 'first': function(arr, num) { - if (isUndefined(num)) return arr[0]; - if (num < 0) num = 0; - return arr.slice(0, num); - }, - - /*** - * @method last([num] = 1) - * @returns Mixed - * @short Returns the last element(s) in the array. - * @extra When `num` is passed, returns the last `num` elements in the array. - * - * @example - * - * [1,2,3].last() -> 3 - * [1,2,3].last(2) -> [2,3] - * - * @param {number} [num] - * - ***/ - 'last': function(arr, num) { - if (isUndefined(num)) return arr[arr.length - 1]; - var start = arr.length - num < 0 ? 0 : arr.length - num; - return arr.slice(start); - }, - - /*** - * @method from(index) - * @returns Array - * @short Returns a slice of the array from `index`. - * - * @example - * - * ['a','b','c'].from(1) -> ['b','c'] - * ['a','b','c'].from(2) -> ['c'] - * - * @param {number} [index] - * - ***/ - 'from': function(arr, num) { - return arr.slice(num); - }, - - /*** - * @method to(index) - * @returns Array - * @short Returns a slice of the array up to `index`. - * - * @example - * - * ['a','b','c'].to(1) -> ['a'] - * ['a','b','c'].to(2) -> ['a','b'] - * - * @param {number} [index] - * - ***/ - 'to': function(arr, num) { - if (isUndefined(num)) num = arr.length; - return arr.slice(0, num); - }, - - /*** - * @method compact([all] = false) - * @returns Array - * @short Removes all instances of `undefined`, `null`, and `NaN` from the array. - * @extra If [all] is `true`, all "falsy" elements will be removed. This - * includes empty strings, `0`, and `false`. - * - * @example - * - * [1,null,2,undefined,3].compact() -> [1,2,3] - * [1,'',2,false,3].compact() -> [1,'',2,false,3] - * [1,'',2,false,3].compact(true) -> [1,2,3] - * [null, [null, 'bye']].compact() -> ['hi', [null, 'bye']] - * - * @param {boolean} [all] - * - ***/ - 'compact': function(arr, all) { - return arrayCompact(arr, all); - }, - - /*** - * @method groupBy(map, [groupFn]) - * @returns Object - * @short Groups the array by `map`. - * @extra Will return an object whose keys are the mapped from `map`, which - * can be a callback of type `mapFn`, or a string acting as a shortcut. - * `map` supports `deep properties`. Optionally calls [groupFn] for each group. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @callback groupFn - * - * arr The current group as an array. - * key The unique key of the current group. - * obj A reference to the object. - * - * @example - * - * ['a','aa','aaa'].groupBy('length') -> { 1: ['a'], 2: ['aa'], 3: ['aaa'] } - * - * users.groupBy(function(n) { - * return n.age; - * }); -> users array grouped by age - * - * users.groupBy('age', function(age, users) { - * // iterates each grouping - * }); - * - * @param {string|mapFn} map - * @param {groupFn} groupFn - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'groupBy': function(arr, map, groupFn) { - return arrayGroupBy(arr, map, groupFn); - }, - - /*** - * @method inGroups(num, [padding]) - * @returns Array - * @short Groups the array into `num` arrays. - * @extra If specified, [padding] will be added to the last array to be of - * equal length. - * - * @example - * - * [1,2,3,4,5,6,7].inGroups(3) -> [[1,2,3],[4,5,6],[7]] - * [1,2,3,4,5,6,7].inGroups(3, 0) -> [[1,2,3],[4,5,6],[7,0,0]] - * - * @param {number} num - * @param {any} [padding] - * - ***/ - 'inGroups': function(arr, num, padding) { - var pad = isDefined(padding); - var result = new Array(num); - var divisor = ceil(arr.length / num); - simpleRepeat(num, function(i) { - var index = i * divisor; - var group = arr.slice(index, index + divisor); - if (pad && group.length < divisor) { - simpleRepeat(divisor - group.length, function() { - group.push(padding); - }); - } - result[i] = group; - }); - return result; - }, - - /*** - * @method inGroupsOf(num, [padding] = null) - * @returns Array - * @short Groups the array into arrays of `num` elements each. - * @extra [padding] will be added to the last array to be of equal length. - * - * @example - * - * [1,2,3,4,5,6,7].inGroupsOf(4) -> [ [1,2,3,4], [5,6,7] ] - * [1,2,3,4,5,6,7].inGroupsOf(4, 0) -> [ [1,2,3,4], [5,6,7,0] ] - * - * @param {number} num - * @param {any} [padding] - * - ***/ - 'inGroupsOf': function(arr, num, padding) { - var result = [], len = arr.length, group; - if (len === 0 || num === 0) return arr; - if (isUndefined(num)) num = 1; - if (isUndefined(padding)) padding = null; - simpleRepeat(ceil(len / num), function(i) { - group = arr.slice(num * i, num * i + num); - while(group.length < num) { - group.push(padding); - } - result.push(group); - }); - return result; - }, - - /*** - * @method shuffle() - * @returns Array - * @short Returns a copy of the array with the elements randomized. - * @extra Uses Fisher-Yates algorithm. - * - * @example - * - * [1,2,3,4].shuffle() -> [?,?,?,?] - * - ***/ - 'shuffle': function(arr) { - return arrayShuffle(arr); - }, - - /*** - * @method sample([num] = 1, [remove] = false) - * @returns Mixed - * @short Returns a random element from the array. - * @extra If [num] is passed, will return an array of [num] elements. If - * [remove] is true, sampled elements will also be removed from the - * array. [remove] can also be passed in place of [num]. - * - * @example - * - * [1,2,3,4,5].sample() -> // Random element - * [1,2,3,4,5].sample(1) -> // Array of 1 random element - * [1,2,3,4,5].sample(3) -> // Array of 3 random elements - * - * @param {number} [num] - * @param {boolean} [remove] - * - ***/ - 'sample': function(arr, arg1, arg2) { - var result = [], num, remove, single; - if (isBoolean(arg1)) { - remove = arg1; - } else { - num = arg1; - remove = arg2; - } - if (isUndefined(num)) { - num = 1; - single = true; - } - if (!remove) { - arr = arrayClone(arr); - } - num = min(num, arr.length); - for (var i = 0, index; i < num; i++) { - index = trunc(Math.random() * arr.length); - result.push(arr[index]); - arr.splice(index, 1); - } - return single ? result[0] : result; - }, - - /*** - * @method sortBy([map], [desc] = false) - * @returns Array - * @short Enhanced sorting function that will sort the array by `map`. - * @extra `map` can be a function of type `sortMapFn`, a string acting as a - * shortcut, an array (comparison by multiple values), or blank (direct - * comparison of array values). `map` supports `deep properties`. - * [desc] will sort the array in descending order. When the field being - * sorted on is a string, the resulting order will be determined by an - * internal collation algorithm that is optimized for major Western - * languages, but can be customized using sorting accessors such as - * `sortIgnore`. This method will modify the array! - * - * @callback sortMapFn - * - * el An array element. - * - * @example - * - * ['world','a','new'].sortBy('length') -> ['a','new','world'] - * ['world','a','new'].sortBy('length', true) -> ['world','new','a'] - * users.sortBy(function(n) { - * return n.age; - * }); -> users array sorted by age - * users.sortBy('age') -> users array sorted by age - * - * @param {string|sortMapFn} [map] - * @param {boolean} [desc] - * @callbackParam {ArrayElement} el - * @callbackReturns {NewArrayElement} sortMapFn - * - ***/ - 'sortBy': function(arr, map, desc) { - arr.sort(function(a, b) { - var aProperty = mapWithShortcuts(a, map, arr, [a]); - var bProperty = mapWithShortcuts(b, map, arr, [b]); - return compareValue(aProperty, bProperty) * (desc ? -1 : 1); - }); - return arr; - }, - - /*** - * @method remove(search) - * @returns Array - * @short Removes any element in the array that matches `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * This method will modify the array! Use `exclude` for a - * non-destructive alias. This method implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].remove(3) -> [1,2] - * ['a','b','c'].remove(/b/) -> ['a','c'] - * [{a:1},{b:2}].remove(function(n) { - * return n['a'] == 1; - * }); -> [{b:2}] - * - * @param {ArrayElement|searchFn} search - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'remove': function(arr, f) { - return arrayRemove(arr, f); - }, - - /*** - * @method exclude(search) - * @returns Array - * @short Returns a new array with every element that does not match `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * This method can be thought of as the inverse of `Array#filter`. It - * will not modify the original array, Use `remove` to modify the - * array in place. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].exclude(3) -> [1,2] - * ['a','b','c'].exclude(/b/) -> ['a','c'] - * [{a:1},{b:2}].exclude(function(n) { - * return n['a'] == 1; - * }); -> [{b:2}] - * - * @param {ArrayElement|searchFn} search - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'exclude': function(arr, f) { - return arrayExclude(arr, f); - }, - - /*** - * @method union(arr) - * @returns Array - * @short Returns a new array containing elements in both arrays with - * duplicates removed. - * @extra In addition to primitives, this method will also deep-check objects - * for equality. - * - * @example - * - * [1,3,5].union([5,7,9]) -> [1,3,5,7,9] - * ['a','b'].union(['b','c']) -> ['a','b','c'] - * - * @param {Array} arr - * - ***/ - 'union': function(arr1, arr2) { - return arrayUnique(arrayConcat(arr1, arr2)); - }, - - /*** - * @method intersect(arr) - * @returns Array - * @short Returns a new array containing any elements that both arrays have in - * common. - * @extra In addition to primitives, this method will also deep-check objects - * for equality. - * - * @example - * - * [1,3,5].intersect([5,7,9]) -> [5] - * ['a','b'].intersect(['b','c']) -> ['b'] - * - * @param {Array} arr - * - ***/ - 'intersect': function(arr1, arr2) { - return arrayIntersectOrSubtract(arr1, arr2, false); - } - - }); - - defineInstanceWithArguments(sugarArray, { - - /*** - * @method zip([arr1], [arr2], ...) - * @returns Array - * @short Merges multiple arrays together. - * @extra This method "zips up" smaller arrays into one large whose elements - * are "all elements at index 0", "all elements at index 1", etc. - * Useful when you have associated data that is split over separated - * arrays. If the arrays passed have more elements than the original - * array, they will be discarded. If they have fewer elements, the - * missing elements will filled with `null`. - * - * @example - * - * [1,2,3].zip([4,5,6]) -> [[1,2], [3,4], [5,6]] - * - * @param {Array} arr1 - * @param {Array} arr2 - * - ***/ - 'zip': function(arr, args) { - return map(arr, function(el, i) { - return [el].concat(map(args, function(k) { - return (i in k) ? k[i] : null; - })); - }); - } - - }); - - /*** - * @method insert(item, [index]) - * @returns Array - * @short Appends `item` to the array at [index]. - * @extra This method is simply a more readable alias for `append` when passing - * an index. If `el` is an array it will be joined. This method modifies - * the array! Use `add` as a non-destructive alias. - * - * @example - * - * [1,3,4,5].insert(2, 1) -> [1,2,3,4,5] - * [1,4,5,6].insert([2,3], 1) -> [1,2,3,4,5,6] - * - * @param {ArrayElement|Array} item - * @param {number} [index] - * - ***/ - alias(sugarArray, 'insert', 'append'); - - setArrayChainableConstructor(); - - /*** - * @module Object - * @description Object creation, manipulation, comparison, type checking, and more. - * - * Much thanks to kangax for his informative aricle about how problems with - * instanceof and constructor: http://bit.ly/1Qds27W - * - ***/ - - // Matches bracket-style query strings like user[name] - var DEEP_QUERY_STRING_REG = /^(.+?)(\[.*\])$/; - - // Matches any character not allowed in a decimal number. - var NON_DECIMAL_REG = /[^\d.-]/; - - // Native methods for merging by descriptor when available. - var getOwnPropertyNames = Object.getOwnPropertyNames; - var getOwnPropertySymbols = Object.getOwnPropertySymbols; - var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - - // Basic Helpers - - function isArguments(obj, className) { - className = className || classToString(obj); - // .callee exists on Arguments objects in < IE8 - return hasProperty(obj, 'length') && (className === '[object Arguments]' || !!obj.callee); - } - - // Query Strings | Creating - - function toQueryStringWithOptions(obj, opts) { - opts = opts || {}; - if (isUndefined(opts.separator)) { - opts.separator = '_'; - } - return toQueryString(obj, opts.deep, opts.transform, opts.prefix || '', opts.separator); - } - - function toQueryString(obj, deep, transform, prefix, separator) { - if (isArray(obj)) { - return collectArrayAsQueryString(obj, deep, transform, prefix, separator); - } else if (isObjectType(obj) && obj.toString === internalToString) { - return collectObjectAsQueryString(obj, deep, transform, prefix, separator); - } else if (prefix) { - return getURIComponentValue(obj, prefix, transform); - } - return ''; - } - - function collectArrayAsQueryString(arr, deep, transform, prefix, separator) { - var el, qc, key, result = []; - // Intentionally treating sparse arrays as dense here by avoiding map, - // otherwise indexes will shift during the process of serialization. - for (var i = 0, len = arr.length; i < len; i++) { - el = arr[i]; - key = prefix + (prefix && deep ? '[]' : ''); - if (!key && !isObjectType(el)) { - // If there is no key, then the values of the array should be - // considered as null keys, so use them instead; - qc = sanitizeURIComponent(el); - } else { - qc = toQueryString(el, deep, transform, key, separator); - } - result.push(qc); - } - return result.join('&'); - } - - function collectObjectAsQueryString(obj, deep, transform, prefix, separator) { - var result = []; - forEachProperty(obj, function(val, key) { - var fullKey; - if (prefix && deep) { - fullKey = prefix + '[' + key + ']'; - } else if (prefix) { - fullKey = prefix + separator + key; - } else { - fullKey = key; - } - result.push(toQueryString(val, deep, transform, fullKey, separator)); - }); - return result.join('&'); - } - - function getURIComponentValue(obj, prefix, transform) { - var value; - if (transform) { - value = transform(obj, prefix); - } else if (isDate(obj)) { - value = obj.getTime(); - } else { - value = obj; - } - return sanitizeURIComponent(prefix) + '=' + sanitizeURIComponent(value); - } - - function sanitizeURIComponent(obj) { - // undefined, null, and NaN are represented as a blank string, - // while false and 0 are stringified. - return !obj && obj !== false && obj !== 0 ? '' : encodeURIComponent(obj); - } - - - // Query Strings | Parsing - - function fromQueryStringWithOptions(obj, opts) { - var str = String(obj || '').replace(/^.*?\?/, ''), result = {}, auto; - opts = opts || {}; - if (str) { - forEach(str.split('&'), function(p) { - var split = p.split('='); - var key = decodeURIComponent(split[0]); - var val = split.length === 2 ? decodeURIComponent(split[1]) : ''; - auto = opts.auto !== false; - parseQueryComponent(result, key, val, opts.deep, auto, opts.separator, opts.transform); - }); - } - return result; - } - - function parseQueryComponent(obj, key, val, deep, auto, separator, transform) { - var match; - if (separator) { - key = mapQuerySeparatorToKeys(key, separator); - deep = true; - } - if (deep === true && (match = key.match(DEEP_QUERY_STRING_REG))) { - parseDeepQueryComponent(obj, match, val, deep, auto, separator, transform); - } else { - setQueryProperty(obj, key, val, auto, transform); - } - } - - function parseDeepQueryComponent(obj, match, val, deep, auto, separator, transform) { - var key = match[1]; - var inner = match[2].slice(1, -1).split(']['); - forEach(inner, function(k) { - if (!hasOwn(obj, key)) { - obj[key] = k ? {} : []; - } - obj = getOwn(obj, key); - key = k ? k : obj.length.toString(); - }); - setQueryProperty(obj, key, val, auto, transform); - } - - function mapQuerySeparatorToKeys(key, separator) { - var split = key.split(separator), result = split[0]; - for (var i = 1, len = split.length; i < len; i++) { - result += '[' + split[i] + ']'; - } - return result; - } - - function setQueryProperty(obj, key, val, auto, transform) { - var fnValue; - if (transform) { - fnValue = transform(val, key, obj); - } - if (isDefined(fnValue)) { - val = fnValue; - } else if (auto) { - val = getQueryValueAuto(obj, key, val); - } - obj[key] = val; - } - - function getQueryValueAuto(obj, key, val) { - if (!val) { - return null; - } else if (val === 'true') { - return true; - } else if (val === 'false') { - return false; - } - var num = +val; - if (!isNaN(num) && stringIsDecimal(val)) { - return num; - } - var existing = getOwn(obj, key); - if (val && existing) { - return isArray(existing) ? existing.concat(val) : [existing, val]; - } - return val; - } - - function stringIsDecimal(str) { - return str !== '' && !NON_DECIMAL_REG.test(str); - } - - - // Object Merging - - function mergeWithOptions(target, source, opts) { - opts = opts || {}; - return objectMerge(target, source, opts.deep, opts.resolve, opts.hidden, opts.descriptor); - } - - function defaults(target, sources, opts) { - opts = opts || {}; - opts.resolve = opts.resolve || false; - return mergeAll(target, sources, opts); - } - - function mergeAll(target, sources, opts) { - if (!isArray(sources)) { - sources = [sources]; - } - forEach(sources, function(source) { - return mergeWithOptions(target, source, opts); - }); - return target; - } - - function iterateOverProperties(hidden, obj, fn) { - if (getOwnPropertyNames && hidden) { - iterateOverKeys(getOwnPropertyNames, obj, fn, hidden); - } else { - forEachProperty(obj, fn); - } - if (getOwnPropertySymbols) { - iterateOverKeys(getOwnPropertySymbols, obj, fn, hidden); - } - } - - // "keys" may include symbols - function iterateOverKeys(getFn, obj, fn, hidden) { - var keys = getFn(obj), desc; - for (var i = 0, key; key = keys[i]; i++) { - desc = getOwnPropertyDescriptor(obj, key); - if (desc.enumerable || hidden) { - fn(obj[key], key); - } - } - } - - function mergeByPropertyDescriptor(target, source, prop, sourceVal) { - var descriptor = getOwnPropertyDescriptor(source, prop); - if (isDefined(descriptor.value)) { - descriptor.value = sourceVal; - } - defineProperty(target, prop, descriptor); - } - - function objectMerge(target, source, deep, resolve, hidden, descriptor) { - var resolveByFunction = isFunction(resolve), resolveConflicts = resolve !== false; - - if (isUndefined(target)) { - target = getNewObjectForMerge(source); - } else if (resolveConflicts && isDate(target) && isDate(source)) { - // A date's timestamp is a property that can only be reached through its - // methods, so actively set it up front if both are dates. - target.setTime(source.getTime()); - } - - if (isPrimitive(target)) { - // Will not merge into a primitive type, so simply override. - return source; - } - - // If the source object is a primitive - // type then coerce it into an object. - if (isPrimitive(source)) { - source = coercePrimitiveToObject(source); - } - - iterateOverProperties(hidden, source, function(val, key) { - var sourceVal, targetVal, resolved, goDeep, result; - - sourceVal = source[key]; - - // We are iterating over properties of the source, so hasOwnProperty on - // it is guaranteed to always be true. However, the target may happen to - // have properties in its prototype chain that should not be considered - // as conflicts. - targetVal = getOwn(target, key); - - if (resolveByFunction) { - result = resolve(key, targetVal, sourceVal, target, source); - if (isUndefined(result)) { - // Result is undefined so do not merge this property. - return; - } else if (isDefined(result) && result !== Sugar) { - // If the source returns anything except undefined, then the conflict - // has been resolved, so don't continue traversing into the object. If - // the returned value is the Sugar global object, then allowing Sugar - // to resolve the conflict, so continue on. - sourceVal = result; - resolved = true; - } - } else if (isUndefined(sourceVal)) { - // Will not merge undefined. - return; - } - - // Regex properties are read-only, so intentionally disallowing deep - // merging for now. Instead merge by reference even if deep. - goDeep = !resolved && deep && isObjectType(sourceVal) && !isRegExp(sourceVal); - - if (!goDeep && !resolveConflicts && isDefined(targetVal)) { - return; - } - - if (goDeep) { - sourceVal = objectMerge(targetVal, sourceVal, deep, resolve, hidden, descriptor); - } - - // getOwnPropertyNames is standing in as - // a test for property descriptor support - if (getOwnPropertyNames && descriptor) { - mergeByPropertyDescriptor(target, source, key, sourceVal); - } else { - target[key] = sourceVal; - } - - }); - return target; - } - - function getNewObjectForMerge(source) { - var klass = classToString(source); - // Primitive types, dates, and regexes have no "empty" state. If they exist - // at all, then they have an associated value. As we are only creating new - // objects when they don't exist in the target, these values can come alone - // for the ride when created. - if (isArray(source, klass)) { - return []; - } else if (isPlainObject(source, klass)) { - return {}; - } else if (isDate(source, klass)) { - return new Date(source.getTime()); - } else if (isRegExp(source, klass)) { - return RegExp(source.source, getRegExpFlags(source)); - } else if (isPrimitive(source && source.valueOf())) { - return source; - } - // If the object is not of a known type, then simply merging its - // properties into a plain object will result in something different - // (it will not respond to instanceof operator etc). Similarly we don't - // want to call a constructor here as we can't know for sure what the - // original constructor was called with (Events etc), so throw an - // error here instead. Non-standard types can be handled if either they - // already exist and simply have their properties merged, if the merge - // is not deep so their references will simply be copied over, or if a - // resolve function is used to assist the merge. - throw new TypeError('Must be a basic data type'); - } - - function clone(source, deep) { - var target = getNewObjectForMerge(source); - return objectMerge(target, source, deep, true, true, true); - } - - - // Keys/Values - - function objectSize(obj) { - return getKeysWithObjectCoercion(obj).length; - } - - function getKeysWithObjectCoercion(obj) { - return getKeys(coercePrimitiveToObject(obj)); - } - - function getValues(obj) { - var values = []; - forEachProperty(obj, function(val) { - values.push(val); - }); - return values; - } - - function tap(obj, arg) { - var fn = arg; - if (!isFunction(arg)) { - fn = function() { - if (arg) obj[arg](); - }; - } - fn.call(obj, obj); - return obj; - } - - // Select/Reject - - function objectSelect(obj, f) { - return selectFromObject(obj, f, true); - } - - function objectReject(obj, f) { - return selectFromObject(obj, f, false); - } - - function selectFromObject(obj, f, select) { - var match, result = {}; - f = [].concat(f); - forEachProperty(obj, function(val, key) { - match = false; - for (var i = 0; i < f.length; i++) { - if (matchInObject(f[i], key)) { - match = true; - } - } - if (match === select) { - result[key] = val; - } - }); - return result; - } - - function matchInObject(match, key) { - if (isRegExp(match)) { - return match.test(key); - } else if (isObjectType(match)) { - return key in match; - } else { - return key === String(match); - } - } - - // Remove/Exclude - - function objectRemove(obj, f) { - var matcher = getMatcher(f); - forEachProperty(obj, function(val, key) { - if (matcher(val, key, obj)) { - delete obj[key]; - } - }); - return obj; - } - - function objectExclude(obj, f) { - var result = {}; - var matcher = getMatcher(f); - forEachProperty(obj, function(val, key) { - if (!matcher(val, key, obj)) { - result[key] = val; - } - }); - return result; - } - - function objectIntersectOrSubtract(obj1, obj2, subtract) { - if (!isObjectType(obj1)) { - return subtract ? obj1 : {}; - } - obj2 = coercePrimitiveToObject(obj2); - function resolve(key, val, val1) { - var exists = key in obj2 && isEqual(val1, obj2[key]); - if (exists !== subtract) { - return val1; - } - } - return objectMerge({}, obj1, false, resolve); - } - - /*** - * @method is[Type]() - * @returns Boolean - * @short Returns true if the object is an object of that type. - * - * @set - * isArray - * isBoolean - * isDate - * isError - * isFunction - * isMap - * isNumber - * isRegExp - * isSet - * isString - * - * @example - * - * Object.isArray([3]) -> true - * Object.isNumber(3) -> true - * Object.isString(8) -> false - * - ***/ - function buildClassCheckMethods() { - var checks = [isBoolean, isNumber, isString, isDate, isRegExp, isFunction, isArray, isError, isSet, isMap]; - defineInstanceAndStaticSimilar(sugarObject, NATIVE_TYPES, function(methods, name, i) { - methods['is' + name] = checks[i]; - }); - } - - defineStatic(sugarObject, { - - /*** - * @method fromQueryString(str, [options]) - * @returns Object - * @static - * @short Converts the query string of a URL into an object. - * @extra Options can be passed with [options] for more control over the result. - * - * @options - * - * deep If the string contains "deep" syntax `foo[]`, this will - * be automatically converted to an array. (Default `false`) - * - * auto If `true`, booleans `"true"` and `"false"`, numbers, and arrays - * (repeated keys) will be automatically cast to native - * values. (Default `true`) - * - * transform A function of type `transformFn` whose return value becomes - * the final value. If the function returns `undefined`, then the - * original value will be used. This allows the function to - * intercept only certain keys or values. (Default `undefined`) - * - * separator If passed, keys will be split on this string to extract - * deep values. (Default `''`) - * - * @callback transformFn - * - * key The key component of the query string (before `=`). - * val The value component of the query string (after `=`). - * obj A reference to the object being built. - * - * @example - * - * Object.fromQueryString('a=1&b=2') -> {a:1,b:2} - * Object.fromQueryString('a[]=1&a[]=2',{deep:true}) -> {a:['1','2']} - * Object.fromQueryString('a_b=c',{separator:'_'}) -> {a:{b:'c'}} - * Object.fromQueryString('id=123', {transform:idToNumber}); - * - * @param {string} str - * @param {QueryStringParseOptions} options - * @callbackParam {string} key - * @callbackParam {Property} val - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} transformFn - * @option {boolean} [deep] - * @option {boolean} [auto] - * @option {string} [separator] - * @option {transformFn} [transform] - * - ***/ - 'fromQueryString': function(obj, options) { - return fromQueryStringWithOptions(obj, options); - } - - }); - - defineInstanceAndStatic(sugarObject, { - - /*** - * @method has(key, [inherited] = false) - * @returns Boolean - * @short Checks if the object has property `key`. - * @extra Supports `deep properties`. If [inherited] is `true`, - * properties defined in the prototype chain will also return `true`. - * The default of `false` for this argument makes this method suited - * to working with objects as data stores by default. - * - * @example - * - * Object.has(usersByName, 'Harry') -> true - * Object.has(data, 'users[1].profile') -> true - * Object.has([], 'forEach') -> false - * Object.has([], 'forEach', true) -> true - * - * @param {string} key - * @param {boolean} [inherited] - * - ***/ - 'has': function(obj, key, any) { - return deepHasProperty(obj, key, any); - }, - - /*** - * @method get(key, [inherited] = false) - * @returns Mixed - * @short Gets a property of the object. - * @extra Supports `deep properties`. If [inherited] is `true`, - * properties defined in the prototype chain will also be returned. - * The default of `false` for this argument makes this method suited - * to working with objects as data stores by default. - * - * @example - * - * Object.get(Harry, 'name'); -> 'Harry' - * Object.get(Harry, 'profile.likes'); -> Harry's likes - * Object.get(data, 'users[3].name') -> User 3's name - * Object.get(data, 'users[1..2]') -> Users 1 and 2 - * Object.get(data, 'users[1..2].name') -> Names of users 1 and 2 - * Object.get(data, 'users[-2..-1]') -> Last 2 users - * - * @param {string} key - * @param {boolean} [inherited] - * - ***/ - 'get': function(obj, key, any) { - return deepGetProperty(obj, key, any); - }, - - /*** - * @method set(key, val) - * @returns Object - * @short Sets a property on the object. - * @extra Using a dot or square bracket in `key` is considered "deep" syntax, - * and will attempt to traverse into the object to set the property, - * creating properties that do not exist along the way. If the missing - * property is referenced using square brackets, an empty array will be - * created, otherwise an empty object. A special `[]` carries the - * meaning of "the last index + 1", and will effectively push `val` - * onto the end of the array. Lastly, a `..` separator inside the - * brackets is "range" notation, and will set properties on all - * elements in the specified range. Range members may be negative, - * which will be offset from the end of the array. - * - * @example - * - * Object.set({}, 'name', 'Harry'); -> {name:'Harry'} - * Object.set({}, 'user.name', 'Harry'); -> {user:{name:'Harry'}} - * Object.set({}, 'users[].name', 'Bob') -> {users:[{name:'Bob'}} - * Object.set({}, 'users[1].name','Bob') -> {users:[undefined, {name:'Bob'}]} - * Object.set({}, 'users[0..1].name','Bob') -> {users:[{name:'Bob'},{name:'Bob'}]} - * - * @param {string} key - * @param {Property} val - * - ***/ - 'set': function(obj, key, val) { - return deepSetProperty(obj, key, val); - }, - - /*** - * @method size() - * @returns Number - * @short Returns the number of properties in the object. - * - * @example - * - * Object.size({foo:'bar'}) -> 1 - * - ***/ - 'size': function(obj) { - return objectSize(obj); - }, - - /*** - * @method isEmpty() - * @returns Boolean - * @short Returns true if the number of properties in the object is zero. - * - * @example - * - * Object.isEmpty({}) -> true - * Object.isEmpty({a:1}) -> false - * - ***/ - 'isEmpty': function(obj) { - return objectSize(obj) === 0; - }, - - /*** - * @method toQueryString([options]) - * @returns Object - * @short Converts the object into a query string. - * @extra Accepts deep objects and arrays. [options] can be passed for more - * control over the result. - * - * @options - * - * deep If `true`, non-standard "deep" syntax `foo[]` will be - * used for output. Note that `separator` will be ignored, - * as this option overrides shallow syntax. (Default `false`) - * - * prefix If passed, this string will be prefixed to all keys, - * separated by the `separator`. (Default `''`). - * - * transform A function of type `transformFn` whose return value becomes - * the final value in the string. (Default `undefined`) - * - * separator A string that is used to separate keys, either for deep - * objects, or when `prefix` is passed.(Default `_`). - * - * @callback transformFn - * - * key The key of the current iteration. - * val The value of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.toQueryString({foo:'bar'}) -> 'foo=bar' - * Object.toQueryString({foo:['a','b']}) -> 'foo=a&foo=b' - * Object.toQueryString({foo:['a','b']}, {deep:true}) -> 'foo[]=a&foo[]=b' - * - * @param {Object} obj - * @param {QueryStringOptions} [options] - * @callbackParam {string} key - * @callbackParam {Property} val - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} transformFn - * @option {boolean} [deep] - * @option {string} [prefix] - * @option {string} [separator] - * @option {transformFn} [transform] - * - ***/ - 'toQueryString': function(obj, options) { - return toQueryStringWithOptions(obj, options); - }, - - /*** - * @method isEqual(obj) - * @returns Boolean - * @short Returns `true` if `obj` is equivalent to the object. - * @extra If both objects are built-in types, they will be considered - * equivalent if they are not "observably distinguishable". This means - * that objects that can otherwise be considered equivalent (primitives - * and their object counterparts, `0` and `-0`, sparse and dense arrays) - * will return `false`. Functions and non-built-ins like instances of - * user-defined classes and host objects like Element and Event are - * strictly compared with `===`, and will only be equivalent if they - * are the same reference. Plain objects as well as Arrays will be - * traversed into and deeply checked by their non-inherited, enumerable - * properties. Other allowed types include Typed Arrays, Sets, Maps, - * Arguments, Dates, Regexes, and Errors. - * - * @example - * - * Object.isEqual({a:2}, {a:2}) -> true - * Object.isEqual({a:2}, {a:3}) -> false - * Object.isEqual(5, Object(5)) -> false - * Object.isEqual(Object(5), Object(5)) -> true - * Object.isEqual(NaN, NaN) -> false - * - * @param {Object} obj - * - ***/ - 'isEqual': function(obj1, obj2) { - return isEqual(obj1, obj2); - }, - - /*** - * @method merge(source, [options]) - * @returns Object - * @short Merges properties from `source` into the object. - * @extra This method will modify the object! Use `add` for a non-destructive - * alias. - * - * @options - * - * deep If `true` deep properties are merged recursively. - * (Default `false`) - * - * hidden If `true`, non-enumerable properties will be merged as well. - * (Default `false`) - * - * descriptor If `true`, properties will be merged by property descriptor. - * Use this option to merge getters or setters, or to preserve - * `enumerable`, `configurable`, etc. - * (Default `false`) - * - * resolve Determines which property wins in the case of conflicts. - * If `true`, `source` wins. If `false`, the original property - * wins. A function of type `resolveFn` may also be passed, - * whose return value will decide the result. Any non-undefined - * return value will resolve the conflict for that property - * (will not continue if `deep`). Returning `undefined` will do - * nothing (no merge). Finally, returning the global object - * `Sugar` will allow Sugar to handle the merge as normal. - * (Default `true`) - * - * @callback resolveFn - * - * key The key of the current iteration. - * targetVal The current value for the key in the target. - * sourceVal The current value for the key in `source`. - * target The target object. - * source The source object. - * - * @example - * - * Object.merge({one:1},{two:2}) -> {one:1,two:2} - * Object.merge({one:1},{one:9,two:2}) -> {one:9,two:2} - * Object.merge({x:{a:1}},{x:{b:2}},{deep:true}) -> {x:{a:1,b:2}} - * Object.merge({a:1},{a:2},{resolve:mergeAdd}) -> {a:3} - * - * @param {Object} source - * @param {ObjectMergeOptions} [options] - * @callbackParam {string} key - * @callbackParam {Property} targetVal - * @callbackParam {Property} sourceVal - * @callbackParam {Object} target - * @callbackParam {Object} source - * @callbackReturns {boolean} resolveFn - * @option {boolean} [deep] - * @option {boolean} [hidden] - * @option {boolean} [descriptor] - * @option {boolean|resolveFn} [resolve] - * - ***/ - 'merge': function(target, source, opts) { - return mergeWithOptions(target, source, opts); - }, - - /*** - * @method add(obj, [options]) - * @returns Object - * @short Adds properties in `obj` and returns a new object. - * @extra This method will not modify the original object. See `merge` for options. - * - * @example - * - * Object.add({one:1},{two:2}) -> {one:1,two:2} - * Object.add({one:1},{one:9,two:2}) -> {one:9,two:2} - * Object.add({x:{a:1}},{x:{b:2}},{deep:true}) -> {x:{a:1,b:2}} - * Object.add({a:1},{a:2},{resolve:mergeAdd}) -> {a:3} - * - * @param {Object} obj - * @param {ObjectMergeOptions} [options] - * - ***/ - 'add': function(obj1, obj2, opts) { - return mergeWithOptions(clone(obj1), obj2, opts); - }, - - /*** - * @method mergeAll(sources, [options]) - * @returns Object - * @short Merges properties from an array of `sources`. - * @extra This method will modify the object! Use `addAll` for a non-destructive - * alias. See `merge` for options. - * - * @example - * - * Object.mergeAll({one:1},[{two:2},{three:3}]) -> {one:1,two:2,three:3} - * Object.mergeAll({x:{a:1}},[{x:{b:2}},{x:{c:3}}],{deep:true}) -> {x:{a:1,b:2,c:3}} - * - * @param {Array} sources - * @param {ObjectMergeOptions} [options] - * - ***/ - 'mergeAll': function(target, sources, opts) { - return mergeAll(target, sources, opts); - }, - - /*** - * @method addAll(sources, [options]) - * @returns Object - * @short Adds properties from an array of `sources` and returns a new object. - * @extra This method will not modify the object. See `merge` for options. - * - * @example - * - * Object.addAll({one:1},[{two:2},{three:3}]) -> {one:1,two:2,three:3} - * Object.addAll({x:{a:1}},[{x:{b:2}},{x:{c:3}}],{deep:true}) -> {x:{a:1,b:2,c:3}} - * - * @param {Array} sources - * @param {ObjectMergeOptions} [options] - * - ***/ - 'addAll': function(obj, sources, opts) { - return mergeAll(clone(obj), sources, opts); - }, - - /*** - * @method defaults(sources, [options]) - * @returns Object - * @short Merges properties from one or multiple `sources` while preserving - * the object's defined properties. - * @extra This method modifies the object! See `merge` for options. - * - * @example - * - * Object.defaults({one:1},[{one:9},{two:2}]) -> {one:1,two:2} - * Object.defaults({x:{a:1}},[{x:{a:9}},{x:{b:2}}],{deep:true}) -> {x:{a:1,b:2}} - * - * @param {Array} sources - * @param {ObjectMergeOptions} [options] - * - ***/ - 'defaults': function(target, sources, opts) { - return defaults(target, sources, opts); - }, - - /*** - * @method intersect(obj) - * @returns Object - * @short Returns a new object whose properties are those that the object has - * in common both with `obj`. - * @extra If both key and value do not match, then the property will not be included. - * - * @example - * - * Object.intersect({a:'a'},{b:'b'}) -> {} - * Object.intersect({a:'a'},{a:'b'}) -> {} - * Object.intersect({a:'a',b:'b'},{b:'b',z:'z'}) -> {b:'b'} - * - * @param {Object} obj - * - ***/ - 'intersect': function(obj1, obj2) { - return objectIntersectOrSubtract(obj1, obj2, false); - }, - - /*** - * @method subtract(obj) - * @returns Object - * @short Returns a clone of the object with any properties shared with `obj` excluded. - * @extra If both key and value do not match, then the property will not be excluded. - * - * @example - * - * Object.subtract({a:'a',b:'b'},{b:'b'}) -> {a:'a'} - * Object.subtract({a:'a',b:'b'},{a:'b'}) -> {a:'a',b:'b'} - * - * @param {Object} obj - * - ***/ - 'subtract': function(obj1, obj2) { - return objectIntersectOrSubtract(obj1, obj2, true); - }, - - /*** - * @method clone([deep] = false) - * @returns Object - * @short Creates a clone of the object. - * @extra Default is a shallow clone, unless [deep] is true. - * - * @example - * - * Object.clone({foo:'bar'}) -> creates shallow clone - * Object.clone({foo:'bar'}, true) -> creates a deep clone - * - * @param {boolean} [deep] - * - ***/ - 'clone': function(obj, deep) { - return clone(obj, deep); - }, - - /*** - * @method values() - * @returns Array - * @short Returns an array containing the values in the object. - * @extra Values are in no particular order. Does not include inherited or - * non-enumerable properties. - * - * @example - * - * Object.values({a:'a',b:'b'}) -> ['a','b'] - * - ***/ - 'values': function(obj) { - return getValues(obj); - }, - - /*** - * @method invert([multi] = false) - * @returns Object - * @short Creates a new object with the keys and values swapped. - * @extra If [multi] is true, values will be an array of all keys, othewise - * collisions will be overwritten. - * - * @example - * - * Object.invert({foo:'bar'}) -> {bar:'foo'} - * Object.invert({a:1,b:1}, true) -> {1:['a','b']} - * - * @param {boolean} [multi] - * - ***/ - 'invert': function(obj, multi) { - var result = {}; - multi = multi === true; - forEachProperty(obj, function(val, key) { - if (hasOwn(result, val) && multi) { - result[val].push(key); - } else if (multi) { - result[val] = [key]; - } else { - result[val] = key; - } - }); - return result; - }, - - /*** - * @method tap(tapFn) - * @returns Object - * @short Runs `tapFn` and returns the object. - * @extra A string can also be used as a shortcut to `tapFn`. This method is - * designed to run an intermediary function that "taps into" a method - * chain. As such, it is fairly useless as a static method. However it - * can be quite useful when combined with chainables. - * - * @callback tapFn - * - * obj A reference to the object. - * - * @example - * - * Sugar.Array([1,4,9]).map(Math.sqrt).tap('pop') -> [1,2] - * Sugar.Object({a:'a'}).tap(logArgs).merge({b:'b'}) -> {a:'a',b:'b'} - * - * @param {tapFn} tapFn - * @callbackParam {Object} obj - * @callbackReturns {any} tapFn - * - ***/ - 'tap': function(obj, arg) { - return tap(obj, arg); - }, - - /*** - * @method isArguments() - * @returns Boolean - * @short Returns true if the object is an arguments object. - * - * @example - * - * Object.isArguments([1]) -> false - * - ***/ - 'isArguments': function(obj) { - return isArguments(obj); - }, - - /*** - * @method isObject() - * @returns Boolean - * @short Returns true if the object is a "plain" object. - * @extra Plain objects do not include instances of classes or "host" objects, - * such as Elements, Events, etc. - * - * @example - * - * Object.isObject({ broken:'wear' }) -> true - * - ***/ - 'isObject': function(obj) { - return isPlainObject(obj); - }, - - /*** - * @method remove(search) - * @returns Object - * @short Deletes all properties in the object matching `search`. - * @extra `search` may be any property or a function of type `searchFn`. This - * method will modify the object!. Implements `enhanced matching`. - * - * @callback searchFn - * - * key The key of the current iteration. - * val The value of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.remove({a:'a',b:'b'}, 'a'); -> {b:'b'} - * Object.remove({a:'a',b:'b',z:'z'}, /[a-f]/); -> {z:'z'} - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'remove': function(obj, f) { - return objectRemove(obj, f); - }, - - /*** - * @method exclude(search) - * @returns Object - * @short Returns a new object with all properties matching `search` removed. - * @extra `search` may be any property or a function of type `searchFn`. This - * is a non-destructive version of `remove` and will not modify the - * object. Implements `enhanced matching`. - * - * @callback searchFn - * - * key The key of the current iteration. - * val The value of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.exclude({a:'a',b:'b'}, 'a'); -> {b:'b'} - * Object.exclude({a:'a',b:'b',z:'z'}, /[a-f]/); -> {z:'z'} - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'exclude': function(obj, f) { - return objectExclude(obj, f); - }, - - /*** - * @method select(find) - * @returns Object - * @short Builds a new object containing the keys specified in `find`. - * @extra When `find` is a string, a single key will be selected. Arrays or - * objects match multiple keys, and a regex will match keys by regex. - * - * @example - * - * Object.select({a:1,b:2}, 'a') -> {a:1} - * Object.select({a:1,b:2}, ['a', 'b']) -> {a:1,b:2} - * Object.select({a:1,b:2}, /[a-z]/) -> {a:1,b:2} - * Object.select({a:1,b:2}, {a:'a',b:'b'}) -> {a:1,b:2} - * - * @param {string|RegExp|Array|Object} find - * - ***/ - 'select': function(obj, f) { - return objectSelect(obj, f); - }, - - /*** - * @method reject(find) - * @returns Object - * @short Builds a new object containing all keys except those in `find`. - * @extra When `find` is a string, a single key will be rejected. Arrays or - * objects match multiple keys, and a regex will match keys by regex. - * - * @example - * - * Object.reject({a:1,b:2}, 'a') -> {b:2} - * Object.reject({a:1,b:2}, /[a-z]/) -> {} - * Object.reject({a:1,b:2}, {a:'a'}) -> {b:2} - * Object.reject({a:1,b:2}, ['a', 'b']) -> {} - * - * @param {string|RegExp|Array|Object} find - * - ***/ - 'reject': function(obj, f) { - return objectReject(obj, f); - } - - }); - - // TODO: why is this here? - defineInstance(sugarObject, { - - /*** - * @method keys() - * @returns Array - * @polyfill ES5 - * @short Returns an array containing the keys of all of the non-inherited, - * enumerable properties of the object. - * - * @example - * - * Object.keys({a:'a',b:'b'}) -> ['a','b'] - * - ***/ - 'keys': function(obj) { - return getKeys(obj); - } - - }); - - buildClassCheckMethods(); - - /*** - * @module Enumerable - * @description Counting, mapping, and finding methods on both arrays and objects. - * - ***/ - - function sum(obj, map) { - var sum = 0; - enumerateWithMapping(obj, map, function(val) { - sum += val; - }); - return sum; - } - - function average(obj, map) { - var sum = 0, count = 0; - enumerateWithMapping(obj, map, function(val) { - sum += val; - count++; - }); - // Prevent divide by 0 - return sum / (count || 1); - } - - function median(obj, map) { - var result = [], middle, len; - enumerateWithMapping(obj, map, function(val) { - result.push(val); - }); - len = result.length; - if (!len) return 0; - result.sort(function(a, b) { - // IE7 will throw errors on non-numbers! - return (a || 0) - (b || 0); - }); - middle = trunc(len / 2); - return len % 2 ? result[middle] : (result[middle - 1] + result[middle]) / 2; - } - - function getMinOrMax(obj, arg1, arg2, max, asObject) { - var result = [], pushVal, edge, all, map; - if (isBoolean(arg1)) { - all = arg1; - map = arg2; - } else { - map = arg1; - } - enumerateWithMapping(obj, map, function(val, key) { - if (isUndefined(val)) { - throw new TypeError('Cannot compare with undefined'); - } - pushVal = asObject ? key : obj[key]; - if (val === edge) { - result.push(pushVal); - } else if (isUndefined(edge) || (max && val > edge) || (!max && val < edge)) { - result = [pushVal]; - edge = val; - } - }); - return getReducedMinMaxResult(result, obj, all, asObject); - } - - function getLeastOrMost(obj, arg1, arg2, most, asObject) { - var group = {}, refs = [], minMaxResult, result, all, map; - if (isBoolean(arg1)) { - all = arg1; - map = arg2; - } else { - map = arg1; - } - enumerateWithMapping(obj, map, function(val, key) { - var groupKey = serializeInternal(val, refs); - var arr = getOwn(group, groupKey) || []; - arr.push(asObject ? key : obj[key]); - group[groupKey] = arr; - }); - minMaxResult = getMinOrMax(group, !!all, 'length', most, true); - if (all) { - result = []; - // Flatten result - forEachProperty(minMaxResult, function(val) { - result = result.concat(val); - }); - } else { - result = getOwn(group, minMaxResult); - } - return getReducedMinMaxResult(result, obj, all, asObject); - } - - - // Support - - function getReducedMinMaxResult(result, obj, all, asObject) { - if (asObject && all) { - // The method has returned an array of keys so use this array - // to build up the resulting object in the form we want it in. - return result.reduce(function(o, key) { - o[key] = obj[key]; - return o; - }, {}); - } else if (result && !all) { - result = result[0]; - } - return result; - } - - function enumerateWithMapping(obj, map, fn) { - var arrayIndexes = isArray(obj); - forEachProperty(obj, function(val, key) { - if (arrayIndexes) { - if (!isArrayIndex(key)) { - return; - } - key = +key; - } - var mapped = mapWithShortcuts(val, map, obj, [val, key, obj]); - fn(mapped, key); - }); - } - - /*** @namespace Array ***/ - - // Flag allowing native array methods to be enhanced - var ARRAY_ENHANCEMENTS_FLAG = 'enhanceArray'; - - // Enhanced map function - var enhancedMap = buildEnhancedMapping('map'); - - // Enhanced matcher methods - var enhancedFind = buildEnhancedMatching('find'), - enhancedSome = buildEnhancedMatching('some'), - enhancedEvery = buildEnhancedMatching('every'), - enhancedFilter = buildEnhancedMatching('filter'), - enhancedFindIndex = buildEnhancedMatching('findIndex'); - - function arrayNone() { - return !enhancedSome.apply(this, arguments); - } - - function arrayCount(arr, f) { - if (isUndefined(f)) { - return arr.length; - } - return enhancedFilter.apply(this, arguments).length; - } - - // Enhanced methods - - function buildEnhancedMapping(name) { - return wrapNativeArrayMethod(name, enhancedMapping); - } - - - function buildEnhancedMatching(name) { - return wrapNativeArrayMethod(name, enhancedMatching); - } - - function enhancedMapping(map, context) { - if (isFunction(map)) { - return map; - } else if (map) { - return function(el, i, arr) { - return mapWithShortcuts(el, map, context, [el, i, arr]); - }; - } - } - - function enhancedMatching(f) { - var matcher; - if (isFunction(f)) { - return f; - } - matcher = getMatcher(f); - return function(el, i, arr) { - return matcher(el, i, arr); - }; - } - - function wrapNativeArrayMethod(methodName, wrapper) { - var nativeFn = Array.prototype[methodName]; - return function(arr, f, context, argsLen) { - var args = new Array(2); - assertArgument(argsLen > 0); - args[0] = wrapper(f, context); - args[1] = context; - return nativeFn.apply(arr, args); - }; - } - - - /*** - * @method [fn]FromIndex(startIndex, [loop], ...) - * @returns Mixed - * @short Runs native array functions beginning from `startIndex`. - * @extra If [loop] is `true`, once the end of the array has been reached, - * iteration will continue from the start of the array up to - * `startIndex - 1`. If [loop] is false it can be omitted. Standard - * arguments are then passed which will be forwarded to the native - * methods. When available, methods are always `enhanced`. This includes - * `deep properties` for `map`, and `enhanced matching` for `some`, - * `every`, `filter`, `find`, and `findIndex`. Note also that - * `forEachFromIndex` is optimized for sparse arrays and may be faster - * than native `forEach`. - * - * @set - * mapFromIndex - * forEachFromIndex - * filterFromIndex - * someFromIndex - * everyFromIndex - * reduceFromIndex - * reduceRightFromIndex - * findFromIndex - * findIndexFromIndex - * - * @example - * - * users.mapFromIndex(2, 'name'); - * users.mapFromIndex(2, true, 'name'); - * names.forEachFromIndex(10, log); - * names.everyFromIndex(15, /^[A-F]/); - * - * @signature [fn]FromIndex(startIndex, ...) - * @param {number} startIndex - * @param {boolean} loop - * - ***/ - function buildFromIndexMethods() { - - var methods = { - 'forEach': { - base: forEachAsNative - }, - 'map': { - wrapper: enhancedMapping - }, - 'some every': { - wrapper: enhancedMatching - }, - 'findIndex': { - wrapper: enhancedMatching, - result: indexResult - }, - 'reduce': { - apply: applyReduce - }, - 'filter find': { - wrapper: enhancedMatching - }, - 'reduceRight': { - apply: applyReduce, - slice: sliceArrayFromRight, - clamp: clampStartIndexFromRight - } - }; - - forEachProperty(methods, function(opts, key) { - forEach(spaceSplit(key), function(baseName) { - var methodName = baseName + 'FromIndex'; - var fn = createFromIndexWithOptions(baseName, opts); - defineInstanceWithArguments(sugarArray, methodName, fn); - }); - }); - - function forEachAsNative(fn) { - forEach(this, fn); - } - - // Methods like filter and find have a direct association between the value - // returned by the callback and the element of the current iteration. This - // means that when looping, array elements must match the actual index for - // which they are being called, so the array must be sliced. This is not the - // case for methods like forEach and map, which either do not use return - // values or use them in a way that simply getting the element at a shifted - // index will not affect the final return value. However, these methods will - // still fail on sparse arrays, so always slicing them here. For example, if - // "forEachFromIndex" were to be called on [1,,2] from index 1, although the - // actual index 1 would itself would be skipped, when the array loops back to - // index 0, shifting it by adding 1 would result in the element for that - // iteration being undefined. For shifting to work, all gaps in the array - // between the actual index and the shifted index would have to be accounted - // for. This is infeasible and is easily solved by simply slicing the actual - // array instead so that gaps align. Note also that in the case of forEach, - // we are using the internal function which handles sparse arrays in a way - // that does not increment the index, and so is highly optimized compared to - // the others here, which are simply going through the native implementation. - function sliceArrayFromLeft(arr, startIndex, loop) { - var result = arr; - if (startIndex) { - result = arr.slice(startIndex); - if (loop) { - result = result.concat(arr.slice(0, startIndex)); - } - } - return result; - } - - // When iterating from the right, indexes are effectively shifted by 1. - // For example, iterating from the right from index 2 in an array of 3 - // should also include the last element in the array. This matches the - // "lastIndexOf" method which also iterates from the right. - function sliceArrayFromRight(arr, startIndex, loop) { - if (!loop) { - startIndex += 1; - arr = arr.slice(0, max(0, startIndex)); - } - return arr; - } - - function clampStartIndex(startIndex, len) { - return min(len, max(0, startIndex)); - } - - // As indexes are shifted by 1 when starting from the right, clamping has to - // go down to -1 to accommodate the full range of the sliced array. - function clampStartIndexFromRight(startIndex, len) { - return min(len, max(-1, startIndex)); - } - - function applyReduce(arr, startIndex, fn, context, len, loop) { - return function(acc, val, i) { - i = getNormalizedIndex(i + startIndex, len, loop); - return fn.call(arr, acc, val, i, arr); - }; - } - - function applyEach(arr, startIndex, fn, context, len, loop) { - return function(el, i) { - i = getNormalizedIndex(i + startIndex, len, loop); - return fn.call(context, arr[i], i, arr); - }; - } - - function indexResult(result, startIndex, len) { - if (result !== -1) { - result = (result + startIndex) % len; - } - return result; - } - - function createFromIndexWithOptions(methodName, opts) { - - var baseFn = opts.base || Array.prototype[methodName], - applyCallback = opts.apply || applyEach, - sliceArray = opts.slice || sliceArrayFromLeft, - clampIndex = opts.clamp || clampStartIndex, - getResult = opts.result, - wrapper = opts.wrapper; - - return function(arr, startIndex, args) { - var callArgs = [], argIndex = 0, lastArg, result, len, loop, fn; - len = arr.length; - if (isBoolean(args[0])) { - loop = args[argIndex++]; - } - fn = args[argIndex++]; - lastArg = args[argIndex]; - if (startIndex < 0) { - startIndex += len; - } - startIndex = clampIndex(startIndex, len); - assertArgument(args.length); - fn = wrapper ? wrapper(fn, lastArg) : fn; - callArgs.push(applyCallback(arr, startIndex, fn, lastArg, len, loop)); - if (lastArg) { - callArgs.push(lastArg); - } - result = baseFn.apply(sliceArray(arr, startIndex, loop), callArgs); - if (getResult) { - result = getResult(result, startIndex, len); - } - return result; - }; - } - } - - defineInstance(sugarArray, { - - /*** - * @method map(map, [context]) - * @returns New Array - * @polyfill ES5 - * @short Maps the array to another array whose elements are the values - * returned by `map`. - * @extra [context] is the `this` object. Sugar enhances this method to accept - * a string for `map`, which is a shortcut for a function that gets - * a property or invokes a function on each element. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].map(function(n) { - * return n * 3; - * }); -> [3,6,9] - * - * ['a','aa','aaa'].map('length') -> [1,2,3] - * ['A','B','C'].map('toLowerCase') -> ['a','b','c'] - * users.map('name') -> array of user names - * - * @param {string|mapFn} map - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'map': fixArgumentLength(enhancedMap), - - /*** - * @method some(search, [context]) - * @returns Boolean - * @polyfill ES5 - * @short Returns true if `search` is true for any element in the array. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','b','c'].some(function(n) { - * return n == 'a'; - * }); - * ['a','b','c'].some(function(n) { - * return n == 'd'; - * }); - * ['a','b','c'].some('a') -> true - * [{a:2},{b:5}].some({a:2}) -> true - * users.some({ name: /^H/ }) -> true if any have a name starting with H - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'some': fixArgumentLength(enhancedSome), - - /*** - * @method every(search, [context]) - * @returns Boolean - * @polyfill ES5 - * @short Returns true if `search` is true for all elements of the array. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','a','a'].every(function(n) { - * return n == 'a'; - * }); - * ['a','a','a'].every('a') -> true - * [{a:2},{a:2}].every({a:2}) -> true - * users.every({ name: /^H/ }) -> true if all have a name starting with H - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'every': fixArgumentLength(enhancedEvery), - - /*** - * @method filter(search, [context]) - * @returns Array - * @polyfill ES5 - * @short Returns any elements in the array that match `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].filter(function(n) { - * return n > 1; - * }); - * [1,2,2,4].filter(2) -> 2 - * users.filter({ name: /^H/ }) -> all users with a name starting with H - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'filter': fixArgumentLength(enhancedFilter), - - /*** - * @method find(search, [context]) - * @returns Mixed - * @polyfill ES6 - * @short Returns the first element in the array that matches `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * users.find(function(user) { - * return user.name === 'Harry'; - * }); -> harry! - * - * users.find({ name: 'Harry' }); -> harry! - * users.find({ name: /^[A-H]/ }); -> First user with name starting with A-H - * users.find({ titles: ['Ms', 'Dr'] }); -> not harry! - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'find': fixArgumentLength(enhancedFind), - - /*** - * @method findIndex(search, [context]) - * @returns Number - * @polyfill ES6 - * @short Returns the index of the first element in the array that matches - * `search`, or `-1` if none. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3,4].findIndex(function(n) { - * return n % 2 == 0; - * }); -> 1 - * ['a','b','c'].findIndex('c'); -> 2 - * ['cuba','japan','canada'].find(/^c/) -> 0 - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'findIndex': fixArgumentLength(enhancedFindIndex) - - }, [ENHANCEMENTS_FLAG, ARRAY_ENHANCEMENTS_FLAG]); - - - defineInstance(sugarArray, { - - /*** - * @method none(search, [context]) - * - * @returns Boolean - * @short Returns true if none of the elements in the array match `search`. - * @extra `search` can be an array element or a function of type `searchFn`. - * [context] is the `this` object. Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].none(5) -> true - * ['a','b','c'].none(/b/) -> false - * users.none(function(user) { - * return user.name == 'Wolverine'; - * }); -> probably true - * users.none({ name: 'Wolverine' }); -> same as above - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'none': fixArgumentLength(arrayNone), - - /*** - * @method count(search, [context]) - * @returns Number - * @short Counts all elements in the array that match `search`. - * @extra `search` can be an element or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * ['a','b','a'].count('a') -> 2 - * ['a','b','c'].count(/b/) -> 1 - * users.count(function(user) { - * return user.age > 30; - * }); -> number of users older than 30 - * - * @param {ArrayElement|searchFn} search - * @param {any} context - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {boolean} searchFn - * - ***/ - 'count': fixArgumentLength(arrayCount), - - /*** - * @method min([all] = false, [map]) - * @returns Mixed - * @short Returns the element in the array with the lowest value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, multiple elements will be returned. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].min() -> 1 - * ['fee','fo','fum'].min('length') -> 'fo' - * ['fee','fo','fum'].min(true, 'length') -> ['fo'] - * users.min('age') -> youngest guy! - * - * ['fee','fo','fum'].min(true, function(n) { - * return n.length; - * }); -> ['fo'] - * - * @signature min([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'min': function(arr, all, map) { - return getMinOrMax(arr, all, map); - }, - - /*** - * @method max([all] = false, [map]) - * @returns Mixed - * @short Returns the element in the array with the greatest value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, multiple elements will be returned. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3].max() -> 3 - * ['fee','fo','fum'].max('length') -> 'fee' - * ['fee','fo','fum'].max(true, 'length') -> ['fee','fum'] - * users.max('age') -> oldest guy! - * - * ['fee','fo','fum'].max(true, function(n) { - * return n.length; - * }); -> ['fee', 'fum'] - * - * @signature max([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'max': function(arr, all, map) { - return getMinOrMax(arr, all, map, true); - }, - - /*** - * @method least([all] = false, [map]) - * @returns Array - * @short Returns the elements in the array with the least commonly occuring value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, will return multiple values in an array. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [3,2,2].least() -> 3 - * ['fe','fo','fum'].least(true, 'length') -> ['fum'] - * users.least('profile.type') -> (user with least commonly occurring type) - * users.least(true, 'profile.type') -> (users with least commonly occurring type) - * - * @signature least([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'least': function(arr, all, map) { - return getLeastOrMost(arr, all, map); - }, - - /*** - * @method most([all] = false, [map]) - * @returns Array - * @short Returns the elements in the array with the most commonly occuring value. - * @extra [map] can be passed in place of [all], and is a function of type - * `mapFn` that maps the value to be checked or a string acting as a - * shortcut. If [all] is true, will return multiple values in an array. - * Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [3,2,2].most(2) -> 2 - * ['fe','fo','fum'].most(true, 'length') -> ['fe','fo'] - * users.most('profile.type') -> (user with most commonly occurring type) - * users.most(true, 'profile.type') -> (users with most commonly occurring type) - * - * @signature most([map]) - * @param {string|mapFn} map - * @param {boolean} all - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'most': function(arr, all, map) { - return getLeastOrMost(arr, all, map, true); - }, - - /*** - * @method sum([map]) - * @returns Number - * @short Sums all values in the array. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * summed or a string acting as a shortcut. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,2].sum() -> 5 - * users.sum(function(user) { - * return user.votes; - * }); -> total votes! - * users.sum('votes') -> total votes! - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'sum': function(arr, map) { - return sum(arr, map); - }, - - /*** - * @method average([map]) - * @returns Number - * @short Gets the mean average for all values in the array. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. Supports `deep properties`. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,3,4].average() -> 2 - * users.average(function(user) { - * return user.age; - * }); -> average user age - * users.average('age') -> average user age - * users.average('currencies.usd.balance') -> average USD balance - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'average': function(arr, map) { - return average(arr, map); - }, - - /*** - * @method median([map]) - * @returns Number - * @short Gets the median average for all values in the array. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. - * - * @callback mapFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * arr A reference to the array. - * - * @example - * - * [1,2,2].median() -> 2 - * [{a:1},{a:2},{a:2}].median('a') -> 2 - * users.median('age') -> median user age - * users.median('currencies.usd.balance') -> median USD balance - * - * @param {string|mapFn} map - * @callbackParam {ArrayElement} el - * @callbackParam {number} i - * @callbackParam {Array} arr - * @callbackReturns {NewArrayElement} mapFn - * - ***/ - 'median': function(arr, map) { - return median(arr, map); - } - - }); - - - /*** @namespace Object ***/ - - // Object matchers - var objectSome = wrapObjectMatcher('some'), - objectFind = wrapObjectMatcher('find'), - objectEvery = wrapObjectMatcher('every'); - - function objectForEach(obj, fn) { - assertCallable(fn); - forEachProperty(obj, function(val, key) { - fn(val, key, obj); - }); - return obj; - } - - function objectMap(obj, map) { - var result = {}; - forEachProperty(obj, function(val, key) { - result[key] = mapWithShortcuts(val, map, obj, [val, key, obj]); - }); - return result; - } - - function objectReduce(obj, fn, acc) { - var init = isDefined(acc); - forEachProperty(obj, function(val, key) { - if (!init) { - acc = val; - init = true; - return; - } - acc = fn(acc, val, key, obj); - }); - return acc; - } - - function objectNone(obj, f) { - return !objectSome(obj, f); - } - - function objectFilter(obj, f) { - var matcher = getMatcher(f), result = {}; - forEachProperty(obj, function(val, key) { - if (matcher(val, key, obj)) { - result[key] = val; - } - }); - return result; - } - - function objectCount(obj, f) { - var matcher = getMatcher(f), count = 0; - forEachProperty(obj, function(val, key) { - if (matcher(val, key, obj)) { - count++; - } - }); - return count; - } - - // Support - - function wrapObjectMatcher(name) { - var nativeFn = Array.prototype[name]; - return function(obj, f) { - var matcher = getMatcher(f); - return nativeFn.call(getKeys(obj), function(key) { - return matcher(obj[key], key, obj); - }); - }; - } - - defineInstanceAndStatic(sugarObject, { - - /*** - * @method forEach(eachFn) - * @returns Object - * @short Runs `eachFn` against each property in the object. - * @extra Does not iterate over inherited or non-enumerable properties. - * - * @callback eachFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.forEach({a:'b'}, function(val, key) { - * // val = 'b', key = a - * }); - * - * @param {eachFn} eachFn - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * - ***/ - 'forEach': function(obj, eachFn) { - return objectForEach(obj, eachFn); - }, - - /*** - * @method map(map) - * @returns Object - * @short Maps the object to another object whose properties are the values - * returned by `map`. - * @extra `map` can be a function of type `mapFn` or a string that acts as a - * shortcut and gets a property or invokes a function on each element. - * Supports `deep properties`. - * - * @callback mapFn - * - * val The value of the current property. - * key The key of the current property. - * obj A reference to the object. - * - * @example - * - * data.map(function(val, key) { - * return key; - * }); -> {a:'b'} - * users.map('age'); - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'map': function(obj, map) { - return objectMap(obj, map); - }, - - /*** - * @method some(search) - * @returns Boolean - * @short Returns true if `search` is true for any property in the object. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.some({a:1,b:2}, function(val) { - * return val == 1; - * }); -> true - * Object.some({a:1,b:2}, 1); -> true - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'some': objectSome, - - /*** - * @method every(search) - * @returns Boolean - * @short Returns true if `search` is true for all properties in the object. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.every({a:1,b:2}, function(val) { - * return val > 0; - * }); -> true - * Object.every({a:'a',b:'b'}, /[a-z]/); -> true - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'every': objectEvery, - - /*** - * @method filter(search) - * @returns Array - * @short Returns a new object with properties that match `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.filter({a:1,b:2}, function(val) { - * return val == 1; - * }); -> {a:1} - * Object.filter({a:'a',z:'z'}, /[a-f]/); -> {a:'a'} - * Object.filter(usersByName, /^H/); -> all users with names starting with H - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'filter': function(obj, f) { - return objectFilter(obj, f); - }, - - /*** - * @method reduce(reduceFn, [init]) - * @returns Mixed - * @short Reduces the object to a single result. - * @extra This operation is sometimes called "accumulation", as it takes the - * result of the last iteration of `fn` and passes it as the first - * argument to the next iteration, "accumulating" that value as it goes. - * The return value of this method will be the return value of the final - * iteration of `fn`. If [init] is passed, it will be the initial - * "accumulator" (the first argument). If [init] is not passed, then a - * property of the object will be used instead and `fn` will not be - * called for that property. Note that object properties have no order, - * and this may lead to bugs (for example if performing division or - * subtraction operations on a value). If order is important, use an - * array instead! - * - * @callback reduceFn - * - * acc The "accumulator", either [init], the result of the last iteration - * of `fn`, or a property of `obj`. - * val The value of the current property called for `fn`. - * key The key of the current property called for `fn`. - * obj A reference to the object. - * - * @example - * - * Object.reduce({a:2,b:4}, function(a, b) { - * return a * b; - * }); -> 8 - * - * Object.reduce({a:2,b:4}, function(a, b) { - * return a * b; - * }, 10); -> 80 - * - * - * @param {reduceFn} reduceFn - * @param {any} [init] - * @callbackParam {Property} acc - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * - ***/ - 'reduce': function(obj, fn, init) { - return objectReduce(obj, fn, init); - }, - - /*** - * @method find(search) - * @returns Boolean - * @short Returns the first key whose value matches `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. Note that "first" is - * implementation-dependent. If order is important an array should be - * used instead. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.find({a:1,b:2}, function(val) { - * return val == 2; - * }); -> 'b' - * Object.find({a:'a',b:'b'}, /[a-z]/); -> 'a' - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'find': objectFind, - - /*** - * @method count(search) - * @returns Number - * @short Counts all properties in the object that match `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.count({a:'a',b:'b',c:'a'}, 'a') -> 2 - * Object.count(usersByName, function(user) { - * return user.age > 30; - * }); -> number of users older than 30 - * Object.count(usersByName, { name: /^[H-Z]/ }); - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'count': function(obj, f) { - return objectCount(obj, f); - }, - - /*** - * @method none(search) - * @returns Boolean - * @short Returns true if none of the properties in the object match `search`. - * @extra `search` can be any property or a function of type `searchFn`. - * Implements `enhanced matching`. - * - * @callback searchFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.none({a:1,b:2}, 3); -> true - * Object.none(usersByName, function(user) { - * return user.name == 'Wolverine'; - * }); -> probably true - * - * @param {Property|searchFn} search - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {boolean} searchFn - * - ***/ - 'none': function(obj, f) { - return objectNone(obj, f); - }, - - /*** - * @method sum([map]) - * @returns Number - * @short Sums all properties in the object. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * summed or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.sum({a:35,b:13}); -> 48 - * Object.sum(usersByName, function(user) { - * return user.votes; - * }); -> total user votes - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'sum': function(obj, map) { - return sum(obj, map); - }, - - /*** - * @method average([map]) - * @returns Number - * @short Gets the mean average of all properties in the object. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.average({a:35,b:11}); -> 23 - * Object.average(usersByName, 'age'); -> average user age - * Object.average(usersByName, 'currencies.usd.balance'); -> USD mean balance - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'average': function(obj, map) { - return average(obj, map); - }, - - /*** - * @method median([map]) - * @returns Number - * @short Gets the median average of all properties in the object. - * @extra [map] can be a function of type `mapFn` that maps the value to be - * averaged or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.median({a:1,b:2,c:2}) -> 2 - * Object.median(usersByName, 'age'); -> median user age - * Object.median(usersByName, 'currencies.usd.balance'); -> USD median balance - * - * @param {string|mapFn} map - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'median': function(obj, map) { - return median(obj, map); - }, - - /*** - * @method min([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the lowest value. - * @extra If [all] is true, will return an object with all properties in the - * object with the lowest value. [map] can be passed in place of [all] - * and is a function of type `mapFn` that maps the value to be checked - * or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.min({a:1,b:2,c:3}) -> 'a' - * Object.min({a:'aaa',b:'bb',c:'c'}, 'length') -> 'c' - * Object.min({a:1,b:1,c:3}, true) -> {a:1,b:1} - * - * @signature min([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'min': function(obj, all, map) { - return getMinOrMax(obj, all, map, false, true); - }, - - /*** - * @method max([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the highest value. - * @extra If [all] is true, will return an object with all properties in the - * object with the highest value. [map] can be passed in place of [all] - * and is a function of type `mapFn` that maps the value to be checked - * or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.max({a:1,b:2,c:3}) -> 'c' - * Object.max({a:'aaa',b:'bb',c:'c'}, 'length') -> 'a' - * Object.max({a:1,b:3,c:3}, true) -> {b:3,c:3} - * - * @signature max([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'max': function(obj, all, map) { - return getMinOrMax(obj, all, map, true, true); - }, - - /*** - * @method least([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the least commonly - * occuring value. - * @extra If [all] is true, will return an object with all properties in the - * object with the least common value. [map] can be passed in place of - * [all] and is a function of type `mapFn` that maps the value to be - * checked or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.least({a:1,b:3,c:3}) -> 'a' - * Object.least({a:'aa',b:'bb',c:'c'}, 'length') -> 'c' - * Object.least({a:1,b:3,c:3}, true) -> {a:1} - * - * @signature least([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'least': function(obj, all, map) { - return getLeastOrMost(obj, all, map, false, true); - }, - - /*** - * @method most([all] = false, [map]) - * @returns Mixed - * @short Returns the key of the property in the object with the most commonly - * occuring value. - * @extra If [all] is true, will return an object with all properties in the - * object with the most common value. [map] can be passed in place of - * [all] and is a function of type `mapFn` that maps the value to be - * checked or a string acting as a shortcut. - * - * @callback mapFn - * - * val The value of the current iteration. - * key The key of the current iteration. - * obj A reference to the object. - * - * @example - * - * Object.most({a:1,b:3,c:3}) -> 'b' - * Object.most({a:'aa',b:'bb',c:'c'}, 'length') -> 'a' - * Object.most({a:1,b:3,c:3}, true) -> {b:3,c:3} - * - * @signature most([map]) - * @param {string|mapFn} map - * @param {boolean} [all] - * @callbackParam {Property} val - * @callbackParam {string} key - * @callbackParam {Object} obj - * @callbackReturns {NewProperty} mapFn - * - ***/ - 'most': function(obj, all, map) { - return getLeastOrMost(obj, all, map, true, true); - } - - }); - - - buildFromIndexMethods(); - - /*** - * @module Number - * @description Number formatting, precision rounding, Math aliases, and more. - * - ***/ - - - var NUMBER_OPTIONS = { - 'decimal': HALF_WIDTH_PERIOD, - 'thousands': HALF_WIDTH_COMMA - }; - - // Abbreviation Units - var BASIC_UNITS = '|kmbt', - MEMORY_UNITS = '|KMGTPE', - MEMORY_BINARY_UNITS = '|,Ki,Mi,Gi,Ti,Pi,Ei', - METRIC_UNITS_SHORT = 'nμm|k', - METRIC_UNITS_FULL = 'yzafpnμm|KMGTPEZY'; - - - /*** - * @method getOption(name) - * @returns Mixed - * @accessor - * @short Gets an option used internally by Number. - * @example - * - * Sugar.Number.getOption('thousands'); - * - * @param {string} name - * - *** - * @method setOption(name, value) - * @accessor - * @short Sets an option used internally by Number. - * @extra If `value` is `null`, the default value will be restored. - * @options - * - * decimal A string used as the decimal marker by `format`, `abbr`, - * `metric`, and `bytes`. Default is `.`. - * - * thousands A string used as the thousands marker by `format`, `abbr`, - * `metric`, and `bytes`. Default is `,`. - * - * - * @example - * - * Sugar.Number.setOption('decimal', ','); - * Sugar.Number.setOption('thousands', ' '); - * - * @signature setOption(options) - * @param {NumberOptions} options - * @param {string} name - * @param {any} value - * @option {string} decimal - * @option {string} thousands - * - ***/ - var _numberOptions = defineOptionsAccessor(sugarNumber, NUMBER_OPTIONS); - - - function abbreviateNumber(num, precision, ustr, bytes) { - var fixed = num.toFixed(20), - decimalPlace = fixed.search(/\./), - numeralPlace = fixed.search(/[1-9]/), - significant = decimalPlace - numeralPlace, - units, unit, mid, i, divisor; - if (significant > 0) { - significant -= 1; - } - units = commaSplit(ustr); - if (units.length === 1) { - units = ustr.split(''); - } - mid = units.indexOf('|'); - if (mid === -1) { - // Skipping the placeholder means the units should start from zero, - // otherwise assume they end at zero. - mid = units[0] === '_' ? 0 : units.length; - } - i = max(min(floor(significant / 3), units.length - mid - 1), -mid); - unit = units[i + mid]; - while (unit === '_') { - i += i < 0 ? -1 : 1; - unit = units[i + mid]; - } - if (unit === '|') { - unit = ''; - } - if (significant < -9) { - precision = abs(significant) - 9; - } - divisor = bytes ? pow(2, 10 * i) : pow(10, i * 3); - return numberFormat(withPrecision(num / divisor, precision || 0)) + unit; - } - - function numberFormat(num, place) { - var result = '', thousands, decimal, fraction, integer, split, str; - - decimal = _numberOptions('decimal'); - thousands = _numberOptions('thousands'); - - if (isNumber(place)) { - str = withPrecision(num, place || 0).toFixed(max(place, 0)); - } else { - str = num.toString(); - } - - str = str.replace(/^-/, ''); - split = periodSplit(str); - integer = split[0]; - fraction = split[1]; - if (/e/.test(str)) { - result = str; - } else { - for(var i = integer.length; i > 0; i -= 3) { - if (i < integer.length) { - result = thousands + result; - } - result = integer.slice(max(0, i - 3), i) + result; - } - } - if (fraction) { - result += decimal + repeatString('0', (place || 0) - fraction.length) + fraction; - } - return (num < 0 ? '-' : '') + result; - } - - function isInteger(n) { - return n % 1 === 0; - } - - function isMultipleOf(n1, n2) { - return n1 % n2 === 0; - } - - function createRoundingFunction(fn) { - return function(n, precision) { - return precision ? withPrecision(n, precision, fn) : fn(n); - }; - } - - defineStatic(sugarNumber, { - - /*** - * @method random([n1], [n2]) - * @returns Number - * @static - * @short Returns a random integer from [n1] to [n2] (both inclusive). - * @extra If only 1 number is passed, the other will be 0. If none are passed, - * the number will be either 0 or 1. - * - * @example - * - * Number.random(50, 100) -> ex. 85 - * Number.random(50) -> ex. 27 - * Number.random() -> ex. 0 - * - * @param {number} [n1] - * @param {number} [n2] - * - ***/ - 'random': function(n1, n2) { - var minNum, maxNum; - if (arguments.length == 1) n2 = n1, n1 = 0; - minNum = min(n1 || 0, isUndefined(n2) ? 1 : n2); - maxNum = max(n1 || 0, isUndefined(n2) ? 1 : n2) + 1; - return trunc((Math.random() * (maxNum - minNum)) + minNum); - } - - }); - - defineInstance(sugarNumber, { - - /*** - * @method isInteger() - * @returns Boolean - * @short Returns true if the number has no trailing decimal. - * - * @example - * - * (420).isInteger() -> true - * (4.5).isInteger() -> false - * - ***/ - 'isInteger': function(n) { - return isInteger(n); - }, - - /*** - * @method isOdd() - * @returns Boolean - * @short Returns true if the number is odd. - * - * @example - * - * (3).isOdd() -> true - * (18).isOdd() -> false - * - ***/ - 'isOdd': function(n) { - return isInteger(n) && !isMultipleOf(n, 2); - }, - - /*** - * @method isEven() - * @returns Boolean - * @short Returns true if the number is even. - * - * @example - * - * (6).isEven() -> true - * (17).isEven() -> false - * - ***/ - 'isEven': function(n) { - return isMultipleOf(n, 2); - }, - - /*** - * @method isMultipleOf(num) - * @returns Boolean - * @short Returns true if the number is a multiple of `num`. - * - * @example - * - * (6).isMultipleOf(2) -> true - * (17).isMultipleOf(2) -> false - * (32).isMultipleOf(4) -> true - * (34).isMultipleOf(4) -> false - * - * @param {number} num - * - ***/ - 'isMultipleOf': function(n, num) { - return isMultipleOf(n, num); - }, - - /*** - * @method log([base] = Math.E) - * @returns Number - * @short Returns the logarithm of the number with `base`, or the natural - * logarithm of the number if `base` is undefined. - * - * @example - * - * (64).log(2) -> 6 - * (9).log(3) -> 2 - * (5).log() -> 1.6094379124341003 - * - * @param {number} [base] - * - ***/ - 'log': function(n, base) { - return Math.log(n) / (base ? Math.log(base) : 1); - }, - - /*** - * @method abbr([precision] = 0) - * @returns String - * @short Returns an abbreviated form of the number ("k" for thousand, "m" - * for million, etc). - * @extra [precision] will round to the given precision. `thousands` and - * `decimal` allow custom separators to be used. - * - * @example - * - * (1000).abbr() -> "1k" - * (1000000).abbr() -> "1m" - * (1280).abbr(1) -> "1.3k" - * - * @param {number} [precision] - * - ***/ - 'abbr': function(n, precision) { - return abbreviateNumber(n, precision, BASIC_UNITS); - }, - - /*** - * @method metric([precision] = 0, [units] = "nμm|k") - * @returns String - * @short Returns the number as a string in metric notation. - * @extra [precision] will round to the given precision (can be negative). - * [units] is a string that determines both the unit notation and the - * min/max unit allowed. The default is natural notation for common - * units (meters, grams, etc). "all" can be passed for [units] and is a - * shortcut to all standard SI units. The token `,` if present separates - * units, otherwise each character is a unit. The token `|` if present - * marks where fractional units end, otherwise no fractional units are - * used. Finally, the token `_` if present is a placeholder for no unit. - * - * @example - * - * (1000).metric() -> "1k" - * (1000000).metric() -> "1,000k" - * (1249).metric(2) + 'g' -> "1.25kg" - * (0.025).metric() + 'm' -> "25mm" - * (1000000).metric(0, 'nμm|kM') -> "1M" - * - * @param {number} [precision] - * @param {string} [units] - * - ***/ - 'metric': function(n, precision, units) { - if (units === 'all') { - units = METRIC_UNITS_FULL; - } else if (!units) { - units = METRIC_UNITS_SHORT; - } - return abbreviateNumber(n, precision, units); - }, - - /*** - * @method bytes([precision] = 0, [binary] = false, [units] = 'si') - * @returns String - * @short Returns an abbreviated form of the number, with 'B' on the end for "bytes". - * @extra [precision] will round to the given precision. If [binary] is `true`, - * powers of 1024 will be used instead of 1000, and units will default - * to the binary units "KiB", "MiB", etc. Units can be overridden by - * passing "si" or "binary" for [units], or further customized by - * passing a unit string. See `metric` for more. - * - * @example - * - * (1000).bytes() -> "1KB" - * (1289).bytes(2) -> "1.29KB" - * (1000).bytes(2, true) -> "0.98KiB" - * (1000).bytes(2, true, 'si') -> "0.98KB" - * - * @param {number} [precision] - * @param {boolean} [binary] - * @param {string} [units] - * - ***/ - 'bytes': function(n, precision, binary, units) { - if (units === 'binary' || (!units && binary)) { - units = MEMORY_BINARY_UNITS; - } else if(units === 'si' || !units) { - units = MEMORY_UNITS; - } - return abbreviateNumber(n, precision, units, binary) + 'B'; - }, - - /*** - * @method format([place] = 0) - * @returns String - * @short Formats the number to a readable string. - * @extra If [place] is `undefined`, the place will automatically be determined. - * `thousands` and `decimal` allow custom markers to be used. - * - * @example - * - * (56782).format() -> '56,782' - * (56782).format(2) -> '56,782.00' - * (4388.43).format(2) -> '4,388.43' - * - * @param {number} [place] - * - ***/ - 'format': function(n, place) { - return numberFormat(n, place); - }, - - /*** - * @method hex([pad] = 1) - * @returns String - * @short Converts the number to hexidecimal. - * @extra [pad] will pad the resulting string to that many places. - * - * @example - * - * (255).hex() -> 'ff'; - * (255).hex(4) -> '00ff'; - * (23654).hex() -> '5c66'; - * - * @param {number} [pad] - * - ***/ - 'hex': function(n, pad) { - return padNumber(n, pad || 1, false, 16); - }, - - /*** - * @method times(indexMapFn) - * @returns Mixed - * @short Calls `indexMapFn` a number of times equivalent to the number. - * @extra Any non-undefined return values of `indexMapFn` will be collected - * and returned in an array. - * - * @callback indexMapFn - * - * i The index of the current iteration. - * - * @example - * - * (8).times(logHello) -> logs "hello" 8 times - * (7).times(function(n) { - * return Math.pow(2, n); - * }); - * - * @callbackParam {number} i - * @callbackReturns {any} indexMapFn - * @param {indexMapFn} indexMapFn - * - ***/ - 'times': function(n, indexMapFn) { - var arr, result; - for(var i = 0; i < n; i++) { - result = indexMapFn.call(n, i); - if (isDefined(result)) { - if (!arr) { - arr = []; - } - arr.push(result); - } - } - return arr; - }, - - /*** - * @method chr() - * @returns String - * @short Returns a string at the code point of the number. - * - * @example - * - * (65).chr() -> "A" - * (75).chr() -> "K" - * - ***/ - 'chr': function(n) { - return chr(n); - }, - - /*** - * @method pad([place] = 0, [sign] = false, [base] = 10) - * @returns String - * @short Pads a number with "0" to `place`. - * @extra [sign] allows you to force the sign as well (+05, etc). [base] can - * change the base for numeral conversion. - * - * @example - * - * (5).pad(2) -> '05' - * (-5).pad(4) -> '-0005' - * (82).pad(3, true) -> '+082' - * - * @param {number} place - * @param {boolean} [sign] - * @param {number} [base] - * - ***/ - 'pad': function(n, place, sign, base) { - return padNumber(n, place, sign, base); - }, - - /*** - * @method ordinalize() - * @returns String - * @short Returns an ordinalized English string, i.e. "1st", "2nd", etc. - * - * @example - * - * (1).ordinalize() -> '1st'; - * (2).ordinalize() -> '2nd'; - * (8).ordinalize() -> '8th'; - * - ***/ - 'ordinalize': function(n) { - var num = abs(n), last = +num.toString().slice(-2); - return n + getOrdinalSuffix(last); - }, - - /*** - * @method toNumber() - * @returns Number - * @short Identity function for compatibilty. - * - * @example - * - * (420).toNumber() -> 420 - * - ***/ - 'toNumber': function(n) { - return n.valueOf(); - }, - - /*** - * @method round([precision] = 0) - * @returns Number - * @short Shortcut for `Math.round` that also allows a `precision`. - * - * @example - * - * (3.241).round() -> 3 - * (-3.841).round() -> -4 - * (3.241).round(2) -> 3.24 - * (3748).round(-2) -> 3800 - * - * @param {number} [precision] - * - ***/ - 'round': createRoundingFunction(round), - - /*** - * @method ceil([precision] = 0) - * @returns Number - * @short Shortcut for `Math.ceil` that also allows a `precision`. - * - * @example - * - * (3.241).ceil() -> 4 - * (-3.241).ceil() -> -3 - * (3.241).ceil(2) -> 3.25 - * (3748).ceil(-2) -> 3800 - * - * @param {number} [precision] - * - ***/ - 'ceil': createRoundingFunction(ceil), - - /*** - * @method floor([precision] = 0) - * @returns Number - * @short Shortcut for `Math.floor` that also allows a `precision`. - * - * @example - * - * (3.241).floor() -> 3 - * (-3.841).floor() -> -4 - * (3.241).floor(2) -> 3.24 - * (3748).floor(-2) -> 3700 - * - * @param {number} [precision] - * - ***/ - 'floor': createRoundingFunction(floor) - - }); - - /*** - * @method [math]() - * @returns Number - * @short Math related functions are mapped as shortcuts to numbers and are - * identical. Note that `log` provides some special defaults. - * - * @set - * abs - * sin - * asin - * cos - * acos - * tan - * atan - * sqrt - * exp - * pow - * - * @example - * - * (3).pow(3) -> 27 - * (-3).abs() -> 3 - * (1024).sqrt() -> 32 - * - ***/ - function buildMathAliases() { - defineInstanceSimilar(sugarNumber, 'abs pow sin asin cos acos tan atan exp pow sqrt', function(methods, name) { - methods[name] = function(n, arg) { - // Note that .valueOf() here is only required due to a - // very strange bug in iOS7 that only occurs occasionally - // in which Math.abs() called on non-primitive numbers - // returns a completely different number (Issue #400) - return Math[name](n.valueOf(), arg); - }; - }); - } - - buildMathAliases(); - - /*** - * @module Function - * @description Lazy, throttled, and memoized functions, delayed functions and - * handling of timers, argument currying. - * - ***/ - - var _lock = privatePropertyAccessor('lock'); - var _timers = privatePropertyAccessor('timers'); - var _partial = privatePropertyAccessor('partial'); - var _canceled = privatePropertyAccessor('canceled'); - - // istanbul ignore next - var createInstanceFromPrototype = Object.create || function(prototype) { - var ctor = function() {}; - ctor.prototype = prototype; - return new ctor; - }; - - function setDelay(fn, ms, after, scope, args) { - // Delay of infinity is never called of course... - ms = coercePositiveInteger(ms || 0); - if (!_timers(fn)) { - _timers(fn, []); - } - // This is a workaround for <= IE8, which apparently has the - // ability to call timeouts in the queue on the same tick (ms?) - // even if functionally they have already been cleared. - _canceled(fn, false); - _timers(fn).push(setTimeout(function() { - if (!_canceled(fn)) { - after.apply(scope, args || []); - } - }, ms)); - } - - function cancelFunction(fn) { - var timers = _timers(fn), timer; - if (isArray(timers)) { - while(timer = timers.shift()) { - clearTimeout(timer); - } - } - _canceled(fn, true); - return fn; - } - - function createLazyFunction(fn, ms, immediate, limit) { - var queue = [], locked = false, execute, rounded, perExecution, result; - ms = ms || 1; - limit = limit || Infinity; - rounded = ceil(ms); - perExecution = round(rounded / ms) || 1; - execute = function() { - var queueLength = queue.length, maxPerRound; - if (queueLength == 0) return; - // Allow fractions of a millisecond by calling - // multiple times per actual timeout execution - maxPerRound = max(queueLength - perExecution, 0); - while(queueLength > maxPerRound) { - // Getting uber-meta here... - result = Function.prototype.apply.apply(fn, queue.shift()); - queueLength--; - } - setDelay(lazy, rounded, function() { - locked = false; - execute(); - }); - }; - function lazy() { - // If the execution has locked and it's immediate, then - // allow 1 less in the queue as 1 call has already taken place. - if (queue.length < limit - (locked && immediate ? 1 : 0)) { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - queue.push([this, args]); - } - if (!locked) { - locked = true; - if (immediate) { - execute(); - } else { - setDelay(lazy, rounded, execute); - } - } - // Return the memoized result - return result; - } - return lazy; - } - - // Collecting arguments in an array instead of - // passing back the arguments object which will - // deopt this function in V8. - function collectArguments() { - var args = arguments, i = args.length, arr = new Array(i); - while (i--) { - arr[i] = args[i]; - } - return arr; - } - - function createHashedMemoizeFunction(fn, hashFn, limit) { - var map = {}, refs = [], counter = 0; - return function() { - var hashObj = hashFn.apply(this, arguments); - var key = serializeInternal(hashObj, refs); - if (hasOwn(map, key)) { - return getOwn(map, key); - } - if (counter === limit) { - map = {}; - refs = []; - counter = 0; - } - counter++; - return map[key] = fn.apply(this, arguments); - }; - } - - defineInstance(sugarFunction, { - - /*** - * @method lazy([ms] = 1, [immediate] = false, [limit] = Infinity) - * @returns Function - * @short Creates a lazy function that, when called repeatedly, will queue - * execution and wait [ms] milliseconds to execute. - * @extra If [immediate] is `true`, first execution will happen immediately, - * then lock. If [limit] is a fininte number, calls past [limit] will - * be ignored while execution is locked. Compare this to `throttle`, - * which will execute only once per [ms] milliseconds. Note that [ms] - * can also be a fraction. Calling `cancel` on a lazy function will - * clear the entire queue. - * - * @example - * - * var fn = logHello.lazy(250); - * runTenTimes(fn); -> Logs 10 times each time 250ms later - * - * var fn = logHello.lazy(250, false, 5); - * runTenTimes(fn); -> Logs 5 times each time 250ms later - * - * @param {number} [ms] - * @param {number} [limit] - * @param {boolean} [immediate] - * - ***/ - 'lazy': function(fn, ms, immediate, limit) { - return createLazyFunction(fn, ms, immediate, limit); - }, - - /*** - * @method throttle([ms] = 1) - * @returns Function - * @short Creates a "throttled" version of the function that will only be - * executed once per `ms` milliseconds. - * @extra This is functionally equivalent to calling `lazy` with a [limit] of - * `1` and [immediate] as `true`. `throttle` is appropriate when you - * want to make sure a function is only executed at most once for a - * given duration. - * - * @example - * - * var fn = logHello.throttle(50); - * runTenTimes(fn); - * - * @param {number} [ms] - * - ***/ - 'throttle': function(fn, ms) { - return createLazyFunction(fn, ms, true, 1); - }, - - /*** - * @method debounce([ms] = 1) - * @returns Function - * @short Creates a "debounced" function that postpones its execution until - * after `ms` milliseconds have passed. - * @extra This method is useful to execute a function after things have - * "settled down". A good example of this is when a user tabs quickly - * through form fields, execution of a heavy operation should happen - * after a few milliseconds when they have "settled" on a field. - * - * @example - * - * var fn = logHello.debounce(250) - * runTenTimes(fn); -> called once 250ms later - * - * @param {number} [ms] - * - ***/ - 'debounce': function(fn, ms) { - function debounced() { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - cancelFunction(debounced); - setDelay(debounced, ms, fn, this, args); - } - return debounced; - }, - - /*** - * @method cancel() - * @returns Function - * @short Cancels a delayed function scheduled to be run. - * @extra `delay`, `lazy`, `throttle`, and `debounce` can all set delays. - * - * @example - * - * logHello.delay(500).cancel() -> never logs - * - ***/ - 'cancel': function(fn) { - return cancelFunction(fn); - }, - - /*** - * @method after(n) - * @returns Function - * @short Creates a function that will execute after `n` calls. - * @extra `after` is useful for running a final callback after a specific - * number of operations, often when the order in which the operations - * will complete is unknown. The created function will be passed an - * array of the arguments that it has collected from each after `n`. - * Note that the function will execute on every call after `n`. - * Use `once` in conjunction with this method to prevent being - * triggered by subsequent calls. - * - * @example - * - * var fn = logHello.after(5); - * runTenTimes(fn); -> logs 6 times - * - * var fn = logHello.once().after(5) - * runTenTimes(fn); -> logs once - * - * @param {number} [n] - * - ***/ - 'after': function(fn, num) { - var count = 0, collectedArgs = []; - num = coercePositiveInteger(num); - return function() { - // Optimized: no leaking arguments - var args = []; for(var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]); - collectedArgs.push(args); - count++; - if (count >= num) { - return fn.call(this, collectedArgs); - } - }; - }, - - /*** - * @method once() - * @returns Function - * @short Creates a function that will execute only once and store the result. - * @extra `once` is useful for creating functions that will cache the result - * of an expensive operation and use it on subsequent calls. Also it - * can be useful for creating initialization functions that only need - * to be run once. - * - * @example - * - * var fn = logHello.once(); - * runTenTimes(fn); -> logs once - * - ***/ - 'once': function(fn) { - var called = false, val; - return function() { - if (called) { - return val; - } - called = true; - return val = fn.apply(this, arguments); - }; - }, - - /*** - * @method memoize([hashFn], [limit]) - * @returns Function - * @short Creates a function that will memoize results for unique calls. - * @extra `memoize` can be thought of as a more powerful `once`. Where `once` - * will only call a function once ever, memoized functions will be - * called once per unique call. A "unique call" is determined by the - * return value of [hashFn], which is passed the arguments of each call. - * If [hashFn] is undefined, it will deeply serialize all arguments, - * such that any different argument signature will result in a unique - * call. [hashFn] may be a string (allows `deep properties`) that acts - * as a shortcut to return a property of the first argument passed. - * [limit] sets an upper limit on memoized results. The default is no - * limit, meaning that unique calls will continue to memoize results. - * For most use cases this is fine, however [limit] is useful for more - * persistent (often server-side) applications for whom memory leaks - * are a concern. - * - * @example - * - * var fn = logHello.memoize(); - * fn(1); fn(1); fn(2); -> logs twice, memoizing once - * - * var fn = calculateUserBalance.memoize('id'); - * fn(Harry); fn(Mark); fn(Mark); -> logs twice, memoizing once - * - * @param {string|Function} [hashFn] - * @param {number} [limit] - * - ***/ - 'memoize': function(fn, arg1, arg2) { - var hashFn, limit, prop; - if (isNumber(arg1)) { - limit = arg1; - } else { - hashFn = arg1; - limit = arg2; - } - if (isString(hashFn)) { - prop = hashFn; - hashFn = function(obj) { - return deepGetProperty(obj, prop); - }; - } else if (!hashFn) { - hashFn = collectArguments; - } - return createHashedMemoizeFunction(fn, hashFn, limit); - }, - - /*** - * @method lock([n]) - * @returns Function - * @short Locks the number of arguments accepted by the function. - * @extra If not passed, [n] will be the length of the function. This method - * can be called on functions created by `partial`, in which case it - * will lock the total arguments during execution. - * - * @example - * - * logArgs.lock(2)(1,2,3) -> logs 1,2 - * - * @param {number} [n] - * - ***/ - 'lock': function(fn, n) { - var lockedFn; - if (_partial(fn)) { - _lock(fn, isNumber(n) ? n : null); - return fn; - } - lockedFn = function() { - arguments.length = min(_lock(lockedFn), arguments.length); - return fn.apply(this, arguments); - }; - _lock(lockedFn, isNumber(n) ? n : fn.length); - return lockedFn; - } - - }); - - defineInstanceWithArguments(sugarFunction, { - - /*** - * @method partial([arg1], [arg2], ...) - * @returns Function - * @short Returns a new version of the function which has part of its arguments - * pre-emptively filled in, also known as "currying". - * @extra `undefined` can be passed as any argument, and is a placeholder that - * will be replaced with arguments passed when the function is executed. - * This allows currying of arguments even when they occur toward the end - * of an argument list (the example demonstrates this more clearly). - * - * @example - * - * logArgs.partial(undefined, 'b')('a') -> logs a, b - * - * @param {any} [arg1] - * @param {any} [arg2] - * - ***/ - 'partial': function(fn, curriedArgs) { - var curriedLen = curriedArgs.length; - var partialFn = function() { - var argIndex = 0, applyArgs = [], self = this, lock = _lock(partialFn), result, i; - for (i = 0; i < curriedLen; i++) { - var arg = curriedArgs[i]; - if (isDefined(arg)) { - applyArgs[i] = arg; - } else { - applyArgs[i] = arguments[argIndex++]; - } - } - for (i = argIndex; i < arguments.length; i++) { - applyArgs.push(arguments[i]); - } - if (lock === null) { - lock = curriedLen; - } - if (isNumber(lock)) { - applyArgs.length = min(applyArgs.length, lock); - } - // If the bound "this" object is an instance of the partialed - // function, then "new" was used, so preserve the prototype - // so that constructor functions can also be partialed. - if (self instanceof partialFn) { - self = createInstanceFromPrototype(fn.prototype); - result = fn.apply(self, applyArgs); - // An explicit return value is allowed from constructors - // as long as they are of "object" type, so return the - // correct result here accordingly. - return isObjectType(result) ? result : self; - } - return fn.apply(self, applyArgs); - }; - _partial(partialFn, true); - return partialFn; - }, - - /*** - * @method delay([ms] = 1, [arg1], [arg2], ...) - * @returns Function - * @short Executes the function after `ms` milliseconds. - * @extra Returns a reference to itself. `delay` is also a way to execute non- - * blocking operations that will wait until the CPU is free. Delayed - * functions can be canceled using the `cancel` method. Can also curry - * arguments passed in after `ms`. - * - * @example - * - * logHello.delay(500) -> logs after 500ms - * logArgs.delay(500, 'a') -> logs "a" after 500ms - * - * @param {number} [ms] - * @param {any} [arg1] - * @param {any} [arg2] - * - ***/ - 'delay': function(fn, ms, args) { - setDelay(fn, ms, fn, fn, args); - return fn; - }, - - /*** - * @method every([ms] = 1, [arg1], [arg2], ...) - * @returns Function - * @short Executes the function every `ms` milliseconds. - * @extra Returns a reference to itself. `every` uses `setTimeout`, which - * means that you are guaranteed a period of idle time equal to [ms] - * after execution has finished. Compare this to `setInterval` which - * will try to run a function every [ms], even when execution itself - * takes up a portion of that time. In most cases avoiding `setInterval` - * is better as calls won't "back up" when the CPU is under strain, - * however this also means that calls are less likely to happen at - * exact intervals of [ms], so the use case here should be considered. - * Additionally, `every` can curry arguments passed in after [ms], and - * also be canceled with `cancel`. - * - * @example - * - * logHello.every(1000) -> logs every second - * logArgs.every(1000, 'Hola') -> logs 'hola' every second - * - * @param {number} [ms] - * @param {any} [arg1] - * @param {any} [arg2] - * - ***/ - 'every': function(fn, ms, args) { - function execute () { - // Set the delay first here, so that cancel - // can be called within the executing function. - setDelay(fn, ms, execute); - fn.apply(fn, args); - } - setDelay(fn, ms, execute); - return fn; - } - - }); - - /*** - * @module RegExp - * @description RegExp escaping and flag manipulation. - * - * Note here that methods on the RegExp class like .exec and .test will fail in - * the current version of SpiderMonkey being used by CouchDB when using - * shorthand regex notation like /foo/. This is the reason for the intermixed - * use of shorthand and compiled regexes here. If you're using JS in CouchDB, it - * is safer to ALWAYS compile your regexes from a string. - * - ***/ - - defineStatic(sugarRegExp, { - - /*** - * @method escape([str] = '') - * @returns String - * @static - * @short Escapes all RegExp tokens in a string. - * - * @example - * - * RegExp.escape('really?') -> 'really\?' - * RegExp.escape('yes.') -> 'yes\.' - * RegExp.escape('(not really)') -> '\(not really\)' - * - * @param {string} str - * - ***/ - 'escape': function(str) { - return escapeRegExp(str); - } - - }); - - defineInstance(sugarRegExp, { - - /*** - * @method getFlags() - * @returns String - * @short Returns the flags of the regex as a string. - * - * @example - * - * /texty/gim.getFlags() -> 'gim' - * - ***/ - 'getFlags': function(r) { - return getRegExpFlags(r); - }, - - /*** - * @method setFlags(flags) - * @returns RegExp - * @short Creates a copy of the regex with `flags` set. - * - * @example - * - * /texty/.setFlags('gim') -> now has global, ignoreCase, and multiline set - * - * @param {string} flags - * - ***/ - 'setFlags': function(r, flags) { - return RegExp(r.source, flags); - }, - - /*** - * @method addFlags(flags) - * @returns RegExp - * @short Creates a copy of the regex with `flags` added. - * - * @example - * - * /texty/.addFlags('g') -> /texty/g - * /texty/.addFlags('im') -> /texty/im - * - * @param {string} flags - * - ***/ - 'addFlags': function(r, flags) { - return RegExp(r.source, getRegExpFlags(r, flags)); - }, - - /*** - * @method removeFlags(flags) - * @returns RegExp - * @short Creates a copy of the regex with `flags` removed. - * - * @example - * - * /texty/gim.removeFlags('g') -> /texty/im - * /texty/gim.removeFlags('im') -> /texty/g - * - * @param {string} flags - * - ***/ - 'removeFlags': function(r, flags) { - var reg = allCharsReg(flags); - return RegExp(r.source, getRegExpFlags(r).replace(reg, '')); - } - - }); - - /*** - * @module Range - * @description Date, Number, and String ranges that can be manipulated and compared, - * or enumerate over specific points within the range. - * - ***/ - - var DURATION_UNITS = 'year|month|week|day|hour|minute|second|millisecond'; - var DURATION_REG = RegExp('(\\d+)?\\s*('+ DURATION_UNITS +')s?', 'i'); - - var MULTIPLIERS = { - 'Hours': 60 * 60 * 1000, - 'Minutes': 60 * 1000, - 'Seconds': 1000, - 'Milliseconds': 1 - }; - - var PrimitiveRangeConstructor = function(start, end) { - return new Range(start, end); - }; - - function Range(start, end) { - this.start = cloneRangeMember(start); - this.end = cloneRangeMember(end); - } - - function getRangeMemberNumericValue(m) { - return isString(m) ? m.charCodeAt(0) : m; - } - - function getRangeMemberPrimitiveValue(m) { - if (m == null) return m; - return isDate(m) ? m.getTime() : m.valueOf(); - } - - function getPrecision(n) { - var split = periodSplit(n.toString()); - return split[1] ? split[1].length : 0; - } - - function getGreaterPrecision(n1, n2) { - return max(getPrecision(n1), getPrecision(n2)); - } - - function cloneRangeMember(m) { - if (isDate(m)) { - return new Date(m.getTime()); - } else { - return getRangeMemberPrimitiveValue(m); - } - } - - function isValidRangeMember(m) { - var val = getRangeMemberPrimitiveValue(m); - return (!!val || val === 0) && valueIsNotInfinite(m); - } - - function valueIsNotInfinite(m) { - return m !== -Infinity && m !== Infinity; - } - - function rangeIsValid(range) { - return isValidRangeMember(range.start) && - isValidRangeMember(range.end) && - typeof range.start === typeof range.end; - } - - function rangeEvery(range, step, countOnly, fn) { - var increment, - precision, - dio, - unit, - start = range.start, - end = range.end, - inverse = end < start, - current = start, - index = 0, - result = []; - - if (!rangeIsValid(range)) { - return countOnly ? NaN : []; - } - if (isFunction(step)) { - fn = step; - step = null; - } - step = step || 1; - if (isNumber(start)) { - precision = getGreaterPrecision(start, step); - increment = function() { - return incrementNumber(current, step, precision); - }; - } else if (isString(start)) { - increment = function() { - return incrementString(current, step); - }; - } else if (isDate(start)) { - dio = getDateIncrementObject(step); - step = dio[0]; - unit = dio[1]; - increment = function() { - return incrementDate(current, step, unit); - }; - } - // Avoiding infinite loops - if (inverse && step > 0) { - step *= -1; - } - while(inverse ? current >= end : current <= end) { - if (!countOnly) { - result.push(current); - } - if (fn) { - fn(current, index, range); - } - current = increment(); - index++; - } - return countOnly ? index - 1 : result; - } - - function getDateIncrementObject(amt) { - var match, val, unit; - if (isNumber(amt)) { - return [amt, 'Milliseconds']; - } - match = amt.match(DURATION_REG); - val = +match[1] || 1; - unit = simpleCapitalize(match[2].toLowerCase()); - if (unit.match(/hour|minute|second/i)) { - unit += 's'; - } else if (unit === 'Year') { - unit = 'FullYear'; - } else if (unit === 'Week') { - unit = 'Date'; - val *= 7; - } else if (unit === 'Day') { - unit = 'Date'; - } - return [val, unit]; - } - - function incrementDate(src, amount, unit) { - var mult = MULTIPLIERS[unit], d; - if (mult) { - d = new Date(src.getTime() + (amount * mult)); - } else { - d = new Date(src); - callDateSet(d, unit, callDateGet(src, unit) + amount); - } - return d; - } - - function incrementString(current, amount) { - return chr(current.charCodeAt(0) + amount); - } - - function incrementNumber(current, amount, precision) { - return withPrecision(current + amount, precision); - } - - function rangeClamp(range, obj) { - var clamped, - start = range.start, - end = range.end, - min = end < start ? end : start, - max = start > end ? start : end; - if (obj < min) { - clamped = min; - } else if (obj > max) { - clamped = max; - } else { - clamped = obj; - } - return cloneRangeMember(clamped); - } - - defineOnPrototype(Range, { - - /*** - * @method toString() - * @returns String - * @short Returns a string representation of the range. - * - * @example - * - * Number.range(1, 5).toString() -> 1..5 - * janToMay.toString() -> January 1, xxxx..May 1, xxxx - * - ***/ - 'toString': function() { - return rangeIsValid(this) ? this.start + '..' + this.end : 'Invalid Range'; - }, - - /*** - * @method isValid() - * @returns Boolean - * @short Returns true if the range is valid, false otherwise. - * - * @example - * - * janToMay.isValid() -> true - * Number.range(NaN, NaN).isValid() -> false - * - ***/ - 'isValid': function() { - return rangeIsValid(this); - }, - - /*** - * @method span() - * @returns Number - * @short Returns the span of the range. If the range is a date range, the - * value is in milliseconds. - * @extra The span includes both the start and the end. - * - * @example - * - * Number.range(5, 10).span() -> 6 - * Number.range(40, 25).span() -> 16 - * janToMay.span() -> 10368000001 (or more depending on leap year) - * - ***/ - 'span': function() { - var n = getRangeMemberNumericValue(this.end) - getRangeMemberNumericValue(this.start); - return rangeIsValid(this) ? abs(n) + 1 : NaN; - }, - - /*** - * @method contains(el) - * @returns Boolean - * @short Returns true if `el` is contained inside the range. `el` may be a - * value or another range. - * - * @example - * - * Number.range(5, 10).contains(7) -> true - * Number.range(5, 10).contains(2) -> false - * janToMay.contains(mar) -> true - * janToMay.contains(marToAug) -> false - * janToMay.contains(febToApr) -> true - * - * @param {RangeElement} el - * - ***/ - 'contains': function(el) { - if (el == null) return false; - if (el.start && el.end) { - return el.start >= this.start && el.start <= this.end && - el.end >= this.start && el.end <= this.end; - } else { - return el >= this.start && el <= this.end; - } - }, - - /*** - * @method every(amount, [everyFn]) - * @returns Array - * @short Iterates through the range by `amount`, calling [everyFn] for each step. - * @extra Returns an array of each increment visited. For date ranges, - * `amount` can also be a string like `"2 days"`. This will step - * through the range by incrementing a date object by that specific - * unit, and so is generally preferable for vague units such as - * `"2 months"`. - * - * @callback everyFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * r A reference to the range. - * - * @example - * - * Number.range(2, 8).every(2) -> [2,4,6,8] - * janToMay.every('2 months') -> [Jan 1, Mar 1, May 1] - * - * sepToOct.every('week', function() { - * // Will be called every week from September to October - * }) - * - * @param {string|number} amount - * @param {everyFn} [everyFn] - * @callbackParam {RangeElement} el - * @callbackParam {number} i - * @callbackParam {Range} r - * - ***/ - 'every': function(amount, everyFn) { - return rangeEvery(this, amount, false, everyFn); - }, - - /*** - * @method toArray() - * @returns Array - * @short Creates an array from the range. - * @extra If the range is a date range, every millisecond between the start - * and end dates will be returned. To control this use `every` instead. - * - * @example - * - * Number.range(1, 5).toArray() -> [1,2,3,4,5] - * Date.range('1 millisecond ago', 'now').toArray() -> [1ms ago, now] - * - ***/ - 'toArray': function() { - return rangeEvery(this); - }, - - /*** - * @method union(range) - * @returns Range - * @short Returns a new range with the earliest starting point as its start, - * and the latest ending point as its end. If the two ranges do not - * intersect this will effectively remove the "gap" between them. - * - * @example - * - * oneToTen.union(fiveToTwenty) -> 1..20 - * janToMay.union(marToAug) -> Jan 1, xxxx..Aug 1, xxxx - * - * @param {Range} range - * - ***/ - 'union': function(range) { - return new Range( - this.start < range.start ? this.start : range.start, - this.end > range.end ? this.end : range.end - ); - }, - - /*** - * @method intersect(range) - * @returns Range - * @short Returns a new range with the latest starting point as its start, - * and the earliest ending point as its end. If the two ranges do not - * intersect this will effectively produce an invalid range. - * - * @example - * - * oneToTen.intersect(fiveToTwenty) -> 5..10 - * janToMay.intersect(marToAug) -> Mar 1, xxxx..May 1, xxxx - * - * @param {Range} range - * - ***/ - 'intersect': function(range) { - if (range.start > this.end || range.end < this.start) { - return new Range(NaN, NaN); - } - return new Range( - this.start > range.start ? this.start : range.start, - this.end < range.end ? this.end : range.end - ); - }, - - /*** - * @method clone() - * @returns Range - * @short Clones the range. - * @extra Members of the range will also be cloned. - * - * @example - * - * Number.range(1, 5).clone() -> Returns a copy of the range. - * - ***/ - 'clone': function() { - return new Range(this.start, this.end); - }, - - /*** - * @method clamp(el) - * @returns Mixed - * @short Clamps `el` to be within the range if it falls outside. - * - * @example - * - * Number.range(1, 5).clamp(8) -> 5 - * janToMay.clamp(aug) -> May 1, xxxx - * - * @param {RangeElement} el - * - ***/ - 'clamp': function(el) { - return rangeClamp(this, el); - } - - }); - - - /*** @namespace Number ***/ - - defineStatic(sugarNumber, { - - /*** - * @method range([start], [end]) - * @returns Range - * @static - * @short Creates a new number range between [start] and [end]. See `ranges` - * for more. - * - * @example - * - * Number.range(5, 10) - * Number.range(20, 15) - * - * @param {number} [start] - * @param {number} [end] - * - ***/ - 'range': PrimitiveRangeConstructor - - }); - - defineInstance(sugarNumber, { - - /*** - * @method upto(num, [step] = 1, [everyFn]) - * @returns Array - * @short Returns an array containing numbers from the number up to `num`. - * @extra Optionally calls [everyFn] for each number in that array. [step] allows - * multiples other than 1. [everyFn] can be passed in place of [step]. - * - * @callback everyFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * r A reference to the range. - * - * @example - * - * (2).upto(6) -> [2, 3, 4, 5, 6] - * (2).upto(6, function(n) { - * // This function is called 5 times receiving n as the value. - * }); - * (2).upto(8, 2) -> [2, 4, 6, 8] - * - * @signature upto(num, [everyFn]) - * @param {number} num - * @param {number} [step] - * @param {everyFn} [everyFn] - * @callbackParam {RangeElement} el - * @callbackParam {number} i - * @callbackParam {Range} r - * - ***/ - 'upto': function(n, num, step, everyFn) { - return rangeEvery(new Range(n, num), step, false, everyFn); - }, - - /*** - * @method clamp([start] = Infinity, [end] = Infinity) - * @returns Number - * @short Constrains the number so that it falls on or between [start] and - * [end]. - * @extra This will build a range object that has an equivalent `clamp` method. - * - * @example - * - * (3).clamp(50, 100) -> 50 - * (85).clamp(50, 100) -> 85 - * - * @param {number} [start] - * @param {number} [end] - * - ***/ - 'clamp': function(n, start, end) { - return rangeClamp(new Range(start, end), n); - }, - - /*** - * @method cap([max] = Infinity) - * @returns Number - * @short Constrains the number so that it is no greater than [max]. - * @extra This will build a range object that has an equivalent `cap` method. - * - * @example - * - * (100).cap(80) -> 80 - * - * @param {number} [max] - * - ***/ - 'cap': function(n, max) { - return rangeClamp(new Range(undefined, max), n); - } - - }); - - /*** - * @method downto(num, [step] = 1, [everyFn]) - * @returns Array - * @short Returns an array containing numbers from the number down to `num`. - * @extra Optionally calls [everyFn] for each number in that array. [step] allows - * multiples other than 1. [everyFn] can be passed in place of [step]. - * - * @callback everyFn - * - * el The element of the current iteration. - * i The index of the current iteration. - * r A reference to the range. - * - * @example - * - * (8).downto(3) -> [8, 7, 6, 5, 4, 3] - * (8).downto(3, function(n) { - * // This function is called 6 times receiving n as the value. - * }); - * (8).downto(2, 2) -> [8, 6, 4, 2] - * - * @signature upto(num, [everyFn]) - * @param {number} num - * @param {number} [step] - * @param {everyFn} [everyFn] - * @callbackParam {RangeElement} el - * @callbackParam {number} i - * @callbackParam {Range} r - * - ***/ - alias(sugarNumber, 'downto', 'upto'); - - - /*** @namespace String ***/ - - defineStatic(sugarString, { - - /*** - * @method range([start], [end]) - * @returns Range - * @static - * @short Creates a new string range between [start] and [end]. See `ranges` - * for more. - * - * @example - * - * String.range('a', 'z') - * String.range('t', 'm') - * - * @param {string} [start] - * @param {string} [end] - * - ***/ - 'range': PrimitiveRangeConstructor - - }); - - - /*** @namespace Date ***/ - - - var FULL_CAPTURED_DURATION = '((?:\\d+)?\\s*(?:' + DURATION_UNITS + '))s?'; - - // Duration text formats - var RANGE_REG_FROM_TO = /(?:from)?\s*(.+)\s+(?:to|until)\s+(.+)$/i, - RANGE_REG_REAR_DURATION = RegExp('(.+)\\s*for\\s*' + FULL_CAPTURED_DURATION, 'i'), - RANGE_REG_FRONT_DURATION = RegExp('(?:for)?\\s*'+ FULL_CAPTURED_DURATION +'\\s*(?:starting)?\\s(?:at\\s)?(.+)', 'i'); - - var DateRangeConstructor = function(start, end) { - if (arguments.length === 1 && isString(start)) { - return createDateRangeFromString(start); - } - return new Range(getDateForRange(start), getDateForRange(end)); - }; - - function createDateRangeFromString(str) { - var match, datetime, duration, dio, start, end; - if (sugarDate.get && (match = str.match(RANGE_REG_FROM_TO))) { - start = getDateForRange(match[1].replace('from', 'at')); - end = sugarDate.get(start, match[2]); - return new Range(start, end); - } - if (match = str.match(RANGE_REG_FRONT_DURATION)) { - duration = match[1]; - datetime = match[2]; - } - if (match = str.match(RANGE_REG_REAR_DURATION)) { - datetime = match[1]; - duration = match[2]; - } - if (datetime && duration) { - start = getDateForRange(datetime); - dio = getDateIncrementObject(duration); - end = incrementDate(start, dio[0], dio[1]); - } else { - start = str; - } - return new Range(getDateForRange(start), getDateForRange(end)); - } - - function getDateForRange(d) { - if (isDate(d)) { - return d; - } else if (d == null) { - return new Date(); - } else if (sugarDate.create) { - return sugarDate.create(d); - } - return new Date(d); - } - - /*** - * @method [dateUnit]() - * @returns Number - * @namespace Range - * @short Returns the span of a date range in the given unit. - * @extra Higher order units ("days" and greater) walk the date to avoid - * discrepancies with ambiguity. Lower order units simply subtract the - * start from the end. - * - * @set - * milliseconds - * seconds - * minutes - * hours - * days - * weeks - * months - * years - * - * @example - * - * janToMay.months() -> 4 - * janToMay.days() -> 121 - * janToMay.hours() -> 2904 - * janToMay.minutes() -> 220320 - * - ***/ - function buildDateRangeUnits() { - var methods = {}; - forEach(DURATION_UNITS.split('|'), function(unit, i) { - var name = unit + 's', mult, fn; - if (i < 4) { - fn = function() { - return rangeEvery(this, unit, true); - }; - } else { - mult = MULTIPLIERS[simpleCapitalize(name)]; - fn = function() { - return trunc((this.end - this.start) / mult); - }; - } - methods[name] = fn; - }); - defineOnPrototype(Range, methods); - } - - defineStatic(sugarDate, { - - /*** - * @method range([start], [end]) - * @returns Range - * @namespace Date - * @static - * @short Creates a new date range between [start] and [end]. - * @extra Arguments may be either dates or strings which will be forwarded to - * the date constructor (`create` will be used if present in the build). - * If either [start] or [end] are undefined, they will default to the - * current date. This method also accepts an alternate syntax of a - * single string describing the range in natural language. See `ranges` - * for more. - * - * @example - * - * Date.range(jan, may) - * Date.range('today', 'tomorrow') - * Date.range('now', '5 days ago') - * Date.range('last Monday') - * Date.range('Monday to Friday') - * Date.range('tomorrow from 3pm to 5pm') - * Date.range('1 hour starting at 5pm Tuesday') - * - * @param {string|Date} [start] - * @param {string|Date} [end] - * - ***/ - 'range': DateRangeConstructor - - }); - - buildDateRangeUnits(); - -}).call(this); \ No newline at end of file +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(1); +module.exports = __webpack_require__(110); + + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _core__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9pbmRleC5qcz9iNjM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9udW1iZXInO1xuXG5leHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb3JlJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n"); + +/***/ }), +/* 2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"abs\", function() { return abs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"acos\", function() { return acos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"asin\", function() { return asin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan\", function() { return atan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan2\", function() { return atan2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ceil\", function() { return ceil; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cos\", function() { return cos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"exp\", function() { return exp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"floor\", function() { return floor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isEven\", function() { return isEven; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return isFinite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isInteger\", function() { return isInteger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isMultipleOf\", function() { return isMultipleOf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return isNaN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isOdd\", function() { return isOdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isSafeInteger\", function() { return isSafeInteger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"log\", function() { return log; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pow\", function() { return pow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"random\", function() { return random; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"round\", function() { return round; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sin\", function() { return sin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sqrt\", function() { return sqrt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"tan\", function() { return tan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toChar\", function() { return toChar; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toOrdinal\", function() { return toOrdinal; });\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _abs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(67);\n/* harmony import */ var _acos__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69);\n/* harmony import */ var _asin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70);\n/* harmony import */ var _atan__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(71);\n/* harmony import */ var _atan2__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(72);\n/* harmony import */ var _ceil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(73);\n/* harmony import */ var _cos__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(76);\n/* harmony import */ var _exp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(77);\n/* harmony import */ var _floor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(78);\n/* harmony import */ var _isEven__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(79);\n/* harmony import */ var _isFinite__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(91);\n/* harmony import */ var _isInteger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(93);\n/* harmony import */ var _isMultipleOf__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(94);\n/* harmony import */ var _isNaN__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(95);\n/* harmony import */ var _isOdd__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(96);\n/* harmony import */ var _isSafeInteger__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(97);\n/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(98);\n/* harmony import */ var _pow__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(99);\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(100);\n/* harmony import */ var _round__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(102);\n/* harmony import */ var _sin__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(103);\n/* harmony import */ var _sqrt__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(104);\n/* harmony import */ var _tan__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(105);\n/* harmony import */ var _toChar__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(106);\n/* harmony import */ var _toOrdinal__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(108);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar abs = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].abs,\n acos = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].acos,\n asin = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].asin,\n atan = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].atan,\n atan2 = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].atan2,\n ceil = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].ceil,\n cos = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cos,\n exp = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].exp,\n floor = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].floor,\n isEven = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isEven,\n isFinite = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFinite,\n isInteger = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isInteger,\n isMultipleOf = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isMultipleOf,\n isNaN = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isNaN,\n isOdd = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isOdd,\n isSafeInteger = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isSafeInteger,\n log = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].log,\n pow = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pow,\n random = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].random,\n round = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].round,\n sin = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].sin,\n sqrt = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].sqrt,\n tan = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tan,\n toChar = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toChar,\n toOrdinal = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toOrdinal;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9udW1iZXIvaW5kZXguanM/YzYxYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3VnYXJOdW1iZXIgZnJvbSAnLi9uYW1lc3BhY2UnO1xuXG5pbXBvcnQgJy4vYWJzJztcbmltcG9ydCAnLi9hY29zJztcbmltcG9ydCAnLi9hc2luJztcbmltcG9ydCAnLi9hdGFuJztcbmltcG9ydCAnLi9hdGFuMic7XG5pbXBvcnQgJy4vY2VpbCc7XG5pbXBvcnQgJy4vY29zJztcbmltcG9ydCAnLi9leHAnO1xuaW1wb3J0ICcuL2Zsb29yJztcbmltcG9ydCAnLi9pc0V2ZW4nO1xuaW1wb3J0ICcuL2lzRmluaXRlJztcbmltcG9ydCAnLi9pc0ludGVnZXInO1xuaW1wb3J0ICcuL2lzTXVsdGlwbGVPZic7XG5pbXBvcnQgJy4vaXNOYU4nO1xuaW1wb3J0ICcuL2lzT2RkJztcbmltcG9ydCAnLi9pc1NhZmVJbnRlZ2VyJztcbmltcG9ydCAnLi9sb2cnO1xuaW1wb3J0ICcuL3Bvdyc7XG5pbXBvcnQgJy4vcmFuZG9tJztcbmltcG9ydCAnLi9yb3VuZCc7XG5pbXBvcnQgJy4vc2luJztcbmltcG9ydCAnLi9zcXJ0JztcbmltcG9ydCAnLi90YW4nO1xuaW1wb3J0ICcuL3RvQ2hhcic7XG5pbXBvcnQgJy4vdG9PcmRpbmFsJztcblxuZXhwb3J0IGNvbnN0IHtcbiAgYWJzLFxuICBhY29zLFxuICBhc2luLFxuICBhdGFuLFxuICBhdGFuMixcbiAgY2VpbCxcbiAgY29zLFxuICBleHAsXG4gIGZsb29yLFxuICBpc0V2ZW4sXG4gIGlzRmluaXRlLFxuICBpc0ludGVnZXIsXG4gIGlzTXVsdGlwbGVPZixcbiAgaXNOYU4sXG4gIGlzT2RkLFxuICBpc1NhZmVJbnRlZ2VyLFxuICBsb2csXG4gIHBvdyxcbiAgcmFuZG9tLFxuICByb3VuZCxcbiAgc2luLFxuICBzcXJ0LFxuICB0YW4sXG4gIHRvQ2hhcixcbiAgdG9PcmRpbmFsXG59ID0gU3VnYXJOdW1iZXI7XG5cbmV4cG9ydCBkZWZhdWx0IFN1Z2FyTnVtYmVyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2\n"); + +/***/ }), +/* 3 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineStatic\", function() { return defineStatic; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineInstance\", function() { return defineInstance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineStaticAlias\", function() { return defineStaticAlias; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineInstanceAlias\", function() { return defineInstanceAlias; });\n/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n\nvar namespace = Object(_core__WEBPACK_IMPORTED_MODULE_0__[\"createNamespace\"])('Number');\nvar defineStatic = namespace.defineStatic,\n defineInstance = namespace.defineInstance,\n defineStaticAlias = namespace.defineStaticAlias,\n defineInstanceAlias = namespace.defineInstanceAlias;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (namespace);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9udW1iZXIvbmFtZXNwYWNlLmpzPzQ3ZjkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlTmFtZXNwYWNlIH0gZnJvbSAnLi4vY29yZSc7XG5cbmNvbnN0IG5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZSgnTnVtYmVyJyk7XG5cbmV4cG9ydCBjb25zdCB7XG4gIGRlZmluZVN0YXRpYyxcbiAgZGVmaW5lSW5zdGFuY2UsXG4gIGRlZmluZVN0YXRpY0FsaWFzLFxuICBkZWZpbmVJbnN0YW5jZUFsaWFzLFxufSA9IG5hbWVzcGFjZTtcblxuZXhwb3J0IGRlZmF1bHQgbmFtZXNwYWNlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3\n"); + +/***/ }), +/* 4 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return extend; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return VERSION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createNamespace\", function() { return createNamespace; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(45);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\nvar SUGAR = 'Sugar'; // TODO: test browserify\n// TODO: test broccoli\n// TODO: test rhino\n// TODO: test QML\n\nvar IS_BROWSER = typeof window !== 'undefined';\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar globalContext = getGlobalContext();\n\nfunction hasOwn(obj, prop) {\n return !!obj && hasOwnProperty.call(obj, prop);\n}\n\nfunction forEachProperty(obj, fn) {\n for (var key in obj) {\n if (!hasOwn(obj, key)) continue;\n if (fn.call(obj, key, obj[key], obj) === false) break;\n }\n}\n\nfunction getGlobalContext() {\n // Get global context by keyword here to avoid issues with libraries\n // that can potentially alter this script's context object.\n return testGlobalContext(typeof global !== 'undefined' && global) || testGlobalContext(typeof window !== 'undefined' && window) || testGlobalContext(typeof self !== 'undefined' && self);\n}\n\nfunction testGlobalContext(obj) {\n // Note that Rhino uses a different \"global\" keyword so perform an\n // extra check here to ensure that it's actually the global object.\n // TODO: test this!\n return obj && obj.Object === Object ? obj : null;\n}\n\nfunction toString() {\n return SUGAR;\n} // TODO: rinse arrow functions\n// TODO: need to export anything?\n\n\nfunction nativeMethodProhibitedOnChainable(methodName) {\n // Sugar chainables have their own constructors as well as \"valueOf\"\n // methods, so exclude them here. The __proto__ argument should be\n // trapped by the function check, however simply accessing this property\n // on Object.prototype causes QML to segfault, so pre-emptively excluding\n // it. Note we're intentionally allowing toString through to allow\n // it to be wrapped as a chainable.\n return methodName === 'constructor' || methodName === 'valueOf' || methodName === '__proto__';\n}\n\nfunction mapNativeToChainable(namespace, name) {\n var proto = globalContext[name].prototype;\n Object.getOwnPropertyNames(proto).forEach(function (methodName) {\n // TODO: not toString??\n if (nativeMethodProhibitedOnChainable(methodName)) {\n return;\n }\n\n try {\n var fn = proto[methodName];\n\n if (typeof fn !== 'function') {\n // Bail on anything not a function.\n return;\n }\n } catch (e) {\n // Function.prototype has properties that\n // will throw errors when accessed.\n return;\n }\n\n return namespace.prototype[methodName] = wrapChainableResult(fn);\n });\n}\n\nfunction canWrapChainable(obj) {\n return obj != null && obj !== true && obj !== false;\n}\n\nfunction wrapChainableResult(fn) {\n return function () {\n var result = fn.apply(this.raw, arguments);\n\n if (!canWrapChainable(result)) {\n return result;\n } // Objects may not have prototypes.\n\n\n var ctor = result.constructor;\n var name = ctor ? ctor.name : 'Object';\n var namespace = Sugar[name];\n\n if (!namespace && (!ctor || ctor === globalContext[name])) {\n namespace = createNamespace(name);\n }\n\n return namespace ? new namespace(result) : result;\n };\n}\n\nfunction createExport() {\n var obj = {\n VERSION: VERSION,\n extend: extend,\n toString: toString,\n createNamespace: createNamespace\n };\n\n if (IS_BROWSER) {\n try {\n // Reuse already defined Sugar global object.\n globalContext[SUGAR] = globalContext[SUGAR] || obj;\n } catch (e) {\n console.error(e); // Contexts such as QML have a read-only global context.\n }\n }\n\n return obj;\n}\n\nfunction extend() {\n console.info('EXTENDINNNNNNNn');\n}\n\nfunction assertMethodDoesNotExist(namespace, methodName) {\n if (namespace[methodName]) {\n throw new Error(ERROR_METHOD_DEFINED);\n }\n}\n\nfunction _defineStatic(namespace, methodName, fn) {\n assertMethodDoesNotExist(namespace, methodName);\n return namespace[methodName] = fn;\n}\n\nfunction _defineInstance(namespace, methodName, fn) {\n assertMethodDoesNotExist(namespace, methodName);\n var instance = wrapStaticMethodAsInstance(namespace, fn);\n namespace[methodName] = fn;\n namespace.prototype[methodName] = wrapChainableResult(instance);\n}\n\nfunction wrapStaticMethodAsInstance(namespace, fn) {\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args.unshift(this);\n return fn.apply(namespace, args);\n };\n}\n\nfunction defineWithArgs(namespace, defineMethod, args) {\n if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3___default()(args[0]) === 'object') {\n forEachProperty(args[0], function (methodName, fn) {\n defineMethod(namespace, methodName, fn);\n });\n } else {\n return defineMethod(namespace, args[0], args[1]);\n }\n}\n\nfunction defineAliases(namespace, defineMethod, str, fn) {\n str.split(' ').forEach(function (methodName) {\n defineMethod(namespace, methodName, fn(methodName));\n });\n}\n\nvar ERROR_METHOD_DEFINED = 'Method already defined';\nvar ERROR_NATIVE_UNKNOWN = 'Native class does not exist';\nvar INSTANCE = 0x1;\nvar STATIC = 0x2;\nvar VERSION = \"3.0.0\";\nfunction createNamespace(name) {\n if (!globalContext[name]) {\n throw new Error(ERROR_NATIVE_UNKNOWN);\n }\n\n if (Sugar[name]) {\n return Sugar[name];\n }\n\n var SugarChainable =\n /*#__PURE__*/\n function () {\n function SugarChainable(raw) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SugarChainable);\n\n this.raw = raw;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SugarChainable, [{\n key: \"valueOf\",\n value: function valueOf() {\n return this.raw;\n }\n }], [{\n key: \"defineStatic\",\n value: function defineStatic() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return defineWithArgs(SugarChainable, _defineStatic, args);\n }\n }, {\n key: \"defineInstance\",\n value: function defineInstance() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return defineWithArgs(SugarChainable, _defineInstance, args);\n }\n }, {\n key: \"defineStaticAlias\",\n value: function defineStaticAlias(str, fn) {\n return defineAliases(SugarChainable, _defineStatic, str, fn);\n }\n }, {\n key: \"defineInstanceAlias\",\n value: function defineInstanceAlias(str, fn) {\n return defineAliases(SugarChainable, _defineInstance, str, fn);\n }\n }, {\n key: \"toString\",\n value: function toString() {\n return SUGAR + name;\n }\n }]);\n\n return SugarChainable;\n }();\n\n mapNativeToChainable(SugarChainable, name);\n return Sugar[name] = SugarChainable;\n}\nvar Sugar = createExport();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Sugar);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb3JlL2luZGV4LmpzP2M3YjIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU1VHQVIgPSAnU3VnYXInO1xuXG4vLyBUT0RPOiB0ZXN0IGJyb3dzZXJpZnlcbi8vIFRPRE86IHRlc3QgYnJvY2NvbGlcbi8vIFRPRE86IHRlc3Qgcmhpbm9cbi8vIFRPRE86IHRlc3QgUU1MXG5jb25zdCBJU19CUk9XU0VSID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmNvbnN0IGdsb2JhbENvbnRleHQgPSBnZXRHbG9iYWxDb250ZXh0KCk7XG5cbmZ1bmN0aW9uIGhhc093bihvYmosIHByb3ApIHtcbiAgcmV0dXJuICEhb2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaFByb3BlcnR5KG9iaiwgZm4pIHtcbiAgZm9yKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFoYXNPd24ob2JqLCBrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoZm4uY2FsbChvYmosIGtleSwgb2JqW2tleV0sIG9iaikgPT09IGZhbHNlKSBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHbG9iYWxDb250ZXh0KCkge1xuICAvLyBHZXQgZ2xvYmFsIGNvbnRleHQgYnkga2V5d29yZCBoZXJlIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGxpYnJhcmllc1xuICAvLyB0aGF0IGNhbiBwb3RlbnRpYWxseSBhbHRlciB0aGlzIHNjcmlwdCdzIGNvbnRleHQgb2JqZWN0LlxuICByZXR1cm4gdGVzdEdsb2JhbENvbnRleHQodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgdGVzdEdsb2JhbENvbnRleHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93KSB8fFxuICAgICAgICAgdGVzdEdsb2JhbENvbnRleHQodHlwZW9mIHNlbGYgICAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZik7XG59XG5cbmZ1bmN0aW9uIHRlc3RHbG9iYWxDb250ZXh0KG9iaikge1xuICAvLyBOb3RlIHRoYXQgUmhpbm8gdXNlcyBhIGRpZmZlcmVudCBcImdsb2JhbFwiIGtleXdvcmQgc28gcGVyZm9ybSBhblxuICAvLyBleHRyYSBjaGVjayBoZXJlIHRvIGVuc3VyZSB0aGF0IGl0J3MgYWN0dWFsbHkgdGhlIGdsb2JhbCBvYmplY3QuXG4gIC8vIFRPRE86IHRlc3QgdGhpcyFcbiAgcmV0dXJuIG9iaiAmJiBvYmouT2JqZWN0ID09PSBPYmplY3QgPyBvYmogOiBudWxsO1xufVxuXG5mdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIFNVR0FSO1xufVxuLy8gVE9ETzogcmluc2UgYXJyb3cgZnVuY3Rpb25zXG4vLyBUT0RPOiBuZWVkIHRvIGV4cG9ydCBhbnl0aGluZz9cblxuZnVuY3Rpb24gbmF0aXZlTWV0aG9kUHJvaGliaXRlZE9uQ2hhaW5hYmxlKG1ldGhvZE5hbWUpIHtcbiAgLy8gU3VnYXIgY2hhaW5hYmxlcyBoYXZlIHRoZWlyIG93biBjb25zdHJ1Y3RvcnMgYXMgd2VsbCBhcyBcInZhbHVlT2ZcIlxuICAvLyBtZXRob2RzLCBzbyBleGNsdWRlIHRoZW0gaGVyZS4gVGhlIF9fcHJvdG9fXyBhcmd1bWVudCBzaG91bGQgYmVcbiAgLy8gdHJhcHBlZCBieSB0aGUgZnVuY3Rpb24gY2hlY2ssIGhvd2V2ZXIgc2ltcGx5IGFjY2Vzc2luZyB0aGlzIHByb3BlcnR5XG4gIC8vIG9uIE9iamVjdC5wcm90b3R5cGUgY2F1c2VzIFFNTCB0byBzZWdmYXVsdCwgc28gcHJlLWVtcHRpdmVseSBleGNsdWRpbmdcbiAgLy8gaXQuIE5vdGUgd2UncmUgaW50ZW50aW9uYWxseSBhbGxvd2luZyB0b1N0cmluZyB0aHJvdWdoIHRvIGFsbG93XG4gIC8vIGl0IHRvIGJlIHdyYXBwZWQgYXMgYSBjaGFpbmFibGUuXG4gIHJldHVybiBtZXRob2ROYW1lID09PSAnY29uc3RydWN0b3InIHx8XG4gICAgICAgICBtZXRob2ROYW1lID09PSAndmFsdWVPZicgfHxcbiAgICAgICAgIG1ldGhvZE5hbWUgPT09ICdfX3Byb3RvX18nO1xufVxuXG5mdW5jdGlvbiBtYXBOYXRpdmVUb0NoYWluYWJsZShuYW1lc3BhY2UsIG5hbWUpIHtcblxuICBjb25zdCBwcm90byA9IGdsb2JhbENvbnRleHRbbmFtZV0ucHJvdG90eXBlO1xuXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIC8vIFRPRE86IG5vdCB0b1N0cmluZz8/XG4gICAgaWYgKG5hdGl2ZU1ldGhvZFByb2hpYml0ZWRPbkNoYWluYWJsZShtZXRob2ROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdmFyIGZuID0gcHJvdG9bbWV0aG9kTmFtZV07XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEJhaWwgb24gYW55dGhpbmcgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBGdW5jdGlvbi5wcm90b3R5cGUgaGFzIHByb3BlcnRpZXMgdGhhdFxuICAgICAgLy8gd2lsbCB0aHJvdyBlcnJvcnMgd2hlbiBhY2Nlc3NlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzcGFjZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSB3cmFwQ2hhaW5hYmxlUmVzdWx0KGZuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNhbldyYXBDaGFpbmFibGUob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogIT09IHRydWUgJiYgb2JqICE9PSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gd3JhcENoYWluYWJsZVJlc3VsdChmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcy5yYXcsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFjYW5XcmFwQ2hhaW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIE9iamVjdHMgbWF5IG5vdCBoYXZlIHByb3RvdHlwZXMuXG4gICAgY29uc3QgY3RvciA9IHJlc3VsdC5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCBuYW1lID0gY3RvciA/IGN0b3IubmFtZSA6ICdPYmplY3QnO1xuICAgIGxldCBuYW1lc3BhY2UgPSBTdWdhcltuYW1lXTtcbiAgICBpZiAoIW5hbWVzcGFjZSAmJiAoIWN0b3IgfHwgY3RvciA9PT0gZ2xvYmFsQ29udGV4dFtuYW1lXSkpIHtcbiAgICAgIG5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZShuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzcGFjZSA/IG5ldyBuYW1lc3BhY2UocmVzdWx0KSA6IHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFeHBvcnQoKSB7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIHRvU3RyaW5nOiB0b1N0cmluZyxcbiAgICBjcmVhdGVOYW1lc3BhY2U6IGNyZWF0ZU5hbWVzcGFjZVxuICB9O1xuXG4gIGlmIChJU19CUk9XU0VSKSB7XG4gICAgdHJ5IHtcbiAgICAvLyBSZXVzZSBhbHJlYWR5IGRlZmluZWQgU3VnYXIgZ2xvYmFsIG9iamVjdC5cbiAgICAgIGdsb2JhbENvbnRleHRbU1VHQVJdID0gZ2xvYmFsQ29udGV4dFtTVUdBUl0gfHwgb2JqO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIC8vIENvbnRleHRzIHN1Y2ggYXMgUU1MIGhhdmUgYSByZWFkLW9ubHkgZ2xvYmFsIGNvbnRleHQuXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgY29uc29sZS5pbmZvKCdFWFRFTkRJTk5OTk5OTm4nKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0TWV0aG9kRG9lc05vdEV4aXN0KG5hbWVzcGFjZSwgbWV0aG9kTmFtZSkge1xuICBpZiAobmFtZXNwYWNlW21ldGhvZE5hbWVdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01FVEhPRF9ERUZJTkVEKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVTdGF0aWMobmFtZXNwYWNlLCBtZXRob2ROYW1lLCBmbikge1xuICBhc3NlcnRNZXRob2REb2VzTm90RXhpc3QobmFtZXNwYWNlLCBtZXRob2ROYW1lKTtcbiAgcmV0dXJuIG5hbWVzcGFjZVttZXRob2ROYW1lXSA9IGZuO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVJbnN0YW5jZShuYW1lc3BhY2UsIG1ldGhvZE5hbWUsIGZuKSB7XG4gIGFzc2VydE1ldGhvZERvZXNOb3RFeGlzdChuYW1lc3BhY2UsIG1ldGhvZE5hbWUpO1xuICBjb25zdCBpbnN0YW5jZSA9IHdyYXBTdGF0aWNNZXRob2RBc0luc3RhbmNlKG5hbWVzcGFjZSwgZm4pO1xuICBuYW1lc3BhY2VbbWV0aG9kTmFtZV0gPSBmbjtcbiAgbmFtZXNwYWNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IHdyYXBDaGFpbmFibGVSZXN1bHQoaW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiB3cmFwU3RhdGljTWV0aG9kQXNJbnN0YW5jZShuYW1lc3BhY2UsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBmbi5hcHBseShuYW1lc3BhY2UsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZVdpdGhBcmdzKG5hbWVzcGFjZSwgZGVmaW5lTWV0aG9kLCBhcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3JFYWNoUHJvcGVydHkoYXJnc1swXSwgKG1ldGhvZE5hbWUsIGZuKSA9PiB7XG4gICAgICBkZWZpbmVNZXRob2QobmFtZXNwYWNlLCBtZXRob2ROYW1lLCBmbik7XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmaW5lTWV0aG9kKG5hbWVzcGFjZSwgYXJnc1swXSwgYXJnc1sxXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lQWxpYXNlcyhuYW1lc3BhY2UsIGRlZmluZU1ldGhvZCwgc3RyLCBmbikge1xuICBzdHIuc3BsaXQoJyAnKS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIGRlZmluZU1ldGhvZChuYW1lc3BhY2UsIG1ldGhvZE5hbWUsIGZuKG1ldGhvZE5hbWUpKTtcbiAgfSk7XG59XG5cbmNvbnN0IEVSUk9SX01FVEhPRF9ERUZJTkVEID0gJ01ldGhvZCBhbHJlYWR5IGRlZmluZWQnO1xuY29uc3QgRVJST1JfTkFUSVZFX1VOS05PV04gPSAnTmF0aXZlIGNsYXNzIGRvZXMgbm90IGV4aXN0JztcblxuY29uc3QgSU5TVEFOQ0UgPSAweDE7XG5jb25zdCBTVEFUSUMgICA9IDB4MjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIjMuMC4wXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOYW1lc3BhY2UobmFtZSkge1xuXG4gIGlmICghZ2xvYmFsQ29udGV4dFtuYW1lXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9OQVRJVkVfVU5LTk9XTik7XG4gIH1cblxuICBpZiAoU3VnYXJbbmFtZV0pIHtcbiAgICByZXR1cm4gU3VnYXJbbmFtZV07XG4gIH1cblxuICBjbGFzcyBTdWdhckNoYWluYWJsZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihyYXcpIHtcbiAgICAgIHRoaXMucmF3ID0gcmF3O1xuICAgIH1cblxuICAgIHN0YXRpYyBkZWZpbmVTdGF0aWMoLi4uYXJncykge1xuICAgICAgcmV0dXJuIGRlZmluZVdpdGhBcmdzKFN1Z2FyQ2hhaW5hYmxlLCBkZWZpbmVTdGF0aWMsIGFyZ3MpO1xuICAgIH1cblxuICAgIHN0YXRpYyBkZWZpbmVJbnN0YW5jZSguLi5hcmdzKSB7XG4gICAgICByZXR1cm4gZGVmaW5lV2l0aEFyZ3MoU3VnYXJDaGFpbmFibGUsIGRlZmluZUluc3RhbmNlLCBhcmdzKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmaW5lU3RhdGljQWxpYXMoc3RyLCBmbikge1xuICAgICAgcmV0dXJuIGRlZmluZUFsaWFzZXMoU3VnYXJDaGFpbmFibGUsIGRlZmluZVN0YXRpYywgc3RyLCBmbik7XG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmluZUluc3RhbmNlQWxpYXMoc3RyLCBmbikge1xuICAgICAgcmV0dXJuIGRlZmluZUFsaWFzZXMoU3VnYXJDaGFpbmFibGUsIGRlZmluZUluc3RhbmNlLCBzdHIsIGZuKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gU1VHQVIgKyBuYW1lO1xuICAgIH1cblxuICAgIHZhbHVlT2YoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXc7XG4gICAgfVxuXG4gIH1cblxuICBtYXBOYXRpdmVUb0NoYWluYWJsZShTdWdhckNoYWluYWJsZSwgbmFtZSk7XG5cbiAgcmV0dXJuIFN1Z2FyW25hbWVdID0gU3VnYXJDaGFpbmFibGU7XG59XG5cbmNvbnN0IFN1Z2FyID0gY3JlYXRlRXhwb3J0KCk7XG5leHBvcnQgZGVmYXVsdCBTdWdhcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQUFBO0FBQUE7QUFZQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFmQTtBQUFBO0FBQUE7QUFxQ0E7QUFDQTtBQXRDQTtBQUFBO0FBQUE7QUFnQkE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBbEJBO0FBQUE7QUFBQTtBQW9CQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUF0QkE7QUFBQTtBQUFBO0FBeUJBO0FBQ0E7QUExQkE7QUFBQTtBQUFBO0FBNkJBO0FBQ0E7QUE5QkE7QUFBQTtBQUFBO0FBaUNBO0FBQ0E7QUFsQ0E7QUFDQTtBQURBO0FBQUE7QUFDQTtBQXlDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4\n"); + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + +eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanM/Y2QwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5\n"); + +/***/ }), +/* 6 */ +/***/ (function(module, exports) { + +eval("function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzPzk3MGIiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6\n"); + +/***/ }), +/* 7 */ +/***/ (function(module, exports) { + +eval("function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzPzViYzMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n"); + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nvar isRegExp = __webpack_require__(9);\nvar anObject = __webpack_require__(18);\nvar speciesConstructor = __webpack_require__(19);\nvar advanceStringIndex = __webpack_require__(21);\nvar toLength = __webpack_require__(25);\nvar callRegExpExec = __webpack_require__(26);\nvar regexpExec = __webpack_require__(28);\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\n\n// eslint-disable-next-line no-empty\nvar SUPPORTS_Y = !!(function () { try { return new RegExp('x', 'y'); } catch (e) {} })();\n\n// @@split logic\n__webpack_require__(30)('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit = $split;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? 0xffffffff : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcz8yOGE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNhbGxSZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnZhciAkbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyICRTUExJVCA9ICdzcGxpdCc7XG52YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbnZhciBTVVBQT1JUU19ZID0gISEoZnVuY3Rpb24gKCkgeyB0cnkgeyByZXR1cm4gbmV3IFJlZ0V4cCgneCcsICd5Jyk7IH0gY2F0Y2ggKGUpIHt9IH0pKCk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgU1BMSVQsICRzcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBpbnRlcm5hbFNwbGl0ID0gJHNwbGl0O1xuICBpZiAoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICkge1xuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuICRzcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gNDI5NDk2NzI5NSA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgaWYgKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pICRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKG91dHB1dFtMRU5HVEhdID49IHNwbGl0TGltaXQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleCkgc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSsrOyAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICB9XG4gICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pIHtcbiAgICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvckNvcHkudGVzdCgnJykpIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZiAoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6ICRzcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwbGl0dGVyLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXRcbiAgICAvL1xuICAgIC8vIE5PVEU6IFRoaXMgY2Fubm90IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQgaW4gZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnRcbiAgICAvLyB0aGUgJ3knIGZsYWcuXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgbGltaXQpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoaW50ZXJuYWxTcGxpdCwgcmVnZXhwLCB0aGlzLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gJHNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocngubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gMHhmZmZmZmZmZiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gJG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoU1VQUE9SVFNfWSA/IDAgOiBxKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEEucHVzaCh6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBLnB1c2goUy5zbGljZShwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n"); + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(10);\nvar cof = __webpack_require__(11);\nvar MATCH = __webpack_require__(12)('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcz9hYWUzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n"); + +/***/ }), +/* 10 */ +/***/ (function(module, exports) { + +eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanM/ZDNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n"); + +/***/ }), +/* 11 */ +/***/ (function(module, exports) { + +eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanM/MmQ5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11\n"); + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var store = __webpack_require__(13)('wks');\nvar uid = __webpack_require__(17);\nvar Symbol = __webpack_require__(15).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MuanM/MmI0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///12\n"); + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var core = __webpack_require__(14);\nvar global = __webpack_require__(15);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: __webpack_require__(16) ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanM/NTUzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///13\n"); + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +eval("var core = module.exports = { version: '2.6.0' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzPzgzNzgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi4wJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14\n"); + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + +eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanM/NzcyNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///15\n"); + +/***/ }), +/* 16 */ +/***/ (function(module, exports) { + +eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzPzJkMDAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///16\n"); + +/***/ }), +/* 17 */ +/***/ (function(module, exports) { + +eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191aWQuanM/Y2E1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n"); + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(10);\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanM/Y2I3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///18\n"); + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(18);\nvar aFunction = __webpack_require__(20);\nvar SPECIES = __webpack_require__(12)('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzP2ViZDYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///19\n"); + +/***/ }), +/* 20 */ +/***/ (function(module, exports) { + +eval("module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzP2Q4ZTgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///20\n"); + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar at = __webpack_require__(22)(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZHZhbmNlLXN0cmluZy1pbmRleC5qcz8wMzkwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4gLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gYXQoUywgaW5kZXgpLmxlbmd0aCA6IDEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///21\n"); + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var toInteger = __webpack_require__(23);\nvar defined = __webpack_require__(24);\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanM/MDJmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22\n"); + +/***/ }), +/* 23 */ +/***/ (function(module, exports) { + +eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzPzQ1ODgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///23\n"); + +/***/ }), +/* 24 */ +/***/ (function(module, exports) { + +eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzP2JlMTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///24\n"); + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(23);\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanM/OWRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///25\n"); + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nvar classof = __webpack_require__(27);\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy1hYnN0cmFjdC5qcz81ZjFiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgYnVpbHRpbkV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG5cbiAvLyBgUmVnRXhwRXhlY2AgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpO1xuICB9XG4gIHJldHVybiBidWlsdGluRXhlYy5jYWxsKFIsIFMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///26\n"); + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(11);\nvar TAG = __webpack_require__(12)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzPzIzYzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///27\n"); + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nvar regexpFlags = __webpack_require__(29);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy5qcz81MjBhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZ2V4cEZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcblxudmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG4vLyBUaGlzIGFsd2F5cyByZWZlcnMgdG8gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZSB0aGVcbi8vIFN0cmluZyNyZXBsYWNlIHBvbHlmaWxsIHVzZXMgLi9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzLFxuLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLlxudmFyIG5hdGl2ZVJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG5cbnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7XG5cbnZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvLFxuICAgICAgcmUyID0gL2IqL2c7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTEsICdhJyk7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7XG4gIHJldHVybiByZTFbTEFTVF9JTkRFWF0gIT09IDAgfHwgcmUyW0xBU1RfSU5ERVhdICE9PSAwO1xufSkoKTtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxudmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDtcblxudmFyIFBBVENIID0gVVBEQVRFU19MQVNUX0lOREVYX1dST05HIHx8IE5QQ0dfSU5DTFVERUQ7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuXG4gICAgaWYgKE5QQ0dfSU5DTFVERUQpIHtcbiAgICAgIHJlQ29weSA9IG5ldyBSZWdFeHAoJ14nICsgcmUuc291cmNlICsgJyQoPyFcXFxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7XG4gICAgfVxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcpIGxhc3RJbmRleCA9IHJlW0xBU1RfSU5ERVhdO1xuXG4gICAgbWF0Y2ggPSBuYXRpdmVFeGVjLmNhbGwocmUsIHN0cik7XG5cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HICYmIG1hdGNoKSB7XG4gICAgICByZVtMQVNUX0lOREVYXSA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICBuYXRpdmVSZXBsYWNlLmNhbGwobWF0Y2hbMF0sIHJlQ29weSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///28\n"); + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(18);\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcz8wYmZiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29\n"); + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n__webpack_require__(31);\nvar redefine = __webpack_require__(41);\nvar hide = __webpack_require__(33);\nvar fails = __webpack_require__(37);\nvar defined = __webpack_require__(24);\nvar wks = __webpack_require__(12);\nvar regexpExec = __webpack_require__(28);\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzPzIxNGYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmV4ZWMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3a3MoJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxudmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDIgJiYgcmVzdWx0WzBdID09PSAnYScgJiYgcmVzdWx0WzFdID09PSAnYic7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCA/ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgIH1cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIGZucyA9IGV4ZWMoXG4gICAgICBkZWZpbmVkLFxuICAgICAgU1lNQk9MLFxuICAgICAgJydbS0VZXSxcbiAgICAgIGZ1bmN0aW9uIG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgICB9XG4gICAgKTtcbiAgICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gICAgdmFyIHJ4Zm4gPSBmbnNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///30\n"); + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar regexpExec = __webpack_require__(28);\n__webpack_require__(32)({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYy5qcz9iMGM1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnJlcXVpcmUoJy4vX2V4cG9ydCcpKHtcbiAgdGFyZ2V0OiAnUmVnRXhwJyxcbiAgcHJvdG86IHRydWUsXG4gIGZvcmNlZDogcmVnZXhwRXhlYyAhPT0gLy4vLmV4ZWNcbn0sIHtcbiAgZXhlYzogcmVnZXhwRXhlY1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///31\n"); + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(15);\nvar core = __webpack_require__(14);\nvar hide = __webpack_require__(33);\nvar redefine = __webpack_require__(41);\nvar ctx = __webpack_require__(43);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19leHBvcnQuanM/NWNhMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSk7XG4gIHZhciBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmICh0YXJnZXQpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmIChleHBvcnRzW2tleV0gIT0gb3V0KSBoaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZiAoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpIGV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///32\n"); + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var dP = __webpack_require__(34);\nvar createDesc = __webpack_require__(40);\nmodule.exports = __webpack_require__(36) ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzPzMyZTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///33\n"); + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var anObject = __webpack_require__(18);\nvar IE8_DOM_DEFINE = __webpack_require__(35);\nvar toPrimitive = __webpack_require__(39);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(36) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanM/ODZjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///34\n"); + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("module.exports = !__webpack_require__(36) && !__webpack_require__(37)(function () {\n return Object.defineProperty(__webpack_require__(38)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcz9jNjlhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///35\n"); + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(37)(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcz85ZTFlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///36\n"); + +/***/ }), +/* 37 */ +/***/ (function(module, exports) { + +eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcz83OWU1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37\n"); + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(10);\nvar document = __webpack_require__(15).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzPzIzMGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///38\n"); + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(10);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanM/NmE5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n"); + +/***/ }), +/* 40 */ +/***/ (function(module, exports) { + +eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzPzQ2MzAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40\n"); + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var global = __webpack_require__(15);\nvar hide = __webpack_require__(33);\nvar has = __webpack_require__(42);\nvar SRC = __webpack_require__(17)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(14).inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcz8yYWJhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41\n"); + +/***/ }), +/* 42 */ +/***/ (function(module, exports) { + +eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanM/NjlhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///42\n"); + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// optional / simple context binding\nvar aFunction = __webpack_require__(20);\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanM/OWI0MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43\n"); + +/***/ }), +/* 44 */ +/***/ (function(module, exports) { + +eval("function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanM/NzAzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZjIob2JqKTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///44\n"); + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var $iterators = __webpack_require__(46);\nvar getKeys = __webpack_require__(56);\nvar redefine = __webpack_require__(41);\nvar global = __webpack_require__(15);\nvar hide = __webpack_require__(33);\nvar Iterators = __webpack_require__(49);\nvar wks = __webpack_require__(12);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanM/YWM2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///45\n"); + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar addToUnscopables = __webpack_require__(47);\nvar step = __webpack_require__(48);\nvar Iterators = __webpack_require__(49);\nvar toIObject = __webpack_require__(50);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(52)(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcz9jYWRmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46\n"); + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(12)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(33)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanM/OWM2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///47\n"); + +/***/ }), +/* 48 */ +/***/ (function(module, exports) { + +eval("module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanM/ZDUzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n"); + +/***/ }), +/* 49 */ +/***/ (function(module, exports) { + +eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanM/ODRmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///49\n"); + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(51);\nvar defined = __webpack_require__(24);\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzPzY4MjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50\n"); + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(11);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzPzYyNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51\n"); + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar LIBRARY = __webpack_require__(16);\nvar $export = __webpack_require__(32);\nvar redefine = __webpack_require__(41);\nvar hide = __webpack_require__(33);\nvar Iterators = __webpack_require__(49);\nvar $iterCreate = __webpack_require__(53);\nvar setToStringTag = __webpack_require__(63);\nvar getPrototypeOf = __webpack_require__(64);\nvar ITERATOR = __webpack_require__(12)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcz8wMWY5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52\n"); + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar create = __webpack_require__(54);\nvar descriptor = __webpack_require__(40);\nvar setToStringTag = __webpack_require__(63);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(33)(IteratorPrototype, __webpack_require__(12)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcz80MWEwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53\n"); + +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(18);\nvar dPs = __webpack_require__(55);\nvar enumBugKeys = __webpack_require__(61);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(38)('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(62).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzJhZWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54\n"); + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var dP = __webpack_require__(34);\nvar anObject = __webpack_require__(18);\nvar getKeys = __webpack_require__(56);\n\nmodule.exports = __webpack_require__(36) ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzPzE0OTUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///55\n"); + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(57);\nvar enumBugKeys = __webpack_require__(61);\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcz8wZDU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n"); + +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var has = __webpack_require__(42);\nvar toIObject = __webpack_require__(50);\nvar arrayIndexOf = __webpack_require__(58)(false);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jZTEwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///57\n"); + +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(50);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(59);\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcz9jMzY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58\n"); + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var toInteger = __webpack_require__(23);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcz83N2YxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///59\n"); + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var shared = __webpack_require__(13)('keys');\nvar uid = __webpack_require__(17);\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzPzYxM2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///60\n"); + +/***/ }), +/* 61 */ +/***/ (function(module, exports) { + +eval("// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzP2UxMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///61\n"); + +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var document = __webpack_require__(15).document;\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzP2ZhYjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///62\n"); + +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var def = __webpack_require__(34).f;\nvar has = __webpack_require__(42);\nvar TAG = __webpack_require__(12)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcz83ZjIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63\n"); + +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(42);\nvar toObject = __webpack_require__(65);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzPzM4ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64\n"); + +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(24);\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanM/NGJmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///65\n"); + +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var dP = __webpack_require__(34).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(36) && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzPzdmN2YiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///66\n"); + +/***/ }), +/* 67 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"abs\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Ficy5qcz9hZjkxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGFicyBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///67\n"); + +/***/ }), +/* 68 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"abs\", function() { return abs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pow\", function() { return pow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sin\", function() { return sin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"asin\", function() { return asin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cos\", function() { return cos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"acos\", function() { return acos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"tan\", function() { return tan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan\", function() { return atan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan2\", function() { return atan2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"exp\", function() { return exp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sqrt\", function() { return sqrt; });\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n\n\nObject(_namespace__WEBPACK_IMPORTED_MODULE_1__[\"defineInstanceAlias\"])('abs pow sin asin cos acos tan atan atan2 exp sqrt', function (name) {\n return function (n, arg) {\n // Note that .valueOf() here is only required due to a\n // very strange bug in iOS7 that only occurs occasionally\n // in which Math.abs() called on non-primitive numbers\n // returns a completely different number (Issue #400)\n return Math[name](n.valueOf(), arg);\n };\n});\nvar abs = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].abs,\n pow = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].pow,\n sin = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].sin,\n asin = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].asin,\n cos = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].cos,\n acos = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].acos,\n tan = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].tan,\n atan = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].atan,\n atan2 = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].atan2,\n exp = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].exp,\n sqrt = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].sqrt;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvbWF0aEFsaWFzZXMuanM/NDc0NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3VnYXJOdW1iZXIsIHsgZGVmaW5lSW5zdGFuY2VBbGlhcyB9IGZyb20gJy4uL25hbWVzcGFjZSc7XG5cbmRlZmluZUluc3RhbmNlQWxpYXMoJ2FicyBwb3cgc2luIGFzaW4gY29zIGFjb3MgdGFuIGF0YW4gYXRhbjIgZXhwIHNxcnQnLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG4sIGFyZykge1xuICAgICAgLy8gTm90ZSB0aGF0IC52YWx1ZU9mKCkgaGVyZSBpcyBvbmx5IHJlcXVpcmVkIGR1ZSB0byBhXG4gICAgICAvLyB2ZXJ5IHN0cmFuZ2UgYnVnIGluIGlPUzcgdGhhdCBvbmx5IG9jY3VycyBvY2Nhc2lvbmFsbHlcbiAgICAgIC8vIGluIHdoaWNoIE1hdGguYWJzKCkgY2FsbGVkIG9uIG5vbi1wcmltaXRpdmUgbnVtYmVyc1xuICAgICAgLy8gcmV0dXJucyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG51bWJlciAoSXNzdWUgIzQwMClcbiAgICAgIHJldHVybiBNYXRoW25hbWVdKG4udmFsdWVPZigpLCBhcmcpO1xuICAgIH07XG4gIH1cbik7XG5cbmV4cG9ydCBjb25zdCB7IGFicywgcG93LCBzaW4sIGFzaW4sIGNvcywgYWNvcywgdGFuLCBhdGFuLCBhdGFuMiwgZXhwLCBzcXJ0IH0gPSBTdWdhck51bWJlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///68\n"); + +/***/ }), +/* 69 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"acos\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Fjb3MuanM/NDRhMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhY29zIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbWF0aEFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///69\n"); + +/***/ }), +/* 70 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"asin\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2FzaW4uanM/MWIzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhc2luIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbWF0aEFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70\n"); + +/***/ }), +/* 71 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"atan\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2F0YW4uanM/NWUwYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhdGFuIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbWF0aEFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71\n"); + +/***/ }), +/* 72 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"atan2\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2F0YW4yLmpzP2IyNTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgYXRhbjIgYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9tYXRoQWxpYXNlcyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///72\n"); + +/***/ }), +/* 73 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__[\"ceil\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2NlaWwuanM/ZmViMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjZWlsIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvcm91bmRpbmdBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///73\n"); + +/***/ }), +/* 74 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"round\", function() { return round; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"floor\", function() { return floor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ceil\", function() { return ceil; });\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n/* harmony import */ var _roundWithPrecision__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(75);\n\n\n\nObject(_namespace__WEBPACK_IMPORTED_MODULE_1__[\"defineInstanceAlias\"])('round floor ceil', function (name) {\n var fn = Math[name];\n return function (n, place) {\n return place ? Object(_roundWithPrecision__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(n, place, fn) : fn(n);\n };\n});\nvar round = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].round,\n floor = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].floor,\n ceil = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].ceil;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvcm91bmRpbmdBbGlhc2VzLmpzPzUxMzkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFN1Z2FyTnVtYmVyLCB7IGRlZmluZUluc3RhbmNlQWxpYXMgfSBmcm9tICcuLi9uYW1lc3BhY2UnO1xuaW1wb3J0IHJvdW5kV2l0aFByZWNpc2lvbiBmcm9tICcuL3JvdW5kV2l0aFByZWNpc2lvbic7XG5cbmRlZmluZUluc3RhbmNlQWxpYXMoJ3JvdW5kIGZsb29yIGNlaWwnLCBmdW5jdGlvbihuYW1lKSB7XG4gIGNvbnN0IGZuID0gTWF0aFtuYW1lXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKG4sIHBsYWNlKSB7XG4gICAgcmV0dXJuIHBsYWNlID8gcm91bmRXaXRoUHJlY2lzaW9uKG4sIHBsYWNlLCBmbikgOiBmbihuKTtcbiAgfTtcbn0pO1xuXG5leHBvcnQgY29uc3QgeyByb3VuZCwgZmxvb3IsIGNlaWwgfSA9IFN1Z2FyTnVtYmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///74\n"); + +/***/ }), +/* 75 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (val, place) {\n var fn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Math.round;\n var mult = Math.pow(10, Math.abs(place || 0));\n\n if (place < 0) {\n mult = 1 / mult;\n }\n\n return fn(val * mult) / mult;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvcm91bmRXaXRoUHJlY2lzaW9uLmpzPzQ1ODEiXSwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWwsIHBsYWNlLCBmbiA9IE1hdGgucm91bmQpIHtcbiAgbGV0IG11bHQgPSBNYXRoLnBvdygxMCwgTWF0aC5hYnMocGxhY2UgfHwgMCkpO1xuICBpZiAocGxhY2UgPCAwKSB7XG4gICAgbXVsdCA9IDEgLyBtdWx0O1xuICB9XG4gIHJldHVybiBmbih2YWwgKiBtdWx0KSAvIG11bHQ7XG59XG5cbiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///75\n"); + +/***/ }), +/* 76 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"cos\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Nvcy5qcz9hMTkzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGNvcyBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///76\n"); + +/***/ }), +/* 77 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"exp\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2V4cC5qcz82NmJkIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGV4cCBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///77\n"); + +/***/ }), +/* 78 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__[\"floor\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Zsb29yLmpzP2E0NTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZmxvb3IgYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9yb3VuZGluZ0FsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///78\n"); + +/***/ }), +/* 79 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(88);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n/* harmony import */ var _util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(90);\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_2__[\"defineInstance\"])('isEven', function (n) {\n return Number.isInteger(n) && Object(_util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(n, 2);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzRXZlbi5qcz85ZWVmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUluc3RhbmNlIH0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuaW1wb3J0IGlzTXVsdGlwbGVPZiBmcm9tICcuL3V0aWwvaXNNdWx0aXBsZU9mJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lSW5zdGFuY2UoJ2lzRXZlbicsIGZ1bmN0aW9uKG4pIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgaXNNdWx0aXBsZU9mKG4sIDIpO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///79\n"); + +/***/ }), +/* 80 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar global = __webpack_require__(15);\nvar has = __webpack_require__(42);\nvar cof = __webpack_require__(11);\nvar inheritIfRequired = __webpack_require__(81);\nvar toPrimitive = __webpack_require__(39);\nvar fails = __webpack_require__(37);\nvar gOPN = __webpack_require__(85).f;\nvar gOPD = __webpack_require__(83).f;\nvar dP = __webpack_require__(34).f;\nvar $trim = __webpack_require__(86).trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(54)(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = __webpack_require__(36) ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n __webpack_require__(41)(global, NUMBER, $Number);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanM/YzVmNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciAkTnVtYmVyID0gZ2xvYmFsW05VTUJFUl07XG52YXIgQmFzZSA9ICROdW1iZXI7XG52YXIgcHJvdG8gPSAkTnVtYmVyLnByb3RvdHlwZTtcbi8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xudmFyIEJST0tFTl9DT0YgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSO1xudmFyIFRSSU0gPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKSB7XG4gICAgaXQgPSBUUklNID8gaXQudHJpbSgpIDogJHRyaW0oaXQsIDMpO1xuICAgIHZhciBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZiAoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSkge1xuICAgICAgdGhpcmQgPSBpdC5jaGFyQ29kZUF0KDIpO1xuICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PT0gNDgpIHtcbiAgICAgIHN3aXRjaCAoaXQuY2hhckNvZGVBdCgxKSkge1xuICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wYlswMV0rJC9pXG4gICAgICAgIGNhc2UgNzk6IGNhc2UgMTExOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gK2l0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiBtYXhDb2RlKSByZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZiAoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKSB7XG4gICROdW1iZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24gKCkgeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSh0b051bWJlcihpdCkpLCB0aGF0LCAkTnVtYmVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoQmFzZSwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKSB7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///80\n"); + +/***/ }), +/* 81 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var isObject = __webpack_require__(10);\nvar setPrototypeOf = __webpack_require__(82).set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzPzVkYmMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///81\n"); + +/***/ }), +/* 82 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(10);\nvar anObject = __webpack_require__(18);\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = __webpack_require__(43)(Function.call, __webpack_require__(83).f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanM/OGI5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///82\n"); + +/***/ }), +/* 83 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var pIE = __webpack_require__(84);\nvar createDesc = __webpack_require__(40);\nvar toIObject = __webpack_require__(50);\nvar toPrimitive = __webpack_require__(39);\nvar has = __webpack_require__(42);\nvar IE8_DOM_DEFINE = __webpack_require__(35);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(36) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcz8xMWU5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///83\n"); + +/***/ }), +/* 84 */ +/***/ (function(module, exports) { + +eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzPzUyYTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///84\n"); + +/***/ }), +/* 85 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(57);\nvar hiddenKeys = __webpack_require__(61).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcz85MDkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///85\n"); + +/***/ }), +/* 86 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var $export = __webpack_require__(32);\nvar defined = __webpack_require__(24);\nvar fails = __webpack_require__(37);\nvar spaces = __webpack_require__(87);\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcz9hYTc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///86\n"); + +/***/ }), +/* 87 */ +/***/ (function(module, exports) { + +eval("module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanM/ZmRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///87\n"); + +/***/ }), +/* 88 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(32);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(89) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qcz83Y2RmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IGlzSW50ZWdlcjogcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpIH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///88\n"); + +/***/ }), +/* 89 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(10);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzPzljMTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///89\n"); + +/***/ }), +/* 90 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (n1, n2) {\n return n1 % n2 === 0;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvaXNNdWx0aXBsZU9mLmpzP2Q4NjUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24objEsIG4yKSB7XG4gIHJldHVybiBuMSAlIG4yID09PSAwO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///90\n"); + +/***/ }), +/* 91 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isFinite\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzRmluaXRlLmpzP2Q1MjEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgaXNGaW5pdGUgYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9udW1iZXJBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91\n"); + +/***/ }), +/* 92 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return isNaN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return isFinite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isInteger\", function() { return isInteger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isSafeInteger\", function() { return isSafeInteger; });\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n\n\n\nObject(_namespace__WEBPACK_IMPORTED_MODULE_2__[\"defineInstanceAlias\"])('isNaN isFinite isInteger isSafeInteger', function (name) {\n return function (n, place) {\n return Number[name](n);\n };\n});\nvar isNaN = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isNaN,\n isFinite = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isFinite,\n isInteger = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isInteger,\n isSafeInteger = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isSafeInteger;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvbnVtYmVyQWxpYXNlcy5qcz8zMDAzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTdWdhck51bWJlciwgeyBkZWZpbmVJbnN0YW5jZUFsaWFzIH0gZnJvbSAnLi4vbmFtZXNwYWNlJztcblxuZGVmaW5lSW5zdGFuY2VBbGlhcygnaXNOYU4gaXNGaW5pdGUgaXNJbnRlZ2VyIGlzU2FmZUludGVnZXInLCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihuLCBwbGFjZSkge1xuICAgIHJldHVybiBOdW1iZXJbbmFtZV0obik7XG4gIH07XG59KTtcblxuZXhwb3J0IGNvbnN0IHsgaXNOYU4sIGlzRmluaXRlLCBpc0ludGVnZXIsIGlzU2FmZUludGVnZXIgfSA9IFN1Z2FyTnVtYmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///92\n"); + +/***/ }), +/* 93 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isInteger\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzSW50ZWdlci5qcz8yM2RiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGlzSW50ZWdlciBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL251bWJlckFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///93\n"); + +/***/ }), +/* 94 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _util_isMultipleOf__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(90);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineInstance\"])('isMultipleOf', function (n1, n2) {\n return Object(_util_isMultipleOf__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(n1, n2);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzTXVsdGlwbGVPZi5qcz8wYzkyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUluc3RhbmNlIH0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuaW1wb3J0IGlzTXVsdGlwbGVPZiBmcm9tICcuL3V0aWwvaXNNdWx0aXBsZU9mJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lSW5zdGFuY2UoJ2lzTXVsdGlwbGVPZicsIGZ1bmN0aW9uKG4xLCBuMikge1xuICByZXR1cm4gaXNNdWx0aXBsZU9mKG4xLCBuMik7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///94\n"); + +/***/ }), +/* 95 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isNaN\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzTmFOLmpzPzRhOTkiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgaXNOYU4gYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9udW1iZXJBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///95\n"); + +/***/ }), +/* 96 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(88);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n/* harmony import */ var _util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(90);\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_2__[\"defineInstance\"])('isOdd', function (n) {\n return Number.isInteger(n) && !Object(_util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(n, 2);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzT2RkLmpzPzFiMzEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lSW5zdGFuY2UgfSBmcm9tICcuL25hbWVzcGFjZSc7XG5pbXBvcnQgaXNNdWx0aXBsZU9mIGZyb20gJy4vdXRpbC9pc011bHRpcGxlT2YnO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVJbnN0YW5jZSgnaXNPZGQnLCBmdW5jdGlvbihuKSB7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmICFpc011bHRpcGxlT2YobiwgMik7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///96\n"); + +/***/ }), +/* 97 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isSafeInteger\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzU2FmZUludGVnZXIuanM/OGE0OCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBpc1NhZmVJbnRlZ2VyIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbnVtYmVyQWxpYXNlcyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///97\n"); + +/***/ }), +/* 98 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineInstance\"])('log', function (n, base) {\n return Math.log(n) / (base ? Math.log(base) : 1);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2xvZy5qcz8xYjA3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUluc3RhbmNlIH0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVJbnN0YW5jZSgnbG9nJywgZnVuY3Rpb24obiwgYmFzZSkge1xuICByZXR1cm4gTWF0aC5sb2cobikgLyAoYmFzZSA/IE1hdGgubG9nKGJhc2UpIDogMSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///98\n"); + +/***/ }), +/* 99 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"pow\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3Bvdy5qcz9iMjM3Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHBvdyBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///99\n"); + +/***/ }), +/* 100 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _util_trunc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(101);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineStatic\"])('random', function (n1, n2) {\n if (arguments.length == 0) {\n n1 = 0;\n n2 = 1;\n } else if (arguments.length == 1) {\n n2 = n1;\n n1 = 0;\n }\n\n var min = Math.min(n1, n2);\n var max = Math.max(n1, n2) + 1;\n return Math.floor(Math.random() * (max - min) + min);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9yYW5kb20uanM/MzgxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVTdGF0aWMgfSBmcm9tICcuL25hbWVzcGFjZSc7XG5pbXBvcnQgdHJ1bmMgZnJvbSAnLi91dGlsL3RydW5jJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lU3RhdGljKCdyYW5kb20nLCBmdW5jdGlvbihuMSwgbjIpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgIG4xID0gMDtcbiAgICBuMiA9IDE7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgbjIgPSBuMTtcbiAgICBuMSA9IDA7XG4gIH1cbiAgY29uc3QgbWluID0gTWF0aC5taW4objEsIG4yKTtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgobjEsIG4yKSArIDE7XG4gIHJldHVybiBNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///100\n"); + +/***/ }), +/* 101 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (n) {\n return n | 0;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci91dGlsL3RydW5jLmpzPzU2ZmUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obikge1xuICByZXR1cm4gbiB8IDA7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///101\n"); + +/***/ }), +/* 102 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__[\"round\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9yb3VuZC5qcz8zMjlmIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHJvdW5kIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvcm91bmRpbmdBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///102\n"); + +/***/ }), +/* 103 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"sin\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9zaW4uanM/ZDZkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBzaW4gYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9tYXRoQWxpYXNlcyc7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///103\n"); + +/***/ }), +/* 104 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"sqrt\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9zcXJ0LmpzPzc1OTMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgc3FydCBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///104\n"); + +/***/ }), +/* 105 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"tan\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci90YW4uanM/ODFlYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyB0YW4gYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9tYXRoQWxpYXNlcyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///105\n"); + +/***/ }), +/* 106 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_string_from_code_point__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);\n/* harmony import */ var core_js_modules_es6_string_from_code_point__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_string_from_code_point__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_1__[\"defineInstance\"])('toChar', function (n) {\n // Note that fromCharCode was historically 2x faster than\n // fromCodePoint, however this no longer seems to be the case.\n // https://jsperf.com/fromcharcode-vs-fromcodepoint/6\n return String.fromCodePoint(n);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci90b0NoYXIuanM/ZDNhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVJbnN0YW5jZSB9IGZyb20gJy4vbmFtZXNwYWNlJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lSW5zdGFuY2UoJ3RvQ2hhcicsIGZ1bmN0aW9uKG4pIHtcbiAgLy8gTm90ZSB0aGF0IGZyb21DaGFyQ29kZSB3YXMgaGlzdG9yaWNhbGx5IDJ4IGZhc3RlciB0aGFuXG4gIC8vIGZyb21Db2RlUG9pbnQsIGhvd2V2ZXIgdGhpcyBubyBsb25nZXIgc2VlbXMgdG8gYmUgdGhlIGNhc2UuXG4gIC8vIGh0dHBzOi8vanNwZXJmLmNvbS9mcm9tY2hhcmNvZGUtdnMtZnJvbWNvZGVwb2ludC82XG4gIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChuKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///106\n"); + +/***/ }), +/* 107 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("var $export = __webpack_require__(32);\nvar toAbsoluteIndex = __webpack_require__(59);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcz81Njk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyICRmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCEhJGZyb21Db2RlUG9pbnQgJiYgJGZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDEpLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuMiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKVxuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChhTGVuID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///107\n"); + +/***/ }), +/* 108 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _util_toOrdinal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(109);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineInstance\"])('toOrdinal', _util_toOrdinal__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci90b09yZGluYWwuanM/NjVlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVJbnN0YW5jZSB9IGZyb20gJy4vbmFtZXNwYWNlJztcbmltcG9ydCB0b09yZGluYWwgZnJvbSAnLi4vdXRpbC90b09yZGluYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVJbnN0YW5jZSgndG9PcmRpbmFsJywgdG9PcmRpbmFsKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///108\n"); + +/***/ }), +/* 109 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\nfunction getSuffix(n) {\n if (n >= 11 && n <= 13) {\n return 'th';\n } else {\n switch (Math.abs(n) % 10) {\n case 1:\n return 'st';\n\n case 2:\n return 'nd';\n\n case 3:\n return 'rd';\n\n default:\n return 'th';\n }\n }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (n) {\n if (!n || !isFinite(n)) {\n throw new RangeError('Invalid number');\n }\n\n return n + getSuffix(n);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWwvdG9PcmRpbmFsLmpzP2Y0OTkiXSwic291cmNlc0NvbnRlbnQiOlsiXG5mdW5jdGlvbiBnZXRTdWZmaXgobikge1xuICBpZiAobiA+PSAxMSAmJiBuIDw9IDEzKSB7XG4gICAgcmV0dXJuICd0aCc7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoKE1hdGguYWJzKG4pICUgMTApIHtcbiAgICAgIGNhc2UgMTogIHJldHVybiAnc3QnO1xuICAgICAgY2FzZSAyOiAgcmV0dXJuICduZCc7XG4gICAgICBjYXNlIDM6ICByZXR1cm4gJ3JkJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAndGgnO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuKSB7XG4gIGlmICghbiB8fCAhaXNGaW5pdGUobikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBudW1iZXInKTtcbiAgfVxuICByZXR1cm4gbiArIGdldFN1ZmZpeChuKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n"); + +/***/ }), +/* 110 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_number_is_safe_integer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(111);\n/* harmony import */ var core_js_modules_es6_number_is_safe_integer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_safe_integer__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_number_is_finite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(112);\n/* harmony import */ var core_js_modules_es6_number_is_finite__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_finite__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_number_is_nan__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(113);\n/* harmony import */ var core_js_modules_es6_number_is_nan__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_nan__WEBPACK_IMPORTED_MODULE_2__);\n// TODO: These are better included using webpack.config.js\n// But that doesn't seem to work with Babel at the moment.\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BvbHlmaWxscy5qcz8wNjc0Il0sInNvdXJjZXNDb250ZW50IjpbIlxuLy8gVE9ETzogVGhlc2UgYXJlIGJldHRlciBpbmNsdWRlZCB1c2luZyB3ZWJwYWNrLmNvbmZpZy5qc1xuLy8gQnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aCBCYWJlbCBhdCB0aGUgbW9tZW50LlxuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXInXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZSdcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJ1xuIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///110\n"); + +/***/ }), +/* 111 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(32);\nvar isInteger = __webpack_require__(89);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcz9iMWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxZmZmZmZmZmZmZmZmZjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///111\n"); + +/***/ }), +/* 112 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(32);\nvar _isFinite = __webpack_require__(15).isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcz9mY2EwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4yIE51bWJlci5pc0Zpbml0ZShudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///112\n"); + +/***/ }), +/* 113 */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(32);\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcz9lZTFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///113\n"); + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/dist/sugar.min.js b/dist/sugar.min.js deleted file mode 100644 index 4267ec178..000000000 --- a/dist/sugar.min.js +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Sugar v2.0.6 - * - * Freely distributable and licensed under the MIT-style license. - * Copyright (c) Andrew Plummer - * https://sugarjs.com/ - * - * ---------------------------- */ -(function(){'use strict';(function(){function uc(a,b){return new L(a,b)}function q(a,b){for(var c in a)if(x(a,c)&&!1===b.call(a,a[c],c,a))break}function vc(a){return a&&a.Object===Object?a:null}function wc(a){function b(a,b,c){A(d,a,function(a,e,f){a=Lb(a,e,f);ee(d,a.methods,b,c,a.w);return d})}var c="Object"===a,d=xc(a,!0);b("defineStatic",1);b("defineInstance",2);b("defineInstanceAndStatic",3);b("defineStaticWithArguments",1,!0);b("defineInstanceWithArguments",2,!0);A(d,"defineStaticPolyfill",function(b,c,g){b=Lb(b,c,g); -kb(Da[a],b.methods,!0,b.w);return d});A(d,"defineInstancePolyfill",function(b,c,g){b=Lb(b,c,g);kb(Da[a].prototype,b.methods,!0,b.w);q(b.methods,function(a,b){lb(d,b,a)});return d});A(d,"alias",function(a,b){var c=d;b="string"===typeof b?d[b]:b;c[a]=b;b.instance&&lb(c,a,b.instance,!0);return d});A(d,"extend",function(b){function e(a,c){if(a=b[a])for(var d=0,e;e=a[d];d++)if(e===c)return!0;return!1}function g(a,c){return b[a]&&!e(a,c)}function h(a,c,d){if(!c[a]||!d)return!1;for(a=0;aa||!F(a)||!isFinite(a))throw new RangeError("Invalid number");return N(a)}function m(a){return void 0!==a}function v(a){return void 0===a}function Ua(a){var b="_sugar_"+a;return function(a,d){return 1b&&(b=+b+h.length);if(k||b||1===t)if(q=c?b in Object(h):x(h,b),!e||na&&!f||q){if(d){if(na||!q)return q}else if(l&&na){if(oa(h))throw new TypeError("Property cannot be written"); -h[b]=g}h=q?h[b]:void 0}else h=h[b]=mb||f&&na?[]:{}}}return h}}function ue(a,b,c,d){var e,f;if(e=b.match(ve)){b=m(d);a=(f=e[1])?Fa(a,f,c,!1,b?!0:!1,!0):a;if(!C(a))throw new TypeError("Array required");var g=e[4];f=e[2]?+e[2]:0;e=e[3]?+e[3]:a.length;e=-1===e?a.length:e+1;if(b)for(b=f;b>>0==f&&4294967295!=f&&(c||(d?f<=b:f>=b))&&e.push(+f);e.sort(function(a,c){var d=a>b;return d!==c>b?d?-1:1:a-c});return e}function Lc(a,b,c,d){var e=a.length;if(!C(b))return Mc(a,b,e,c,d);var f=Array(b.length);y(b,function(b,h){f[h]=Mc(a,b,e,c,d)});return f}function Tb(a,b,c){a&&c&&(a%= -b);0>a&&(a=b+a);return a}function Mc(a,b,c,d,e){b=Tb(b,c,d);return e?a.charAt(b):a[b]}function pa(a,b,c,d){return b?b.apply?b.apply(c,d):C(b)?T(b,function(b){return pa(a,b,c,d)}):H(a[b])?a[b].call(a):rb(a,b,!0):a}function y(a,b){for(var c=0,d=a.length;cb&&(d=1/d);return c(a*d)/d}function Ha(a,b,c,d,e){d=X(a).toString(d||10);d=yb(e||"0",b-d.replace(/\.\d+/,"").length)+d;if(c||0>a)d=(0>a?"-":"+")+d;return d}function Nc(a){if(11<=a&&13>=a)return"th";switch(a%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}}function Ub(a,b){var c;a=a.replace(Oc, -function(a){a=u(za,a);"."===a&&(c=!0);return a});return c?parseFloat(a):parseInt(a,b||10)}function yb(a,b){var c="";for(a=a.toString();0>=1)a+=a;return c}function Ya(a){return a.charAt(0).toUpperCase()+a.slice(1)}function Pc(a,b,c){function d(d,e){var h=e[2],l=e[3],k=e[5];if(e[4]&&b){var t=k;var r=b}else if(h)t=h,r=a;else var m=l&&b?l:e[1]||e[0];if(r){g(c,h,k);var q=function(a,b){return r(a,t,b)}}d.push(q||f(m))}function e(a,b,c,d){if(d>c){var e=b.slice(c,d);h(e,"{");h(e,"}"); -a.push(function(){return e})}}function f(a){return function(){return a}}function g(a,b,c){if(a&&!a(b,c))throw new TypeError("Invalid token "+(b||c)+" in format string");}function h(a,b){if(-1!==a.indexOf(b))throw new TypeError("Unmatched "+b+" in format string");}var l=Ae,k=Be(function(a){var b=[],c=0,f;for(l.lastIndex=0;f=l.exec(a);)e(b,a,c,f.index),d(b,f),c=l.lastIndex;e(b,a,c,a.length);return b});return function(a,b,c){a=k(a);for(var d="",e=0;e=c&&!1!==a(ka[b],b);b--);}function Tc(a,b){for(;0<=a&&!1!==b(ka[a],a);)a=Za(a)}function Za(a){return 6===a?4:5===a?3:a-1}function zb(a,b,c,d){Yb(function(c,d){var e=c.name;var f=u(a,Zb(a, -e));m(f)&&b(e,f,c,d);e=void 0;!1!==e&&4===d&&(e=u(a,Zb(a,"weekday")),m(e)&&b("weekday",e,c,d),e=void 0);return e},c,d)}function Ge(a,b){zb(a,b,7,4)}function Ba(a,b,c,d){var e={};e[b]=c;return sa(a,e,d,1)}function Uc(a,b,c){b=Sc(b,!0);return sa(a,b[0],b[1],c)}function $a(a,b){ra(a,7*La((G(a)-b)/7)+b);return a}function Vc(a,b){--b;ra(a,7*la((G(a)-b)/7)+b);return a}function ab(a,b,c){5===b&&$a(a,D.get(c).s());return aa(a,Za(b))}function Ab(a,b,c,d){5===b&&Vc(a,D.get(c).s());return aa(a,Za(b),d,!0)}function aa(a, -b,c,d){Tc(b,function(b,f){var e=d?b.end:b.start;H(e)&&(e=e(a));Ka(a,b.method,e);return!m(c)||f>c});return a}function Zb(a,b){return Qb(a,b)||Qb(a,b+"s")||"day"===b&&Qb(a,"date")}function He(a){var b={},c;b[a]=1;zb(b,function(a,b,f,g){c=g;return!1});return c}function Bb(a,b,c){var d=b>a;if(!d){var e=b;b=a;a=e}e=b-a;1b)break;e+=1}return d?-e:e}function Wc(a,b){if(F(b)){var c=qa(a),d=G(a);aa(c,6);ja(c,4);$a(c,1); -ja(c,Z(c)+7*(b-1));b=ia(c);Ka(a,"FullYear",b);b=U(c);Ka(a,"Month",b);ja(a,Z(c));ra(a,d||7)}return a.getTime()}function Ma(a,b,c,d){var e,f=0;v(c)&&(c=1);v(d)&&(d=4);var g=e=Vc(qa(a),c),h=c,l=d;aa(g,6);ja(g,l);$a(g,h);b&&ab&&(b=new Date(b.getTime()-10)));return $c(a-b,function(c){return X(Bb(a,b,c))})}function Zc(a,b,c){Qc(a);b=ad[b]||b||"{long}";return Cb(b,a,c)}function $b(a, -b){a=J(a,"Hours");return D.get(b).ampm[N(a/12)]||""}function bd(a,b,c){var d;if(!isNaN(a.getTime())){if(B(b))switch(b=b.trim().toLowerCase(),!0){case "future"===b:return a.getTime()>Aa().getTime();case "past"===b:return a.getTime()G(a);case "weekend"===b:return 0===G(a)||6===G(a);case m(d=Ca.weekdayMap[b]):return G(a)===d;case m(d=Ca.monthMap[b]):return U(a)=== -d}return cd(a,b,c)}}function cd(a,b,c,d,e){var f=0,g=0;O(a)&&(e=e||{},e.fromUTC=!0,e.setUTC=!0);b=bc(null,b,e,!0);if(0=h-f&&c<=k+g}function ac(a,b){var c=Aa();b&&ja(c,Z(c)+b);return ia(a)===ia(c)&&U(a)===U(c)&&Z(a)===Z(c)}function V(a,b,c){return bc(null,a,b,c).date}function bc(a,b,c,d){function e(a,b){var c=A||{};y(b.to,function(b,d){d=a[d+1];if(d){a:if("utc"===b)var e=1;else{if("year"===b){var f=d.match(Ke);if(f){e=q;f=+f[1];f+=50>f?2E3:1900;if(e){var g=f-ia(z);g/X(g)!==e&&(f+=100*e)}e=f;break a}}e= -void 0}v(e)&&(e=p.V(d,b));c[b]=e}});return c}function f(a,b){O(a)&&!m(ya)&&(ya=!0);O(a)&&!m(x)&&(x=!0);b&&(a=new Date(a.getTime()));return a}function g(){y(C,function(a){a.call()})}function h(b){b=b.toLowerCase();p=D.get(w);for(var c=0,d,f;d=p.compiledFormats[c];c++)if(f=b.match(d.reg)){p.K(d,c);n=e(f,d);if(m(n.timestamp)){z.setTime(n.timestamp);break}m(n.ampm)&&(c=n.ampm,1===c&&12>n.hour?n.hour+=12:0===c&&12===n.hour&&(n.hour=0));if(n.utc||m(n.tzHour))if(c=n.tzHour,d=n.tzMinute,O(z,!0),0>c&&(d*= --1),c=60*c+(d||0))n.minute=(n.minute||0)-c;m(n.shift)&&v(n.unit)&&(m(n.month)?n.unit=7:m(n.weekday)&&(n.unit=5));m(n.num)&&v(n.unit)&&(m(n.weekday)?t(n.num):m(n.month)&&(n.date=n.num));n.midday&&l(n.midday);m(n.day)&&(aa(z,3),v(n.unit)&&(n.unit=4,n.num=n.day,delete n.day));m(n.unit)&&(d=n.unit,c=m(n.num)?n.num:m(n.edge)&&v(n.shift)?0:1,m(n.weekday)&&(6===d?(t(c),c=1):(sa(z,{weekday:n.weekday},!0),delete n.weekday)),n.half&&(c*=n.half),m(n.shift)?c*=n.shift:n.sign&&(c*=n.sign),m(n.day)&&(c+=n.day, -delete n.day),r(d),n[Ca.units[d]]=c,Ea=!0);n.edge&&k(n.edge,n);break}n?Ea?sa(z,n,!1,1):sa(z,n,!0,0,q,na,a):(z=new Date(b),ya&&!isNaN(z.getTime())&&z.setTime(z.getTime()+6E4*z.getTimezoneOffset()));g();return z}function l(a){n.hour=a%24;23a)ab(z,c,w);else if(0=a)return z.setTime(NaN),!1;fb.specificity||(b.specificity=l);if(r=g%1){if(l){var p=ka[Za(l)];r=Xa(h.f/p.f*r);b[p.name]=r}g=N(g)}if("weekday"===c)d||ra(a,g,f);else if(c=6===l&&28g&&(g=g%12+12),h=g%12!==U(a);h&&ja(a,0)}}var k;if(F(b)&&d)b={millisecond:b};else if(F(b))return a.setTime(b),a;zb(b,l);c&&b.specificity&&aa(a,Za(b.specificity));a:{if(k&&!(7=(g||Aa());break a;case 1:c=a<=(g||Aa());break a}c=void 0}c&&h();return a}function Db(a){var b=a.join("");return a&&a.length?b.length===a.length?"["+b+"]":T(a, -Ja).join("|"):""}function W(a,b){1=h[1]&&a<=(h[2]||h[1])})),a=Db(b);if(!a)return"";e?a=W(a):(g.push(p),a="("+a+")");m&&(a=Le(p,a,m));d&&(a+="?");return a}function c(a){a=a.replace(/ /g," ?");return a=a.replace(/\{([^,]+?)\}/g,function(a,c){a=c.split("|");return 1]+";return nd(a.toString(),RegExp("<(\\/)?("+b+")(\\s+[^<>]*?)?\\s*(\\/)?>","gi"),d,c)}function nd(a,b,c,d,e){function f(f,g,k,t,n){var r=a.slice(l, -f),p="",m="";B(d)?m=d:d&&(m=d.call(e,g,r,k,e)||"");c?p=m:r=m;r&&(r=nd(r,b,c,d,e));h+=p+r+(n?"":p);l=f+(t||0)}var g,h="",l=0,k=0;e=e||a;for(b=RegExp(b.source,"gi");g=b.exec(a);){var t=g[2],r=(g[3]||"").slice(1),p=!!g[1],m=!!g[4],q=g[0].length,v=-1!==Sb(Xe,t.toLowerCase());m=!p&&!m&&!v;var w=t===u;u||(h+=a.slice(l,g.index),l=g.index);if(m)if(u)w&&k++;else{var u=t;var x=r;k++;l+=q}else p&&w?(k--,0===k&&(f(g.index,u,x,q,v),x=u=null)):u||f(g.index,t,r,q,v)}u&&f(a.length,u,x);return h+=a.slice(l)}function od(a, -b,c){B(b)&&(b=a.indexOf(b),-1===b&&(b=c?a.length:0));return b}function pd(a,b){var c;a&&a.constructor&&C(a.constructor.prototype)?c=b?Na(a):a:I(a)||B(a)?c=Array.from(a):m(a)&&(c=[a]);return c||[]}function Na(a){var b=Array(a.length);y(a,function(a,d){b[d]=a});return b}function Ye(a){var b=[];b.push(a);return b}function Ze(a,b){var c=Na(a),d=c.length;a=C(b)?b:[b];c.length+=a.length;y(a,function(a,b){c[d+b]=a});return c}function qd(a,b,c){c=+c;isNaN(c)&&(c=a.length);c=[c,0];m(b)&&(c=c.concat(b));a.splice.apply(a, -c);return a}function rd(a,b){var c=[],d={},e=[];y(a,function(f,g){g=b?pa(f,b,a,[f,g,a]):f;g=Ga(g,e);x(d,g)||(c.push(f),d[g]=!0)});return c}function sd(a,b,c){var d=[];b=b||Infinity;c=c||0;y(a,function(a){C(a)&&cb.length)return 1;for(c=0;cb?1:0}function vd(a,b,c){c&&(a=a.toLowerCase());b&&(a=a.replace(b,""));return a}function wd(a,b,c){a=a.charAt(b);return u(c,a)||a}function dc(a, -b,c,d,e){if(C(a)){for(var f,g,h=[],l=0,k=a.length;lh||!d&&b>>0!=f||4294967295==f)return;f=+f}e=pa(e,b,a,[e,f,a]);c(e,f)})}function Id(a,b){if(H(a))return a;if(a)return function(c,d,e){return pa(c,a,b,[c,d,e])}}function ta(a){if(H(a))return a;var b=fa(a);return function(a,d,e){return b(a, -d,e)}}function Qa(a,b){var c=Array.prototype[a];return function(a,e,f,g){var d=Array(2);Gc(0h?-1:1,c=e[h+g];"|"===c&&(c="");-9>f&&(b=X(f)-9);d=d?xb(2,10*h):xb(10,3*h);return Jd(Wa(a/d,b|| -0))+c}function Jd(a,b){var c="";var d=Kd("decimal");var e=Kd("thousands");var f=F(b)?Wa(a,b||0).toFixed(E(b,0)):a.toString();f=f.replace(/^-/,"");var g=f.split(".");var h=g[0];g=g[1];if(/e/.test(f))c=f;else for(f=h.length;0a?"-":"")+c}function lc(a){return function(b,c){return c?Wa(b,c,a):a(b)}}function Ra(a,b,c,d,e){b=wa(b||0);Hb(a)||Hb(a,[]);mc(a,!1);Hb(a).push(setTimeout(function(){mc(a)||c.apply(d, -e||[])},b))}function Ld(a){var b=Hb(a),c;if(C(b))for(;c=b.shift();)clearTimeout(c);mc(a,!0);return a}function Md(a,b,c,d){function e(){if(f.lengthc;)h=Function.prototype.apply.apply(a,f.shift()),b--;Ra(e,l,function(){g=!1;t()})}};return e}function sf(){for(var a= -arguments,b=a.length,c=Array(b);b--;)c[b]=a[b];return c}function tf(a,b,c){var d={},e=[],f=0;return function(){var g=b.apply(this,arguments);g=Ga(g,e);if(x(d,g))return u(d,g);f===c&&(d={},e=[],f=0);f++;return d[g]=a.apply(this,arguments)}}function L(a,b){this.start=nc(a);this.end=nc(b)}function Nd(a){return B(a)?a.charCodeAt(0):a}function Od(a){return null==a?a:Q(a)?a.getTime():a.valueOf()}function Pd(a){a=a.toString().split(".");return a[1]?a[1].length:0}function nc(a){return Q(a)?new Date(a.getTime()): -Od(a)}function Qd(a){var b=Od(a);return(!!b||0===b)&&-Infinity!==a&&Infinity!==a}function Ib(a){return Qd(a.start)&&Qd(a.end)&&typeof a.start===typeof a.end}function Jb(a,b,c,d){var e=a.start,f=a.end,g=f=f:h<=f;)c||k.push(h), -d&&d(h,l,a),h=r(),l++;return c?l-1:k}function Rd(a){if(F(a))return[a,"Milliseconds"];var b=a.match(uf);a=+b[1]||1;b=Ya(b[2].toLowerCase());b.match(/hour|minute|second/i)?b+="s":"Year"===b?b="FullYear":"Week"===b?(b="Date",a*=7):"Day"===b&&(b="Date");return[a,b]}function Sd(a,b,c){var d=Td[c];d?d=new Date(a.getTime()+b*d):(d=new Date(a),Ka(d,c,J(a,c)+b));return d}function oc(a,b){var c=a.start,d=a.end;a=dd?c:d;return nc(bc?c:b)}function Sa(a){return Q(a)?a:null==a?new Date:P.create? -P.create(a):new Date(a)}var w,Da=vc("undefined"!==typeof global&&global)||vc("undefined"!==typeof window&&window),Mb=!1,nb={},yc={},Nb=Object.defineProperty&&Object.defineProperties?Object.defineProperty:le,Bc=xc("Chainable"),Cc=Object.getOwnPropertyNames,Dc=Object.prototype.toString,me=Object.prototype.hasOwnProperty;(function(){w=Da.Sugar;if(!w){w=function(a){q(w,function(b,c){x(nb,c)&&b.extend(a)});return w};if("undefined"!==typeof module&&module.M)module.M=w;else try{Da.Sugar=w}catch(a){}q("Object Number String Array Date RegExp Function".split(" "), -function(a){wc(a)});A(w,"VERSION","2.0.6");A(w,"extend",w);A(w,"toString",ge);A(w,"createNamespace",wc);A(w,"util",{hasOwn:x,getOwn:u,setProperty:A,classToString:da,defineProperty:Nb,forEachProperty:q,mapNativeToChainable:zc})}})();var we=!("0"in Object("a")),ve=/^(.*?)\[([-\d]*)\.\.([-\d]*)\](.*)$/,Ae=/([{}])\1|{([^}]*)}|(%)%|(%(\w*))/g,gb=w.Object,R=w.Array,P=w.Date,hb=w.String,ca=w.Number,Ud=w.Function,Vd=w.RegExp,sb,Pa,F,B,Q,ha,H,C,tb,ub,vb,Wd=va("alias"),ua=va("defineStatic"),M=va("defineInstance"), -Xd=va("defineStaticPolyfill"),pc=va("defineInstancePolyfill"),Ob=va("defineInstanceAndStatic"),ib=va("defineInstanceWithArguments"),N=Math.trunc||function(a){return 0!==a&&isFinite(a)?0>a?la(a):La(a):a},Oc,za,hd,X=Math.abs,xb=Math.pow,ba=Math.min,E=Math.max,la=Math.ceil,La=Math.floor,Xa=Math.round,ma=String.fromCharCode,Y={},O=Ua("utc"),De=1E3;(function(){function a(a){f["[object "+a+"]"]=!0}function b(a,b){return b&&ob(new b,"Object")?c(b):d(a)}function c(a){var b=String(a);return function(a){return String(a.constructor)=== -b}}function d(a){return function(b,c){return ob(b,a,c)}}function e(a){var b=a.toLowerCase();return function(c){var d=typeof c;return d===b||"object"===d&&ob(c,a)}}var f={};(function(){var c="Boolean Number String Date RegExp Function Array Error Set Map".split(" ");Pa=e(c[0]);F=e(c[1]);B=e(c[2]);Q=b(c[3]);ha=b(c[4]);H=b(c[5]);C=Array.isArray||b(c[6]);vb=b(c[7]);tb=b(c[8],"undefined"!==typeof Set&&Set);ub=b(c[9],"undefined"!==typeof Map&&Map);a("Arguments");a(c[0]);a(c[1]);a(c[2]);a(c[3]);a(c[4]); -a(c[6])})();(function(){y("Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64".split(" "),function(b){a(b+"Array")})})();sb=function(a,b){return f[b]||qb(a,b)}})();(function(){var a="";za={};for(var b=0,c;9>=b;b++)c=ma(b+65296),a+=c,za[c]=ma(b+48);za[","]="";za["\uff0e"]=".";za["."]=".";Oc=RegExp("["+(a+"\uff0e,.")+"]","g");hd=a})();pc(hb,{includes:function(a){var b=arguments[1],c=Vb(this);a=Wb(a);return-1!==c.indexOf(a,b)},startsWith:function(a){var b=arguments[1];var c=Vb(this);a= -Wb(a);var d=c.length;b=ba(E(+b||0,0),d);var e=a.length;return e+b>d?!1:c.substr(b,e)===a?!0:!1},endsWith:function(a){var b=arguments[1],c;var d=Vb(this);a=Wb(a);var e=c=d.length;m(b)&&(e=+b||0);e=ba(E(e,0),c);b=a.length;e-=b;return 0>e?!1:d.substr(e,b)===a?!0:!1},repeat:function(a){a=wa(a);return yb(this,a)}});Xd(ca,{isNaN:function(a){return null!=a&&a!==a}});Xd(R,{from:function(a){var b=arguments[1],c=arguments[2];m(b)&&pb(b);if(null==a)throw new TypeError("Object required.");a=Va(a);var d=N(E(0, -a.length||0));if(d>>>0!=d||4294967295==d)throw new RangeError("Invalid array length");if(H(this)){var e=new this(d);e.length=d}else e=Array(d);for(var f=0;fb&&(b=E(0,b+c));bV(b).getTime()-(c||0)},isBefore:function(a,b,c){return a.getTime()=a},isLeapYear:function(a){a=ia(a);return 0===a%4&&0!==a%100||0===a%400},daysInMonth:function(a){return Rc(a)},format:function(a,b,c){return Zc(a,b,c)},relative:function(a,b,c){return Yc(a,null,b,c)},relativeTo:function(a,b,c){return Yc(a,V(b),c)},is:function(a,b,c){return bd(a,b,c)},reset:function(a,b,c){b=b?He(b):4;ab(a,b,c);return a},clone:function(a){return qa(a)},iso:function(a){return a.toISOString()},getWeekday:function(a){return G(a)}, -getUTCWeekday:function(a){return a.getUTCDay()}});M(ca,{duration:function(a,b){return D.get(b).N(a)}});var qc={code:"en",plural:!0,timeMarkers:"at",ampm:"AM|A.M.|a,PM|P.M.|p",units:"millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s",months:"Jan:uary|,Feb:ruary|,Mar:ch|,Apr:il|,May,Jun:e|,Jul:y|,Aug:ust|,Sep:tember|t|,Oct:ober|,Nov:ember|,Dec:ember|",weekdays:"Sun:day|,Mon:day|,Tue:sday|,Wed:nesday|,Thu:rsday|,Fri:day|,Sat:urday|+weekend",numerals:"zero,one|first,two|second,three|third,four:|th,five|fifth,six:|th,seven:|th,eight:|h,nin:e|th,ten:|th", -articles:"a,an,the",tokens:"the,st|nd|rd|th,of|in,a|an,on",time:"{H}:{mm}",past:"{num} {unit} {sign}",future:"{num} {unit} {sign}",duration:"{num} {unit}",modifiers:[{name:"half",src:"half",value:.5},{name:"midday",src:"noon",value:12},{name:"midday",src:"midnight",value:24},{name:"day",src:"yesterday",value:-1},{name:"day",src:"today|tonight",value:0},{name:"day",src:"tomorrow",value:1},{name:"sign",src:"ago|before",value:-1},{name:"sign",src:"from now|after|from|in|later",value:1},{name:"edge", -src:"first day|first|beginning",value:-2},{name:"edge",src:"last day",value:1},{name:"edge",src:"end|last",value:2},{name:"shift",src:"last",value:-1},{name:"shift",src:"the|this",value:0},{name:"shift",src:"next",value:1}],parse:"(?:just)? now;{shift} {unit:5-7};{months?} {year};{midday} {4?} {day|weekday};{months},?[-.\\/\\s]?{year?};{edge} of (?:day)? {day|weekday};{0} {num}{1?} {weekday} {2} {months},? {year?};{shift?} {day?} {weekday?} (?:at)? {midday};{sign?} {3?} {half} {3?} {unit:3-4|unit:7} {sign?};{0?} {edge} {weekday?} {2} {shift?} {unit:4-7?} {months?},? {year?}".split(";"), -timeParse:"{day|weekday};{shift} {unit:5?} {weekday};{0?} {date}{1?} {2?} {months?};{weekday} {2?} {shift} {unit:5};{0?} {num} {2?} {months}\\.?,? {year?};{num?} {unit:4-5} {sign} {day|weekday};{0|months} {date?}{1?} of {shift} {unit:6-7};{0?} {num}{1?} {weekday} of {shift} {unit:6};{year?}[-.\\/\\s]?{months}[-.\\/\\s]{date};{date}[-.\\/\\s]{months}(?:[-.\\/\\s]{year|yy})?;{weekday?}\\.?,? {months}\\.?,? {date}{1?},? {year?};{weekday?}\\.?,? {date} {months} {year}".split(";"),timeFrontParse:["{sign} {num} {unit}", -"{num} {unit} {sign}","{4?} {day|weekday}"]},Yd=S(S({},qc),{mdy:!0,firstDayOfWeek:0,firstDayOfWeekYear:1,"short":"{MM}/{dd}/{yyyy}",medium:"{Month} {d}, {yyyy}","long":"{Month} {d}, {yyyy} {time}",full:"{Weekday}, {Month} {d}, {yyyy} {time}",stamp:"{Dow} {Mon} {d} {yyyy} {time}",time:"{h}:{mm} {TT}"}),Zd=S(S({},qc),{"short":"{dd}/{MM}/{yyyy}",medium:"{d} {Month} {yyyy}","long":"{d} {Month} {yyyy} {H}:{mm}",full:"{Weekday}, {d} {Month}, {yyyy} {time}",stamp:"{Dow} {d} {Mon} {yyyy} {time}"}),xf=S(S({}, -qc),{"short":"{yyyy}-{MM}-{dd}",medium:"{d} {Month}, {yyyy}","long":"{d} {Month}, {yyyy} {H}:{mm}",full:"{Weekday}, {d} {Month}, {yyyy} {time}",stamp:"{Dow} {d} {Mon} {yyyy} {time}"}),$d={"en-US":Yd,"en-GB":Zd,"en-AU":Zd,"en-CA":xf};(function(){function a(a){this.o={};this.add(a)}a.prototype={get:function(a,c){var b=this.o[a];!b&&$d[a]?b=this.add(a,$d[a]):!b&&a&&(b=this.o[a.slice(0,2)]);return b||!1===c?b:this.current},getAll:function(){return this.o},set:function(a){var b=this.get(a,!1);if(!b)throw new TypeError("Invalid Locale: "+ -a);return this.current=b},add:function(a,c){c?c.code=a:(c=a,a=c.code);c=c.compiledFormats?c:fd(c);this.o[a]=c;this.current||(this.current=c);return c},remove:function(a){this.current.code===a&&(this.current=this.get("en"));return delete this.o[a]}};Ca=fd(Yd);D=new a(Ca)})();(function(){function a(a,b,c){b&&y(b.split(" "),function(b){a[b]=c})}function b(a){return function(b,c){return a(b,c).toLowerCase()}}function c(a){return function(b,c){b=a(b,c);return b+D.get(c).O(b)}}function d(a,b){return function(c, -d){return Ha(a(c,d),b)}}function e(a){return function(b,c){return a(b,c)%100}}function f(a){return function(b,c){return Cb(a,b,c)}}function g(c,d){function e(a,b){return c.get(a,b,d)}a(K,c.b+d,e);c.j&&(K[c.j+d]=b(e))}function h(a){return function(b,c){var d=D.get(c);return Cb(d[a],b,c)}}K={};jb={};y(wf,function(h){var k=h.get,l;h.j&&(K[h.j]=b(k));h.l&&(K[h.l]=c(k,h));h.c&&(K[h.c]=d(k,h.c.length));h.u&&(K[h.u]=d(e(k),2));h.B&&(jb[h.B]=d(e(k),2));h.h&&(l=d(k,h.h));h.alias&&(k=f(h.alias));if(h.C)for(var m= -1;5>=m;m++)g(h,m);a(K,h.b,k);a(jb,h.a,l||k)});q(ad,function(b,c){a(K,c,f(b))});Ta(P,"short medium long full",function(b,c){var d=h(c);a(K,c,d);b[c]=d});a(K,"time",h("time"));a(K,"stamp",h("stamp"))})();(function(){Cb=Pc(function(a,b,c){return u(K,b)(a,c)},function(a,b,c){return u(jb,b)(a,c)},function(a,b){return x(K,a)||x(jb,b)})})();(function(){Ta(P,ka,function(a,b,c){var d=b.name,e=Ya(d);4]/g,kd={lt:"<",gt:">",amp:"&",nbsp:" ", -quot:'"',apos:"'"},rc,Te="and or nor a an the so but to of at by from into on onto off out in over with for".split(" "),Xe="area base br col command embed hr img input keygen link meta param source track wbr".split(" "),zf=/^[\t\n\x0B\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u2028\u2029\u3000\ufeff]+/,Af=/[\t\n\x0B\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u2028\u2029\u3000\ufeff]+$/, -Ue=/(?=[\t\n\x0B\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u2028\u2029\u3000\ufeff])/,Bf=String.prototype.includes,sc,tc,Cf=Pc(rb);M(hb,{includes:ea(function(a,b,c){if(!ha(b))return Bf.call(a,b,c);c&&(a=a.slice(c));return b.test(a)})},["enhance","enhanceString"]);M(hb,{at:function(a,b,c){return Lc(a,b,c,!0)},escapeURL:function(a,b){return b?encodeURIComponent(a):encodeURI(a)},unescapeURL:function(a,b){return b?decodeURI(a):decodeURIComponent(a)}, -escapeHTML:function(a){return a.replace(yf,function(a){return u(rc,a)})},unescapeHTML:function(a){return Ve(a)},stripTags:function(a,b,c){return md(a,b,c,!0)},removeTags:function(a,b,c){return md(a,b,c,!1)},encodeBase64:function(a){return sc(a)},decodeBase64:function(a){return tc(a)},forEach:function(a,b,c){return cb(a,b,c)},chars:function(a,b,c){return cb(a,b,c)},words:function(a,b){return cb(a.trim(),/\S+/g,b)},lines:function(a,b){return cb(a.trim(),/^.*$/gm,b)},codes:function(a,b){return jd(a, -b)},shift:function(a,b){var c="";b=b||0;jd(a,function(a){c+=ma(a+b)});return c},isBlank:function(a){return 0===a.trim().length},isEmpty:function(a){return 0===a.length},insert:function(a,b,c){c=v(c)?a.length:c;return a.slice(0,c)+b+a.slice(c)},remove:function(a,b){return a.replace(b,"")},removeAll:function(a,b){return ld(a,b)},reverse:function(a){return a.split("").reverse().join("")},compact:function(a){return a.trim().replace(/([\r\n\s\u3000])+/g,function(a,c){return"\u3000"===c?c:" "})},from:function(a, -b){return a.slice(od(a,b,!0))},to:function(a,b){v(b)&&(b=a.length);return a.slice(0,od(a,b))},dasherize:function(a){return db(a).replace(/_/g,"-")},underscore:function(a){return db(a)},camelize:function(a,b){return Pe(a,b)},spacify:function(a){return db(a).replace(/_/g," ")},titleize:function(a){return Se(a)},parameterize:function(a,b){void 0===b&&(b="-");a=a.replace(/[^a-z0-9\-_]+/gi,b);b&&(b=RegExp(["^","+|","+$|(",")","+"].join(Ja(b)),"g"),a=a.replace(b,"$1"));return encodeURI(a.toLowerCase())}, -truncate:function(a,b,c,d){return id(a,b,c,d)},truncateOnWord:function(a,b,c,d){return id(a,b,c,d,!0)},pad:function(a,b,c){b=wa(b);var d=E(0,b-a.length)/2;b=La(d);d=la(d);return Eb(b,c)+a+Eb(d,c)},padLeft:function(a,b,c){b=wa(b);return Eb(E(0,b-a.length),c)+a},padRight:function(a,b,c){b=wa(b);return a+Eb(E(0,b-a.length),c)},first:function(a,b){v(b)&&(b=1);return a.substr(0,b)},last:function(a,b){v(b)&&(b=1);return a.substr(0>a.length-b?0:a.length-b)},toNumber:function(a,b){return Ub(a,b)},capitalize:function(a, -b,c){return cc(a,b,c)},trimLeft:function(a){return a.replace(zf,"")},trimRight:function(a){return a.replace(Af,"")}});ib(hb,{replaceAll:function(a,b,c){return ld(a,b,c)},format:function(a,b){var c=b[0]&&b[0].valueOf();1===b.length&&I(c)&&(b=c);return Cf(a,b)}});(function(){function a(a){return function(b){try{return a(b)}catch(g){return""}}}if("undefined"!==typeof Buffer)sc=function(a){return Buffer.from(a).toString("base64")},tc=function(a){return Buffer.from(a,"base64").toString("utf8")};else{if("undefined"!== -typeof btoa){var b=a(btoa);var c=a(atob)}else{var d=/[^A-Za-z0-9\+\/=]/g;b=function(a){var b="",c=0;do{var d=a.charCodeAt(c++);var e=a.charCodeAt(c++);var k=a.charCodeAt(c++);var m=d>>2;d=(d&3)<<4|e>>4;var r=(e&15)<<2|k>>6;var p=k&63;isNaN(e)?r=p=64:isNaN(k)&&(p=64);b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(m);b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(d);b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(r); -b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(p)}while(c>4;l=(l&15)<<4|k>>2;var r=(k&3)<<6|m;b+=ma(e);64!=k&&(b+=ma(l));64!=m&&(b+=ma(r))}while(c=f||65296<=f&&65305>=f)&&(48<=h&&57>=h||65296<=h&&65305>=h)&&(f=Ub(a.slice(c)),h=Ub(b.slice(c)))):(k=k!==a.charAt(c), -m=m!==b.charAt(c),k!==m&&0===d&&(d=k-m));c+=1}while(null!=f&&null!=h&&f===h);return f===h?d:f-h},sortEquivalents:function(){var a={};y("A\u00c1\u00c0\u00c2\u00c3\u00c4 C\u00c7 E\u00c9\u00c8\u00ca\u00cb I\u00cd\u00cc\u0130\u00ce\u00cf O\u00d3\u00d2\u00d4\u00d5\u00d6 S\u00df U\u00da\u00d9\u00db\u00dc".split(" "),function(b){var c=b.charAt(0);y(b.slice(1).split(""),function(b){a[b]=c;a[b.toLowerCase()]=c.toLowerCase()})});return a}()},Oa=Pb(R,Ef);ua(R,{create:function(a,b){return pd(a,b)},construct:function(a, -b){a=wa(a);return Array.from(Array(a),function(a,d){return b&&b(d)})}});M(R,{isEmpty:function(a){return 0===a.length},isEqual:function(a,b){return xa(a,b)},clone:function(a){return Na(a)},at:function(a,b,c){return Lc(a,b,c)},add:function(a,b,c){return qd(Na(a),b,c)},subtract:function(a,b){return td(a,b,!0)},append:function(a,b,c){return qd(a,b,c)},removeAt:function(a,b,c){if(v(b))return a;v(c)&&(c=b);a.splice(b,c-b+1);return a},unique:function(a,b){return rd(a,b)},flatten:function(a,b){return sd(a, -b)},first:function(a,b){if(v(b))return a[0];0>b&&(b=0);return a.slice(0,b)},last:function(a,b){return v(b)?a[a.length-1]:a.slice(0>a.length-b?0:a.length-b)},from:function(a,b){return a.slice(b)},to:function(a,b){v(b)&&(b=a.length);return a.slice(0,b)},compact:function(a,b){return $e(a,b)},groupBy:function(a,b,c){return af(a,b,c)},inGroups:function(a,b,c){var d=m(c),e=Array(b),f=la(a.length/b);Rb(b,function(b){var g=b*f,l=a.slice(g,g+f);d&&l.lengthb&&(b+=l);b=m(b,l);Gc(c.length);q=p?p(q,e):q;d.push(g(a,b,q,e,l,h));e&&d.push(e);a=f.apply(k(a,b,h),d);r&&(a=r(a,b,l));return a}}q({forEach:{i:function(a){y(this,a)}},map:{v:Id}, -"some every":{v:ta},findIndex:{v:ta,result:function(a,b,c){-1!==a&&(a=(a+b)%c);return a}},reduce:{apply:c},"filter find":{v:ta},reduceRight:{apply:c,slice:function(a,b,c){c||(a=a.slice(0,E(0,b+1)));return a},clamp:function(a,b){return ba(b,E(-1,a))}}},function(a,b){y(b.split(" "),function(b){ib(R,b+"FromIndex",e(b,a))})})})();var Kd=Pb(ca,{decimal:".",thousands:","});ua(ca,{random:function(a,b){1==arguments.length&&(b=a,a=0);var c=ba(a||0,v(b)?1:b);var d=E(a||0,v(b)?1:b)+1;return N(Math.random()* -(d-c)+c)}});M(ca,{isInteger:function(a){return 0===a%1},isOdd:function(a){return 0===a%1&&0!==a%2},isEven:function(a){return 0===a%2},isMultipleOf:function(a,b){return 0===a%b},log:function(a,b){return Math.log(a)/(b?Math.log(b):1)},abbr:function(a,b){return kc(a,b,"|kmbt")},metric:function(a,b,c){"all"===c?c="yzafpn\u03bcm|KMGTPEZY":c||(c="n\u03bcm|k");return kc(a,b,c)},bytes:function(a,b,c,d){"binary"===d||!d&&c?d="|,Ki,Mi,Gi,Ti,Pi,Ei":"si"!==d&&d||(d="|KMGTPE");return kc(a,b,d,c)+"B"},format:function(a, -b){return Jd(a,b)},hex:function(a,b){return Ha(a,b||1,!1,16)},times:function(a,b){for(var c,d,e=0;e=b)return a.call(this,d)}},once:function(a){var b=!1,c;return function(){if(b)return c;b=!0;return c=a.apply(this,arguments)}},memoize:function(a,b,c){if(!F(b)){var d=b;b=c}if(B(d)){var e=d;d=function(a){return rb(a,e)}}else d||(d=sf);return tf(a,d,b)},lock:function(a,b){if(de(a))return Kb(a,F(b)?b:null),a;var c=function(){arguments.length=ba(Kb(c),arguments.length);return a.apply(this,arguments)};Kb(c,F(b)?b:a.length);return c}});ib(Ud,{partial:function(a, -b){function c(){var e=0,f=[],g=this,h=Kb(c),l;for(l=0;l=this.start&&a.start<=this.end&&a.end>=this.start&&a.end<=this.end:a>=this.start&&a<=this.end},every:function(a,b){return Jb(this,a,!1,b)},toArray:function(){return Jb(this)},union:function(a){return new L(this.starta.end?this.end:a.end)},intersect:function(a){return a.start>this.end||a.enda.start?this.start:a.start,this.endc)c=function(){return Jb(this,b,!0)};else{var e=Td[Ya(d)]; -c=function(){return N((this.end-this.start)/e)}}a[d]=c});Fc(L,a)})()}).call(this);}).call(this); diff --git a/dist/sugar.min.map b/dist/sugar.min.map deleted file mode 100644 index 21c63b801..000000000 --- a/dist/sugar.min.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"", -"lineCount":143, -"mappings":"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", -"sources":["/Users/andrew/Projects/Sugar/dist/sugar.tmp.js"], -"names":["PrimitiveRangeConstructor","start","end","Range","forEachProperty","obj","fn","key","hasOwn","call","testGlobal","Object","createNamespace","name","defineWithOptionCollect","methodName","instance","args","setProperty","sugarNamespace","arg1","arg2","arg3","opts","collectDefineOptions","defineMethods","methods","last","isObject","getNewChainableClass","STATIC","INSTANCE","extendNative","globalContext","prototype","defineChainableMethod","source","method","extend","arrayOptionExists","field","val","arr","i","el","arrayOptionExcludes","disallowedByFlags","target","flags","length","nativeClass","nativeProto","staticMethods","instanceMethods","methodsByName","objectPrototype","allowObjectPrototype","namespacesByName","namespacesByClassString","mapNativeToChainable","mapObjectChainablesToNamespace","Sugar","toString","SUGAR_GLOBAL","type","staticMethod","wrapMethodWithArguments","instanceMethod","wrapInstanceMethodFixed","active","startCollect","collectedArgs","push","len","Math","max","arguments","apply","a","b","c","d","polyfill","override","SugarChainable","arg","constructor","raw","wrapped","wrapWithChainableResult","existing","dcp","DefaultChainable","collision","disambiguate","disambiguateMethod","mapObjectChainableToAllNamespaces","proto","classToString","methodNames","ownPropertyNames","e","definePropertyShim","prop","descriptor","value","enumerable","defineProperty","configurable","writable","internalToString","internalHasOwnProperty","getOwn","isClass","className","str","wrapNamespace","defineInstanceSimilar","set","defineInstance","collectSimilarMethods","defineInstanceAndStaticSimilar","defineInstanceAndStatic","isString","split","forEach","fixArgumentLength","staticFn","staticFn.instance","defineAccessor","namespace","defineOptionsAccessor","defaults","getOption","simpleMerge","setOption","options","defineOnPrototype","ctor","assertArgument","exists","TypeError","assertCallable","isFunction","coercePositiveInteger","n","isNumber","isFinite","RangeError","trunc","isDefined","o","undefined","isUndefined","privatePropertyAccessor","privateKey","PRIVATE_PROP_PREFIX","setChainableConstructor","createFn","sugarNamespace.prototype.constructor","getMatcher","f","isPrimitive","isRegExp","regexMatcher","isDate","dateMatcher","functionMatcher","isPlainObject","fuzzyMatcher","defaultMatcher","matchers","matched","isObjectType","isEqual","reg","RegExp","test","ms","getTime","deepGetProperty","any","handleDeepProperty","has","fill","fillLast","ns","bs","String","indexOf","handleArrayIndexRange","blen","ps","HALF_WIDTH_PERIOD","j","plen","isLast","cbi","isIndex","isPush","nextIsIndex","slice","match","PROPERTY_RANGE_REG","leading","isArray","trailing","charAt","map","getOwnKey","hasConstructor","objectProto","simpleRepeat","coercePrimitiveToObject","NO_KEYS_IN_STRING_OBJECTS","chr","stack","aClass","bClass","isSerializable","objectIsEqual","isSet","size","setToArray","isMap","mapToArray","isError","aType","bType","valueOf","count","propsEqual","iterateWithCyclicCheck","cyc","keys","serializeInternal","refs","sign","Infinity","serializeDeep","ref","result","sortedKeys","next","pop","iterateWithSortedKeys","sort","getSparseArrayIndexes","fromIndex","loop","fromRight","indexes","aLoop","getEntriesForIndexes","find","entryAtIndex","Array","index","getNormalizedIndex","mapWithShortcuts","context","mapArgs","m","filter","withPrecision","precision","multiplier","pow","abs","round","padNumber","num","place","base","replacement","repeatString","replace","getOrdinalSuffix","stringToNumber","isDecimal","sanitized","fullWidthNumberReg","fullWidthNumberMap","parseFloat","parseInt","simpleCapitalize","toUpperCase","createFormatMatcher","bracketMatcher","percentMatcher","precheck","getToken","format","bKey","pLit","pKey","token","get","literal","assertPassesPrecheck","opt","getLiteral","getSubstring","sub","assertNoUnmatched","OPEN_BRACE","CLOSE_BRACE","bt","pt","STRING_FORMAT_REG","compileMemoized","memoizeFunction","compile","lastIndex","exec","runHumanRules","Inflections","human","runRules","getRegExpFlags","add","checkFlag","flag","global","ignoreCase","multiline","sticky","escapeRegExp","callDateGet","_utc","callDateSet","safe","memo","counter","INTERNAL_MEMOIZE_LIMIT","getCoercedStringSubject","getCoercedSearchString","getNewDate","_dateOptions","cloneDate","clone","Date","assertDateIsValid","isNaN","getWeekday","getDate","getMonth","getYear","setDate","getDaysInMonth","setWeekday","dow","dir","currentWeekday","ndir","offset","getUTCOffset","iso","getTimezoneOffset","colon","hours","mins","collectUpdateDateArguments","allowDuration","params","toLowerCase","reset","collectDateParamsFromArguments","walkUnitDown","YEAR_INDEX","unit","iterateOverDateUnits","startIndex","endIndex","DateUnits","unitIndex","getLowerUnitIndex","MONTH_INDEX","DAY_INDEX","WEEK_INDEX","HOURS_INDEX","iterateOverDateParams","getDateParamKey","iterateOverHigherDateParams","advanceDate","updateDate","advanceDateWithArgs","moveToBeginningOfWeek","firstDayOfWeek","floor","moveToEndOfWeek","ceil","moveToBeginningOfUnit","localeCode","localeManager","getFirstDayOfWeek","setUnitAndLowerToEdge","moveToEndOfUnit","stopIndex","getUnitIndexForParamName","getTimeDistanceForUnit","d1","d2","fwd","tmp","ambiguous","setISOWeekNumber","isoWeek","ISO_FIRST_DAY_OF_WEEK_YEAR","ISO_FIRST_DAY_OF_WEEK","getWeekNumber","allowPrevious","firstDayOfWeekYear","getWeekYear","year","month","loc","getFirstDayOfWeekYear","week","dateRelative","dRelative","adu","getAdjustedUnitForDate","concat","dateFormat","getRelativeFormat","getAdjustedUnit","getAdjustedUnitForNumber","u","CoreOutputFormats","dateFormatMatcher","getMeridiemToken","ampm","fullCompareDate","date","margin","trim","compareDay","English","weekdayMap","monthMap","compareDate","loMargin","hiMargin","fromUTC","setUTC","p","getExtendedDate","specificity","edge","shift","compareEdges","t","min","timezoneShift","MINUTES","comp","createDate","forceClone","contextDate","parseFormatValues","dif","optParams","to","param","ABBREVIATED_YEAR_REG","optPrefer","prefer","delta","parseValue","cloneDateByFlag","optFromUTC","optSetUTC","fireCallbacks","afterCallbacks","parseStringDate","optLocale","compiledFormats","cacheFormat","timestamp","setTime","hour","utc","tzHour","tzMinute","minute","weekday","setOrdinalWeekday","midday","handleMidday","day","half","separateAbsoluteUnits","units","relative","handleEdge","weekdayDir","edgeIndex","unitName","weekdayOfMonth","NaN","optClone","setupOptions","locale","advance","disambiguateHigherUnit","upperUnitIndex","setUnit","fraction","lowerUnit","checkMonth","targetMonth","millisecond","arrayToRegAlternates","joined","join","getRegNonCapturing","src","getParsingTokenWithSuffix","suffix","LocalizedParsingTokens","requiresSuffix","requiresSuffixOr","getArrayWithOffset","alternate","getNewLocale","def","Locale","init","getMonthName","monthSuffix","months","getWeekdayName","weekdays","parseNumber","numeralMap","parseRegularNumerals","parseIrregularNumerals","isPlace","numeral","digit","lastWasPlace","getOrdinal","ordinalSuffix","convertAdjustedToFormat","getDuration","plural","mult","full","splice","unshift","addFormat","getTokenSrc","nc","parsingAliases","formatToSrc","tokens","CoreParsingTokens","parsingTokens","code","mod","addRawFormat","buildValueArray","all","setMap","forAllAlternates","alt","idx","forEachAlternate","suffixes","getCoreTokensForBase","addFormatSet","allowTime","timeFront","getTimeAfter","markers","localized","timeMarkers","timeMarkerOptional","initArrayFields","LOCALE_ARRAY_FIELDS","HALF_WIDTH_COMMA","buildNumerals","getTimeFormat","sep","timeSeparator","ampmFront","buildParsingTokens","requiresNumerals","numeralUnits","numerals","placeholders","articles","allowsFullWidth","fullWidthNumbers","buildTimeSuffixes","timeSuffixes","alias","buildModifiers","modifiers","modifier","mapKey","addCoreFormats","CoreParsingFormats","df","localeCheck","mdy","time","padString","padding","truncateString","from","ellipsis","str2","truncateOnWord","len1","len2","str1","stringEach","search","chunk","lastLastIndex","r","eachWord","stringCodes","codes","charCodeAt","stringUnderscore","areg","acronyms","acronym","stringCamelize","upper","CAMELIZE_REG","pre","word","cap","stringCapitalize","downcase","CAPITALIZE_REG","stringTitleize","fullStopPunctuation","lastHadPunctuation","words","first","hasPunctuation","isFirstOrLast","DOWNCASED_WORDS","limit","fromLeft","reverse","TRUNC_REG","unescapeHTML","HTML_ENTITY_REG","hex","HTMLFromEntityMap","special","stringReplaceAll","replaceTags","strip","tags","runTagReplacements","fullString","processTag","tagName","attributes","tagLength","isVoid","content","currentIndex","s","openTagCount","isClosingTag","isSelfClosing","HTML_VOID_ELEMENTS","isOpeningTag","isSameAsCurrent","openTagName","openTagAttributes","numberOrIndex","arrayCreate","arrayClone","arrayWrap","arraySafeConcat","arr2","arrayAppend","spliceArgs","arrayUnique","transformed","arrayFlatten","level","current","arrayCompact","arrayGroupBy","arrayIntersectOrSubtract","arr1","subtract","compareValue","aVal","bVal","collate","_arrayOptions","cmp","getCollationReadyString","sortIgnore","sortIgnoreCase","getCollationCharacter","sortEquivalents","toQueryString","deep","transform","prefix","separator","qc","sanitizeURIComponent","collectObjectAsQueryString","fullKey","encodeURIComponent","fromQueryStringWithOptions","auto","decodeURIComponent","DEEP_QUERY_STRING_REG","parseDeepQueryComponent","setQueryProperty","inner","k","fnValue","getQueryValueAuto","NON_DECIMAL_REG","mergeWithOptions","objectMerge","resolve","hidden","mergeAll","sources","iterateOverProperties","getOwnPropertyNames","iterateOverKeys","getOwnPropertySymbols","getFn","desc","getOwnPropertyDescriptor","resolveByFunction","resolveConflicts","getNewObjectForMerge","sourceVal","targetVal","resolved","goDeep","klass","getValues","values","tap","selectFromObject","select","objectRemove","matcher","objectExclude","objectIntersectOrSubtract","obj1","obj2","val1","sum","enumerateWithMapping","average","median","middle","getMinOrMax","asObject","pushVal","isBoolean","getReducedMinMaxResult","getLeastOrMost","most","group","groupKey","minMaxResult","reduce","arrayIndexes","mapped","enhancedMapping","enhancedMatching","wrapNativeArrayMethod","wrapper","nativeFn","argsLen","objectForEach","objectMap","objectReduce","acc","objectFilter","objectCount","wrapObjectMatcher","abbreviateNumber","ustr","bytes","fixed","toFixed","decimalPlace","numeralPlace","significant","mid","divisor","numberFormat","decimal","_numberOptions","thousands","integer","createRoundingFunction","setDelay","after","scope","_timers","_canceled","setTimeout","cancelFunction","timers","timer","clearTimeout","createLazyFunction","immediate","lazy","queue","locked","$i","$len","execute","rounded","perExecution","queueLength","maxPerRound","Function","collectArguments","createHashedMemoizeFunction","hashFn","hashObj","cloneRangeMember","getRangeMemberNumericValue","getRangeMemberPrimitiveValue","getPrecision","isValidRangeMember","rangeIsValid","range","rangeEvery","step","countOnly","inverse","increment","dio","getDateIncrementObject","incrementDate","amt","DURATION_REG","amount","MULTIPLIERS","rangeClamp","clamped","getDateForRange","sugarDate","create","window","defineProperties","hasOwnProperty","setupGlobal","module","exports","sugarObject","sugarArray","sugarString","sugarNumber","Number","sugarFunction","sugarRegExp","defineStatic","defineStaticPolyfill","defineInstancePolyfill","defineInstanceWithArguments","fromCharCode","buildClassChecks","addKnownType","knownTypes","buildClassCheck","globalObject","getConstructorClassCheck","getToStringClassCheck","ctorStr","buildPrimitiveClassCheck","addCoreTypes","names","Set","Map","addArrayTypes","buildFullWidthNumber","fwn","FULL_WIDTH_ZERO","HALF_WIDTH_ZERO","FULL_WIDTH_PERIOD","includes","searchString","pos","startsWith","position","searchLength","substr","endsWith","endPosition","repeat","mapFn","findIndex","TIMEZONE_ABBREVIATION_REG","FormatTokensBase","ldml","strf","lowerToken","allowAlternates","strfPadding","ldmlPaddedToken","ordinalToken","doy","ldmlTwoDigitToken","strfTwoDigitToken","DATE_OPTIONS","defaultNewDate","ldmlTokens","strfTokens","getLocale","getAllLocales","getAll","getAllLocaleCodes","setLocale","addLocale","removeLocale","remove","rewind","setISOWeek","getISOWeek","beginningOfISOWeek","endOfISOWeek","on","isUTC","isValid","isAfter","isBefore","isBetween","t1","t2","lo","hi","isLeapYear","daysInMonth","relativeFn","relativeTo","is","toISOString","getUTCWeekday","getUTCDay","duration","EnglishLocaleBaseDefinition","AmericanEnglishDefinition","v","BritishEnglishDefinition","CanadianEnglishDefinition","LazyLoadedLocales","buildLocales","LocaleManager","locales","fallback","buildDateFormatTokens","addFormats","buildLowercase","buildOrdinal","buildPadded","buildTwoDigits","buildAlias","buildAlternate","getIdentityFormat","getPadded","buildDateFormatMatcher","getLdml","getStrf","checkDateToken","buildDateUnitMethods","caps","until","since","buildNumberUnitMethods","before","buildRelativeAliases","together","HTML_ESCAPE_REG","HTMLToEntityMap","LEFT_TRIM_REG","RIGHT_TRIM_REG","nativeIncludes","encodeBase64","decodeBase64","stringFormatMatcher","callIncludesWithRegexSupport","ENHANCEMENTS_FLAG","STRING_ENHANCEMENTS_FLAG","at","escapeURL","encodeURI","unescapeURL","decodeURI","escapeHTML","stripTags","tag","removeTags","eachFn","chars","eachCharFn","eachWordFn","lines","eachLineFn","eachCodeFn","isBlank","isEmpty","insert","removeAll","compact","whitespace","dasherize","underscore","camelize","spacify","titleize","parameterize","truncate","pad","front","back","padLeft","padRight","toNumber","capitalize","lower","trimLeft","trimRight","replaceAll","buildBase64","catchEncodingError","Buffer","btoa","encodeAscii","decodeAscii","atob","base64reg","output","chr1","chr2","chr3","enc1","enc2","enc3","enc4","input","unescape","escape","buildEntities","HAS_CONCAT_BUG","ARRAY_OPTIONS","getSortOrder","collateStrings","tiebreaker","sortOrder","sortNatural","aChar","bChar","aValue","bValue","HALF_WIDTH_NINE","FULL_WIDTH_NINE","aEquiv","bEquiv","getSortEquivalents","equivalents","construct","indexMapFn","item","append","removeAt","unique","flatten","groupBy","groupFn","inGroups","inGroupsOf","shuffle","x","random","sample","single","sortBy","aProperty","bProperty","exclude","union","intersect","zip","fromQueryString","merge","addAll","invert","multi","isArguments","callee","reject","buildClassCheckMethods","checks","NATIVE_TYPES","enhancedSome","enhancedFilter","enhancedMap","enhancedEvery","enhancedFind","enhancedFindIndex","ARRAY_ENHANCEMENTS_FLAG","arrayNone","arrayCount","least","objectSome","objectEvery","objectFind","none","buildFromIndexMethods","sliceArrayFromLeft","clampStartIndex","applyReduce","applyEach","createFromIndexWithOptions","baseFn","applyCallback","sliceArray","clampIndex","clamp","getResult","callArgs","argIndex","lastArg","forEachAsNative","indexResult","sliceArrayFromRight","clampStartIndexFromRight","baseName","NUMBER_OPTIONS","n1","n2","minNum","maxNum","isInteger","isOdd","isEven","isMultipleOf","log","abbr","BASIC_UNITS","metric","METRIC_UNITS_FULL","METRIC_UNITS_SHORT","binary","MEMORY_BINARY_UNITS","MEMORY_UNITS","times","ordinalize","buildMathAliases","_lock","_partial","createInstanceFromPrototype","throttle","debounce","debounced","cancel","once","called","memoize","lock","lockedFn","partial","curriedArgs","partialFn","applyArgs","self","curriedLen","delay","every","getFlags","setFlags","addFlags","removeFlags","span","contains","everyFn","toArray","upto","RANGE_REG_FROM_TO","RANGE_REG_REAR_DURATION","RANGE_REG_FRONT_DURATION","DateRangeConstructor","datetime","buildDateRangeUnits"] -} diff --git a/lib/common.js b/lib/common.js index 8b4be2a05..da0689719 100644 --- a/lib/common.js +++ b/lib/common.js @@ -129,7 +129,7 @@ function buildClassChecks() { } } - // Map and Set may be [object Object] in certain IE environments. + // Map and Set may be [object Object] in IE 11. // In this case we need to perform a check using the constructor // instead of Object.prototype.toString. // istanbul ignore next diff --git a/lib/core.js b/lib/core.js index 9b28df75d..733439866 100644 --- a/lib/core.js +++ b/lib/core.js @@ -17,6 +17,22 @@ var SUGAR_GLOBAL = 'Sugar'; // global is set by the time the rest are checking for chainable Object methods. var NATIVE_NAMES = 'Object Number String Array Date RegExp Function'; +// Object - yes +// Array - yes +// Date - yes +// Boolean - no +// RegExp - yes +// Function - yes +// Number - yes - TRICKY if (sugarNumber.add(5)) ... +// String - yes - TRICKY if (sugarString.remove('foo')) ... +// Symbol - yes +// null - no +// undefined - no + +// if (sugarObject.get(key)) prop is wrapped boolean...doesn't work +// if (sugarObject.get(key).raw) prop is unwrapped boolean... errors +// if (string.replaceAll('asdfas')) + // Static method flag var STATIC = 0x1; @@ -816,12 +832,6 @@ function mapNativeToChainable(name, methodNames) { }); } -function nativeMethodProhibited(methodName) { - return methodName === 'constructor' || - methodName === 'valueOf' || - methodName === '__proto__'; -} - // Util diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..e27a140cc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11297 @@ +{ + "name": "sugar", + "version": "3.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.2.0.tgz", + "integrity": "sha512-FLteTkEoony0DX8NbnT51CmwmLBzINdlXmiJCSqCLmqWCDA/xk8EITPWqwDnVLbuK0bsZONt/grqHnQzQ15j0Q==", + "requires": { + "chokidar": "^2.0.3", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "output-file-sync": "^2.0.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.0.tgz", + "integrity": "sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.0", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.0", + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.2.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", + "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-define-map": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", + "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", + "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", + "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", + "dev": true, + "requires": { + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.2.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", + "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", + "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", + "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.0.tgz", + "integrity": "sha512-aPCEkrhJYebDXcGTAP+cdUENkH7zqOlgbKwLbghjjHpJRJBWM/FSlCjMoPGA8oUdiMfOrk3+8EFPLLb5r7zj2w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", + "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", + "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", + "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", + "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", + "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", + "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", + "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", + "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.0.tgz", + "integrity": "sha512-7TtPIdwjS/i5ZBlNiQePQCovDh9pAhVbp/nGVRBZuUdBiVRThyyLend3OHobc0G+RLCPPAN70+z/MAMhsgJd/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", + "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/polyfill": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", + "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "regenerator-runtime": "^0.11.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.0.tgz", + "integrity": "sha512-haGR38j5vOGVeBatrQPr3l0xHbs14505DcM57cbJy48kgMFvvHHoYEhHuRV+7vi559yyAUAVbTWzbK/B/pzJng==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.2.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", + "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "@babel/runtime-corejs2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.2.0.tgz", + "integrity": "sha512-kPfmKoRI8Hpo5ZJGACWyrc9Eq1j3ZIUpUAQT2yH045OuYpccFJ9kYA/eErwzOM2jeBG1sC8XX1nl1EArtuM8tg==", + "requires": { + "core-js": "^2.5.7", + "regenerator-runtime": "^0.12.0" + } + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + } + } + }, + "babel-loader": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz", + "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-add-module-exports": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz", + "integrity": "sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw==", + "requires": { + "chokidar": "^2.0.4" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es3-member-expression-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", + "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es3-property-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", + "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base62": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.8.tgz", + "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.5.tgz", + "integrity": "sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000912", + "electron-to-chromium": "^1.3.86", + "node-releases": "^1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", + "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000916", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000916.tgz", + "integrity": "sha512-D6J9jloPm2MPkg0PXcODLMQAJKkeixKO9xhqTUMvtd44MtTYMyyDXPQ2Lk9IgBq5FH0frwiPa/N/w8ncQf7kIQ==", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "closure-compiler-stream": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/closure-compiler-stream/-/closure-compiler-stream-0.1.15.tgz", + "integrity": "sha1-FqwTfkK18w8u4h/ztPKnX20IT8U=", + "dev": true, + "requires": { + "temp-write": "~0.3.1", + "through2": "~0.5.1" + }, + "dependencies": { + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "dev": true, + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz", + "integrity": "sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es3ify": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/es3ify/-/es3ify-0.2.2.tgz", + "integrity": "sha1-Xa4+ZQ5b42hLiAZlE9Uo0JJimGI=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "jstransform": "~11.0.0", + "through": "~2.3.4" + } + }, + "es3ify-loader": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/es3ify-loader/-/es3ify-loader-0.2.0.tgz", + "integrity": "sha1-i4QjV2vb0eo5xZvhMLzWxYxGEDY=", + "dev": true, + "requires": { + "es3ify": "0.2.x" + } + }, + "es5-shim": { + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.12.tgz", + "integrity": "sha512-MjoCAHE6P2Dirme70Cxd9i2Ng8rhXiaVSsxDWdSwimfLERJL/ypR2ed2rTYkeeYrMk8gq281dzKLiGcdrmc8qg==", + "dev": true + }, + "es6-shim": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.4.tgz", + "integrity": "sha512-oJidbXjN/VWXZJs41E9JEqWzcFbjt43JupimIoVX82Thzt5qy1CiYezdhRmWkj3KOuwJ106IG/ZZrcFC6fgIUQ==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esm": { + "version": "3.0.84", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.0.84.tgz", + "integrity": "sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw==", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + }, + "needle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", + "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "optional": true + }, + "rc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", + "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "tar": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules-path": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", + "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "google-closure-compiler": { + "version": "20180716.0.1", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180716.0.1.tgz", + "integrity": "sha1-SN6ysd/kwRity3DdEEz0+iuVCNc=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "google-closure-compiler-linux": "^20180716.0.0", + "google-closure-compiler-osx": "^20180716.0.0", + "vinyl": "^2.0.1", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "google-closure-compiler-linux": { + "version": "20180716.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20180716.0.0.tgz", + "integrity": "sha512-Lb/z7QCd4IKLBp39BCs+yhwsM7/5P9uLwZhR4D1RulwzOrj8GIz7hg26hqRSz88m/+dJMwKRRgV2XGw53e3D4A==", + "dev": true, + "optional": true + }, + "google-closure-compiler-osx": { + "version": "20180716.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20180716.0.0.tgz", + "integrity": "sha1-VpHAdYBXjf6jIF6QpqKWjSO4W9k=", + "dev": true, + "optional": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "^1.1.0" + } + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "dependencies": { + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + }, + "dependencies": { + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + } + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + } + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + }, + "dependencies": { + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + } + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + } + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + }, + "dependencies": { + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + }, + "dependencies": { + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + } + } + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "dependencies": { + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + } + } + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + } + } + } + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + } + } + } + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + } + } + } + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + }, + "dependencies": { + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + } + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + } + } + } + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + }, + "dependencies": { + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + }, + "dependencies": { + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + } + } + } + } + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + }, + "dependencies": { + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + }, + "dependencies": { + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + } + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + }, + "dependencies": { + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + } + } + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + } + } + } + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + } + } + } + } + } + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + }, + "dependencies": { + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + }, + "dependencies": { + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + } + } + } + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + }, + "dependencies": { + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "dependencies": { + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "dependencies": { + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + }, + "dependencies": { + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + }, + "dependencies": { + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + } + } + } + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + }, + "dependencies": { + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + } + } + } + } + } + } + }, + "flagged-respawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + }, + "dependencies": { + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + } + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + }, + "dependencies": { + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + } + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=", + "dev": true + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + } + } + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + }, + "dependencies": { + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + } + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + }, + "dependencies": { + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + } + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + } + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "^0.5.1" + }, + "dependencies": { + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + }, + "dependencies": { + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + } + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + } + } + } + } + } + } + } + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "^1.1.0" + }, + "dependencies": { + "natives": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", + "integrity": "sha1-Lw8iT8mn3VNAfHZnyEz42+dz3lg=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + }, + "dependencies": { + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + } + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + } + } + }, + "gulp-file": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.3.0.tgz", + "integrity": "sha1-6MTXY/Em+zMy/EFuPR70btZ9jQ0=", + "dev": true, + "requires": { + "gulp-util": "^2.2.14", + "through2": "^0.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" + }, + "dependencies": { + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + } + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + }, + "dependencies": { + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "~0.0.1" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" + }, + "dependencies": { + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + }, + "dependencies": { + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + } + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + }, + "dependencies": { + "glogg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", + "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", + "dev": true + } + } + } + } + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + }, + "dependencies": { + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", + "dev": true + } + } + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + }, + "dependencies": { + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + } + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + }, + "dependencies": { + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + } + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + } + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + } + } + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.18.0.tgz", + "integrity": "sha512-DWT87JHCSdCPCxbqBpS6Z2ajAt+MvrJq8I4xrpQljCvzODO5/fiquBp20a3sN6yCJvFbCRyYvJOHjpzkPTKJyA==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + } + } + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + } + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + } + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true, + "optional": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + } + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + } + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true, + "optional": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + } + } + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "optional": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + } + } + } + } + } + } + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + } + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "js-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", + "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jstransform": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", + "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", + "dev": true, + "requires": { + "base62": "^1.1.0", + "commoner": "^0.10.1", + "esprima-fb": "^15001.1.0-dev-harmony-fb", + "object-assign": "^2.0.0", + "source-map": "^0.4.2" + }, + "dependencies": { + "esprima-fb": { + "version": "15001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", + "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" + } + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "~2.4.1" + } + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-stream": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.8.tgz", + "integrity": "sha1-SKB7O0oSHXSj7b/c20sIrb8CQLE=", + "dev": true, + "requires": { + "through2": "^0.6.1" + }, + "dependencies": { + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natives": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", + "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "node-releases": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.0.tgz", + "integrity": "sha512-+qV91QMDBvARuPxUEfI/mRF/BY+UAkTIn3pvmvM2iOLIRvv6RNYklFXBgrkky6P1wXUqQW1P3qKlWxxy4JZbfg==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "output-file-sync": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", + "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "requires": { + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + } + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-polyfill": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", + "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ready-test": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/ready-test/-/ready-test-1.0.15.tgz", + "integrity": "sha512-gvjIZsrkNK2jklwulASRayvr/g+1WlzcU2PHda2JJAxyg/0L0lAPYp7ieRy/ikjWp6OPlUFgFICr7KPd/MKpxg==", + "dev": true, + "requires": { + "argv": "0.0.2", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "esm": "^3.0.66", + "glob": "^7.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + }, + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-defineproperty-webpack-plugin": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/remove-defineproperty-webpack-plugin/-/remove-defineproperty-webpack-plugin-0.0.3.tgz", + "integrity": "sha512-MisJUwbQQQBi7CeDZcN680/KTFcgyWXpbzOMY41lL8Q8AvVBNvmrv+QxtrPsiyxsKjXSC8cyWGSxi3IWikZonA==", + "requires": { + "acorn-dynamic-import": "^2.0.2", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "^4.0.3" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-replace-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-2.1.1.tgz", + "integrity": "sha512-0Nvw1LDclF45AFNuYPcD2Jvkv0mwb/dQSnJZMvhqGrT+zzmrpG3OJFD600qfQfNUd5aqfp7fCm2mQMfF7zLbyQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, + "temp-write": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-0.3.1.tgz", + "integrity": "sha1-C6Pkha8CkKWO6iHmsdO0v1QGPug=", + "dev": true, + "requires": { + "graceful-fs": "^3.0.1", + "mkdirp": "^0.5.0", + "uuid": "^1.4.1" + } + }, + "terser": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.11.0.tgz", + "integrity": "sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", + "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", + "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", + "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } + } + }, + "webpack": { + "version": "4.27.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.27.1.tgz", + "integrity": "sha512-WArHiLvHrlfyRM8i7f+2SFbr/XbQ0bXqTkPF8JpHOzub5482Y3wx7rEO8stuLGOKOgZJcqcisLhD7LrM/+fVMw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", + "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "global-modules-path": "^2.3.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index c647ab57c..afc0225d9 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "sugar", + "version": "3.0.0", "description": "A Javascript utility library for working with native objects.", "homepage": "https://sugarjs.com/", "icon": "https://sugarjs.com/icon.svg", @@ -27,14 +28,27 @@ "buffer": false }, "scripts": { - "test": "istanbul cover test/node --report=lcovonly", + "build": "webpack", + "test": "node -r esm ./node_modules/.bin/ready-test test/index.js", + "coverage": "istanbul cover --report=lcovonly ready-test test/index.js", "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" }, "typings": "sugar.d.ts", "devDependencies": { + "@babel/core": "^7.2.0", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-runtime": "^7.2.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.2.0", "acorn": "^2.7.0", + "babel-loader": "^8.0.4", + "babel-plugin-transform-es3-member-expression-literals": "^6.22.0", + "babel-plugin-transform-es3-property-literals": "^6.22.0", "closure-compiler-stream": "^0.1.15", "coveralls": "^2.11.15", + "es3ify-loader": "^0.2.0", + "es5-shim": "^4.5.12", + "es6-shim": "^0.35.4", "glob": "^5.0.14", "google-closure-compiler": "^20180716.0.1", "gulp": "^3.9.0", @@ -43,9 +57,23 @@ "istanbul": "^0.4.5", "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", + "promise-polyfill": "^8.1.0", + "ready-test": "^1.0.15", "rimraf": "^2.4.4", "sinon": "^1.15.4", + "string-replace-loader": "^2.1.1", "through2": "^2.0.0", + "webpack": "^4.27.1", + "webpack-cli": "^3.1.2", "yargs": "^3.15.0" + }, + "dependencies": { + "@babel/cli": "^7.2.0", + "@babel/runtime": "^7.2.0", + "@babel/runtime-corejs2": "^7.2.0", + "babel-plugin-add-module-exports": "^1.0.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "lodash": "^4.17.11", + "remove-defineproperty-webpack-plugin": "0.0.3" } } diff --git a/src/.eslintrc.json b/src/.eslintrc.json new file mode 100644 index 000000000..d8f7e1a22 --- /dev/null +++ b/src/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "globals": { + } +} diff --git a/src/core/index.js b/src/core/index.js new file mode 100644 index 000000000..914d890ce --- /dev/null +++ b/src/core/index.js @@ -0,0 +1,223 @@ +const SUGAR = 'Sugar'; + +// TODO: test browserify +// TODO: test broccoli +// TODO: test rhino +// TODO: test QML +const IS_BROWSER = typeof window !== 'undefined'; + +const hasOwnProperty = Object.prototype.hasOwnProperty; +const globalContext = getGlobalContext(); + +function hasOwn(obj, prop) { + return !!obj && hasOwnProperty.call(obj, prop); +} + +function forEachProperty(obj, fn) { + for(let key in obj) { + if (!hasOwn(obj, key)) continue; + if (fn.call(obj, key, obj[key], obj) === false) break; + } +} + +function getGlobalContext() { + // Get global context by keyword here to avoid issues with libraries + // that can potentially alter this script's context object. + return testGlobalContext(typeof global !== 'undefined' && global) || + testGlobalContext(typeof window !== 'undefined' && window) || + testGlobalContext(typeof self !== 'undefined' && self); +} + +function testGlobalContext(obj) { + // Note that Rhino uses a different "global" keyword so perform an + // extra check here to ensure that it's actually the global object. + // TODO: test this! + return obj && obj.Object === Object ? obj : null; +} + +function toString() { + return SUGAR; +} +// TODO: rinse arrow functions +// TODO: need to export anything? + +function nativeMethodProhibitedOnChainable(methodName) { + // Sugar chainables have their own constructors as well as "valueOf" + // methods, so exclude them here. The __proto__ argument should be + // trapped by the function check, however simply accessing this property + // on Object.prototype causes QML to segfault, so pre-emptively excluding + // it. Note we're intentionally allowing toString through to allow + // it to be wrapped as a chainable. + return methodName === 'constructor' || + methodName === 'valueOf' || + methodName === '__proto__'; +} + +function mapNativeToChainable(namespace, name) { + + const proto = globalContext[name].prototype; + + Object.getOwnPropertyNames(proto).forEach(methodName => { + // TODO: not toString?? + if (nativeMethodProhibitedOnChainable(methodName)) { + return; + } + try { + var fn = proto[methodName]; + if (typeof fn !== 'function') { + // Bail on anything not a function. + return; + } + } catch (e) { + // Function.prototype has properties that + // will throw errors when accessed. + return; + } + return namespace.prototype[methodName] = wrapChainableResult(fn); + }); +} + +function canWrapChainable(obj) { + return obj != null && obj !== true && obj !== false; +} + +function wrapChainableResult(fn) { + return function() { + const result = fn.apply(this.raw, arguments); + if (!canWrapChainable(result)) { + return result; + } + // Objects may not have prototypes. + const ctor = result.constructor; + const name = ctor ? ctor.name : 'Object'; + let namespace = Sugar[name]; + if (!namespace && (!ctor || ctor === globalContext[name])) { + namespace = createNamespace(name); + } + return namespace ? new namespace(result) : result; + } +} + +function createExport() { + const obj = { + VERSION: VERSION, + extend: extend, + toString: toString, + createNamespace: createNamespace + }; + + if (IS_BROWSER) { + try { + // Reuse already defined Sugar global object. + globalContext[SUGAR] = globalContext[SUGAR] || obj; + } catch(e) { + console.error(e); + // Contexts such as QML have a read-only global context. + } + } + + return obj; +} + +export function extend() { + console.info('EXTENDINNNNNNNn'); +} + +function assertMethodDoesNotExist(namespace, methodName) { + if (namespace[methodName]) { + throw new Error(ERROR_METHOD_DEFINED); + } +} + +function defineStatic(namespace, methodName, fn) { + assertMethodDoesNotExist(namespace, methodName); + return namespace[methodName] = fn; +} + +function defineInstance(namespace, methodName, fn) { + assertMethodDoesNotExist(namespace, methodName); + const instance = wrapStaticMethodAsInstance(namespace, fn); + namespace[methodName] = fn; + namespace.prototype[methodName] = wrapChainableResult(instance); +} + +function wrapStaticMethodAsInstance(namespace, fn) { + return function(...args) { + args.unshift(this); + return fn.apply(namespace, args); + } +} + +function defineWithArgs(namespace, defineMethod, args) { + if (typeof args[0] === 'object') { + forEachProperty(args[0], (methodName, fn) => { + defineMethod(namespace, methodName, fn); + }) + } else { + return defineMethod(namespace, args[0], args[1]); + } +} + +function defineAliases(namespace, defineMethod, str, fn) { + str.split(' ').forEach(methodName => { + defineMethod(namespace, methodName, fn(methodName)); + }); +} + +const ERROR_METHOD_DEFINED = 'Method already defined'; +const ERROR_NATIVE_UNKNOWN = 'Native class does not exist'; + +const INSTANCE = 0x1; +const STATIC = 0x2; + +export const VERSION = 'edge'; + +export function createNamespace(name) { + + if (!globalContext[name]) { + throw new Error(ERROR_NATIVE_UNKNOWN); + } + + if (Sugar[name]) { + return Sugar[name]; + } + + class SugarChainable { + + constructor(raw) { + this.raw = raw; + } + + static defineStatic(...args) { + return defineWithArgs(SugarChainable, defineStatic, args); + } + + static defineInstance(...args) { + return defineWithArgs(SugarChainable, defineInstance, args); + } + + static defineStaticAlias(str, fn) { + return defineAliases(SugarChainable, defineStatic, str, fn); + } + + static defineInstanceAlias(str, fn) { + return defineAliases(SugarChainable, defineInstance, str, fn); + } + + static toString() { + return SUGAR + name; + } + + valueOf() { + return this.raw; + } + + } + + mapNativeToChainable(SugarChainable, name); + + return Sugar[name] = SugarChainable; +} + +const Sugar = createExport(); +export default Sugar; diff --git a/src/es5.js b/src/es5.js new file mode 100644 index 000000000..c7c823054 --- /dev/null +++ b/src/es5.js @@ -0,0 +1 @@ +require('@babel/polyfill'); diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..f4756cc36 --- /dev/null +++ b/src/index.js @@ -0,0 +1,3 @@ +import './number'; + +export { default } from './core'; diff --git a/src/number/abs.js b/src/number/abs.js new file mode 100644 index 000000000..f439efe3f --- /dev/null +++ b/src/number/abs.js @@ -0,0 +1 @@ +export { abs as default } from './util/mathAliases'; diff --git a/src/number/acos.js b/src/number/acos.js new file mode 100644 index 000000000..b7d434d70 --- /dev/null +++ b/src/number/acos.js @@ -0,0 +1 @@ +export { acos as default } from './util/mathAliases'; diff --git a/src/number/asin.js b/src/number/asin.js new file mode 100644 index 000000000..05cb4b97b --- /dev/null +++ b/src/number/asin.js @@ -0,0 +1 @@ +export { asin as default } from './util/mathAliases'; diff --git a/src/number/atan.js b/src/number/atan.js new file mode 100644 index 000000000..e7aef10d9 --- /dev/null +++ b/src/number/atan.js @@ -0,0 +1 @@ +export { atan as default } from './util/mathAliases'; diff --git a/src/number/atan2.js b/src/number/atan2.js new file mode 100644 index 000000000..8e7e9695d --- /dev/null +++ b/src/number/atan2.js @@ -0,0 +1 @@ +export { atan2 as default } from './util/mathAliases'; diff --git a/src/number/ceil.js b/src/number/ceil.js new file mode 100644 index 000000000..d5f5dc884 --- /dev/null +++ b/src/number/ceil.js @@ -0,0 +1 @@ +export { ceil as default } from './util/roundingAliases'; diff --git a/src/number/cos.js b/src/number/cos.js new file mode 100644 index 000000000..1f2c77d06 --- /dev/null +++ b/src/number/cos.js @@ -0,0 +1 @@ +export { cos as default } from './util/mathAliases'; diff --git a/src/number/exp.js b/src/number/exp.js new file mode 100644 index 000000000..b50fa05a1 --- /dev/null +++ b/src/number/exp.js @@ -0,0 +1 @@ +export { exp as default } from './util/mathAliases'; diff --git a/src/number/floor.js b/src/number/floor.js new file mode 100644 index 000000000..befc75297 --- /dev/null +++ b/src/number/floor.js @@ -0,0 +1 @@ +export { floor as default } from './util/roundingAliases'; diff --git a/src/number/index.js b/src/number/index.js new file mode 100644 index 000000000..a67707c83 --- /dev/null +++ b/src/number/index.js @@ -0,0 +1,57 @@ +import SugarNumber from './namespace'; + +import './abs'; +import './acos'; +import './asin'; +import './atan'; +import './atan2'; +import './ceil'; +import './cos'; +import './exp'; +import './floor'; +import './isEven'; +import './isFinite'; +import './isInteger'; +import './isMultipleOf'; +import './isNaN'; +import './isOdd'; +import './isSafeInteger'; +import './log'; +import './pow'; +import './random'; +import './round'; +import './sin'; +import './sqrt'; +import './tan'; +import './toChar'; +import './toOrdinal'; + +export const { + abs, + acos, + asin, + atan, + atan2, + ceil, + cos, + exp, + floor, + isEven, + isFinite, + isInteger, + isMultipleOf, + isNaN, + isOdd, + isSafeInteger, + log, + pow, + random, + round, + sin, + sqrt, + tan, + toChar, + toOrdinal +} = SugarNumber; + +export default SugarNumber; diff --git a/src/number/isEven.js b/src/number/isEven.js new file mode 100644 index 000000000..85a2d7bba --- /dev/null +++ b/src/number/isEven.js @@ -0,0 +1,6 @@ +import { defineInstance } from './namespace'; +import isMultipleOf from './util/isMultipleOf'; + +export default defineInstance('isEven', function(n) { + return Number.isInteger(n) && isMultipleOf(n, 2); +}); diff --git a/src/number/isFinite.js b/src/number/isFinite.js new file mode 100644 index 000000000..50e7929de --- /dev/null +++ b/src/number/isFinite.js @@ -0,0 +1 @@ +export { isFinite as default } from './util/numberAliases'; diff --git a/src/number/isInteger.js b/src/number/isInteger.js new file mode 100644 index 000000000..2a22e6a03 --- /dev/null +++ b/src/number/isInteger.js @@ -0,0 +1 @@ +export { isInteger as default } from './util/numberAliases'; diff --git a/src/number/isMultipleOf.js b/src/number/isMultipleOf.js new file mode 100644 index 000000000..7c56c9e2c --- /dev/null +++ b/src/number/isMultipleOf.js @@ -0,0 +1,6 @@ +import { defineInstance } from './namespace'; +import isMultipleOf from './util/isMultipleOf'; + +export default defineInstance('isMultipleOf', function(n1, n2) { + return isMultipleOf(n1, n2); +}); diff --git a/src/number/isNaN.js b/src/number/isNaN.js new file mode 100644 index 000000000..b05e9475d --- /dev/null +++ b/src/number/isNaN.js @@ -0,0 +1 @@ +export { isNaN as default } from './util/numberAliases'; diff --git a/src/number/isOdd.js b/src/number/isOdd.js new file mode 100644 index 000000000..a71e4ebba --- /dev/null +++ b/src/number/isOdd.js @@ -0,0 +1,6 @@ +import { defineInstance } from './namespace'; +import isMultipleOf from './util/isMultipleOf'; + +export default defineInstance('isOdd', function(n) { + return Number.isInteger(n) && !isMultipleOf(n, 2); +}); diff --git a/src/number/isSafeInteger.js b/src/number/isSafeInteger.js new file mode 100644 index 000000000..3bc72357d --- /dev/null +++ b/src/number/isSafeInteger.js @@ -0,0 +1 @@ +export { isSafeInteger as default } from './util/numberAliases'; diff --git a/src/number/log.js b/src/number/log.js new file mode 100644 index 000000000..8c19e8cf9 --- /dev/null +++ b/src/number/log.js @@ -0,0 +1,5 @@ +import { defineInstance } from './namespace'; + +export default defineInstance('log', function(n, base) { + return Math.log(n) / (base ? Math.log(base) : 1); +}); diff --git a/src/number/namespace.js b/src/number/namespace.js new file mode 100644 index 000000000..aff889288 --- /dev/null +++ b/src/number/namespace.js @@ -0,0 +1,12 @@ +import { createNamespace } from '../core'; + +const namespace = createNamespace('Number'); + +export const { + defineStatic, + defineInstance, + defineStaticAlias, + defineInstanceAlias, +} = namespace; + +export default namespace; diff --git a/src/number/pow.js b/src/number/pow.js new file mode 100644 index 000000000..ca45ed099 --- /dev/null +++ b/src/number/pow.js @@ -0,0 +1 @@ +export { pow as default } from './util/mathAliases'; diff --git a/src/number/random.js b/src/number/random.js new file mode 100644 index 000000000..15ec12364 --- /dev/null +++ b/src/number/random.js @@ -0,0 +1,15 @@ +import { defineStatic } from './namespace'; +import trunc from './util/trunc'; + +export default defineStatic('random', function(n1, n2) { + if (arguments.length == 0) { + n1 = 0; + n2 = 1; + } else if (arguments.length == 1) { + n2 = n1; + n1 = 0; + } + const min = Math.min(n1, n2); + const max = Math.max(n1, n2) + 1; + return Math.floor((Math.random() * (max - min)) + min); +}); diff --git a/src/number/round.js b/src/number/round.js new file mode 100644 index 000000000..9d33d1217 --- /dev/null +++ b/src/number/round.js @@ -0,0 +1 @@ +export { round as default } from './util/roundingAliases'; diff --git a/src/number/sin.js b/src/number/sin.js new file mode 100644 index 000000000..1c3576ea5 --- /dev/null +++ b/src/number/sin.js @@ -0,0 +1,2 @@ +export { sin as default } from './util/mathAliases'; + diff --git a/src/number/sqrt.js b/src/number/sqrt.js new file mode 100644 index 000000000..5265c365c --- /dev/null +++ b/src/number/sqrt.js @@ -0,0 +1 @@ +export { sqrt as default } from './util/mathAliases'; diff --git a/src/number/tan.js b/src/number/tan.js new file mode 100644 index 000000000..dedc85f4b --- /dev/null +++ b/src/number/tan.js @@ -0,0 +1 @@ +export { tan as default } from './util/mathAliases'; diff --git a/src/number/toChar.js b/src/number/toChar.js new file mode 100644 index 000000000..0d99f7a19 --- /dev/null +++ b/src/number/toChar.js @@ -0,0 +1,8 @@ +import { defineInstance } from './namespace'; + +export default defineInstance('toChar', function(n) { + // Note that fromCharCode was historically 2x faster than + // fromCodePoint, however this no longer seems to be the case. + // https://jsperf.com/fromcharcode-vs-fromcodepoint/6 + return String.fromCodePoint(n); +}); diff --git a/src/number/toOrdinal.js b/src/number/toOrdinal.js new file mode 100644 index 000000000..e36b60930 --- /dev/null +++ b/src/number/toOrdinal.js @@ -0,0 +1,4 @@ +import { defineInstance } from './namespace'; +import toOrdinal from '../util/toOrdinal'; + +export default defineInstance('toOrdinal', toOrdinal); diff --git a/src/number/util/isMultipleOf.js b/src/number/util/isMultipleOf.js new file mode 100644 index 000000000..04927ff25 --- /dev/null +++ b/src/number/util/isMultipleOf.js @@ -0,0 +1,3 @@ +export default function(n1, n2) { + return n1 % n2 === 0; +} diff --git a/src/number/util/mathAliases.js b/src/number/util/mathAliases.js new file mode 100644 index 000000000..18f174d6f --- /dev/null +++ b/src/number/util/mathAliases.js @@ -0,0 +1,14 @@ +import SugarNumber, { defineInstanceAlias } from '../namespace'; + +defineInstanceAlias('abs pow sin asin cos acos tan atan atan2 exp sqrt', function(name) { + return function(n, arg) { + // Note that .valueOf() here is only required due to a + // very strange bug in iOS7 that only occurs occasionally + // in which Math.abs() called on non-primitive numbers + // returns a completely different number (Issue #400) + return Math[name](n.valueOf(), arg); + }; + } +); + +export const { abs, pow, sin, asin, cos, acos, tan, atan, atan2, exp, sqrt } = SugarNumber; diff --git a/src/number/util/numberAliases.js b/src/number/util/numberAliases.js new file mode 100644 index 000000000..fefabedd2 --- /dev/null +++ b/src/number/util/numberAliases.js @@ -0,0 +1,9 @@ +import SugarNumber, { defineInstanceAlias } from '../namespace'; + +defineInstanceAlias('isNaN isFinite isInteger isSafeInteger', function(name) { + return function(n, place) { + return Number[name](n); + }; +}); + +export const { isNaN, isFinite, isInteger, isSafeInteger } = SugarNumber; diff --git a/src/number/util/roundWithPrecision.js b/src/number/util/roundWithPrecision.js new file mode 100644 index 000000000..4668204b2 --- /dev/null +++ b/src/number/util/roundWithPrecision.js @@ -0,0 +1,9 @@ + +export default function(val, place, fn = Math.round) { + let mult = Math.pow(10, Math.abs(place || 0)); + if (place < 0) { + mult = 1 / mult; + } + return fn(val * mult) / mult; +} + diff --git a/src/number/util/roundingAliases.js b/src/number/util/roundingAliases.js new file mode 100644 index 000000000..9ec6f9eb6 --- /dev/null +++ b/src/number/util/roundingAliases.js @@ -0,0 +1,11 @@ +import SugarNumber, { defineInstanceAlias } from '../namespace'; +import roundWithPrecision from './roundWithPrecision'; + +defineInstanceAlias('round floor ceil', function(name) { + const fn = Math[name]; + return function(n, place) { + return place ? roundWithPrecision(n, place, fn) : fn(n); + }; +}); + +export const { round, floor, ceil } = SugarNumber; diff --git a/src/number/util/trunc.js b/src/number/util/trunc.js new file mode 100644 index 000000000..1959658a6 --- /dev/null +++ b/src/number/util/trunc.js @@ -0,0 +1,3 @@ +export default function(n) { + return n | 0; +} diff --git a/src/polyfills.js b/src/polyfills.js new file mode 100644 index 000000000..6e50cada0 --- /dev/null +++ b/src/polyfills.js @@ -0,0 +1,6 @@ + +// TODO: These are better included using webpack.config.js +// But that doesn't seem to work with Babel at the moment. +import 'core-js/modules/es6.number.is-safe-integer' +import 'core-js/modules/es6.number.is-finite' +import 'core-js/modules/es6.number.is-nan' diff --git a/src/util/toOrdinal.js b/src/util/toOrdinal.js new file mode 100644 index 000000000..ae3b0cdb4 --- /dev/null +++ b/src/util/toOrdinal.js @@ -0,0 +1,20 @@ + +function getSuffix(n) { + if (n >= 11 && n <= 13) { + return 'th'; + } else { + switch(Math.abs(n) % 10) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + default: return 'th'; + } + } +} + +export default function(n) { + if (!n || !isFinite(n)) { + throw new RangeError('Invalid number'); + } + return n + getSuffix(n); +} diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 000000000..0fe422d1d --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "globals": { + "method": true, + "namespace": true, + "assertEqual": true, + "describe": true, + "assertNamedExports": true, + "it": true + } +} diff --git a/test/chainable.js b/test/chainable.js new file mode 100644 index 000000000..f477c4860 --- /dev/null +++ b/test/chainable.js @@ -0,0 +1,240 @@ +'use strict'; + +describe('Chainable', function () { + + Sugar.createNamespace('Number'); + Sugar.createNamespace('String'); + Sugar.createNamespace('Object'); + Sugar.createNamespace('Array'); + + describe('Constructor', function() { + + it('should instantiate with new keyword', function() { + assertEqual(new Sugar.Number(1).raw, 1); + }); + + it('should throw an error without new keyword', function() { + assertError(function() { + Sugar.Number(1); + }); + }); + + }); + + describe('Instance Methods', function() { + + it('should be able to define instance methods', function() { + Sugar.Number.defineInstance('add', add); + assertEqual(new Sugar.Number(5).add(5).raw, 10); + delete Sugar.Number.add; + }); + + it('should be able to accept an arbitrary number of arguments', function() { + Sugar.Number.defineInstance('add', function() { + return Array.prototype.slice.call(arguments).reduce(function(sum, n) { + return sum + n; + }, 0); + }); + assertEqual(new Sugar.Number(5).add(1,2,3,4,5,6,7,8,9,10).raw, 60); + delete Sugar.Number.add; + }); + + it('should throw an error when trying overwrite method', function() { + Sugar.Number.defineInstance('add', add); + assertError(function overwriteInstance() { + Sugar.Number.defineInstance('add', mult); + }); + delete Sugar.Number.add; + }); + + it('should allow chaining', function() { + Sugar.Number.defineInstance('add', add); + Sugar.Number.defineInstance('mult', mult); + assertEqual(new Sugar.Number(5).add(5).mult(5).raw, 50); + delete Sugar.Number.add; + delete Sugar.Number.mult; + }); + + it('should allow chaining across namespaces', function() { + // Note that Object is being used here as a safeguard as + // it's behavior differs slightly when extending. + Sugar.Number.defineInstance('passObject', pass); + Sugar.Object.defineInstance('passNumber', pass); + assertEqual(new Sugar.Number().passObject({}).passNumber(1).raw, 1); + delete Sugar.Number.passObject; + delete Sugar.Object.passNumber; + }); + + }); + + describe('Wrapping Behavior', function() { + + beforeEach(function() { + Sugar.Number.defineInstance('pass', pass); + }); + + afterEach(function() { + delete Sugar.Number.pass; + }); + + it('should not wrap boolean result', function() { + assertFalse(new Sugar.Number(1).pass(false)); + assertTrue(new Sugar.Number(2).pass(true)); + }); + + it('should not wrap null', function() { + assertNull(new Sugar.Number(1).pass(null)); + }); + + it('should not wrap undefined', function() { + assertUndefined(new Sugar.Number(1).pass(undefined)); + }); + + it('should wrap empty string', function() { + assertEqual(new Sugar.Number(1).pass('').raw, ''); + }); + + it('should wrap 0', function() { + assertEqual(new Sugar.Number(1).pass(0).raw, 0); + }); + + it('should wrap NaN', function() { + assertNaN(new Sugar.Number(1).pass(NaN).raw); + }); + + it('should wrap object result and initialize namespace', function() { + ensureNamespaceNotInitialized('Object', function() { + var obj = {}; + assertEqual(new Sugar.Number(1).pass(obj).raw, obj); + assertTrue(!!Sugar.Object); + }); + }); + + it('should not initialize namespace for custom classes', function() { + function Foo() {} + new Sugar.Number(1).pass(new Foo); + assertTrue(!Sugar.Foo); + }); + + it('should not initialize namespace for custom classes with same name as built-ins', function() { + ensureNamespaceNotInitialized('Array', function() { + function Array() {} + new Sugar.Number(1).pass(new Array); + assertTrue(!Sugar.Array); + }); + }); + + it('should not fail when object has no prototype', function() { + if (Object.create) { + var obj = Object.create(null); + assertEqual(new Sugar.Number(1).pass(obj).raw, obj); + } + }); + + }); + + describe('Native Mapping', function() { + + it('should map native methods to chainable prototype', function() { + assertEqual(new Sugar.Number(5).toFixed(2).raw, '5.00'); + }); + + it('should chain defined methods alongside native', function() { + Sugar.Number.defineInstance('add', add); + Sugar.String.defineInstance('add', add); + assertEqual(new Sugar.Number(5).add(5).toFixed(2).add('px').raw, '10.00px'); + delete Sugar.Number.add; + delete Sugar.String.add; + }); + + it('should not coerce non-primitives', function() { + assertEqual(typeof new Sugar.Number(new Number(1)).valueOf(), 'object'); + }); + + }); + + describe('Operators', function() { + + var zero = new Sugar.Number(0); + var two = new Sugar.Number(2); + + it('should coerce double equals', function() { + assertTrue(two == 2); + assertTrue(2 == two); + }); + + it('should coerce comparison operators', function() { + assertEqual(two > 1, true); + assertEqual(two > 3, false); + assertEqual(1 < two, true); + assertEqual(3 < two, false); + }); + + it('should coerce arithmetic operators', function() { + assertEqual(two + 1, 3); + assertEqual(2 + two, 4); + assertEqual(two - 1, 1); + assertEqual(5 - two, 3); + assertEqual(two * 3, 6); + assertEqual(4 * two, 8); + assertEqual(two / 2, 1); + assertEqual(6 / two, 3); + assertEqual(two % 1, 0); + assertEqual(7 % two, 1); + }); + + it('should coerce incrment operator', function() { + var val = new Sugar.Number(1); val++; + assertEqual(val, 2); + }); + + it('should coerce assignment operators', function() { + var val = new Sugar.Number(1); + val += 5; + assertEqual(val, 6); + }); + + it('should coerce bitwise operators', function() { + assertEqual(two | 1, 3); + assertEqual(1 | two, 3); + }); + + it('should coerce unary operators', function() { + assertEqual(+two, 2); + assertEqual(-two, -2); + }); + + it('should coerce string concatenation operator', function() { + var a = new Sugar.String('a'); + assertEqual(a + 'b', 'ab'); + assertEqual('b' + a, 'ba'); + }); + + it('should not coerce conditional operators', function() { + assertTrue(zero ? true : false); + }); + + it('should not coerce logical operators', function() { + assertFalse(zero && false); + }); + + }); + + describe('toString', function() { + + it('should return a chainable', function() { + assertEqual(new Sugar.Number(1).toString().raw, '1'); + }); + + it('should match its built-in class', function() { + assertEqual(new Sugar.Array([1,2,3]).toString().raw, '1,2,3'); + }); + + it('should be equivalent to calling prototype.toString', function() { + assertEqual(new Sugar.Object(null).toString().raw, Object.prototype.toString.call(null)); + assertEqual(new Sugar.Object(undefined).toString().raw, Object.prototype.toString.call(undefined)); + }); + + }); + +}); diff --git a/test/core.js b/test/core.js new file mode 100644 index 000000000..d81f105d3 --- /dev/null +++ b/test/core.js @@ -0,0 +1,99 @@ +'use strict'; + +describe('Core', function () { + + describe('Global', function () { + + it('should have a toString', function() { + assertEqual(Sugar.toString(), 'Sugar'); + }); + + it('should have a version', function() { + assertMatch(Sugar.VERSION, /^(\d+\.\d+\.\d+|edge)$/); + }); + + }); + + describe('Namespace', function () { + + it('should have a toString', function() { + assertEqual(Sugar.Number.toString(), 'SugarNumber'); + }); + + it('should be able to create a new namespace', function() { + ensureNamespaceNotInitialized('Array', function() { + var namespace = Sugar.createNamespace('Array'); + assertEqual(namespace, Sugar.Array); + assertInstanceOf(namespace.defineInstance, Function); + }); + }); + + it('should not overwrite a created namespace', function() { + ensureNamespaceNotInitialized('Array', function() { + Sugar.createNamespace('Array'); + var oldNamespace = Sugar.Array; + Sugar.createNamespace('Array'); + assertEqual(oldNamespace, Sugar.Array); + }); + }); + + it('should error when namespace is not a built-in', function() { + assertError(function createUnknownNamespace() { + Sugar.createNamespace('Foo'); + }); + }); + + }); + + describe('Defining', function () { + + function alias(name) { + var add = Number(name.charAt(3)); + return function(n) { + return n + add; + } + } + + it('should be able to define static methods', function() { + Sugar.Number.defineStatic('add', add); + assertEqual(Sugar.Number.add(1, 2), 3); + delete Sugar.Number.add; + }); + + it('should be able to define instance methods as static', function() { + Sugar.Number.defineInstance('add', add); + assertEqual(Sugar.Number.add(1, 2), 3); + delete Sugar.Number.add; + }); + + it('should be able to define static with object', function() { + Sugar.Number.defineStatic({ add: add }); + assertEqual(Sugar.Number.add(1, 2), 3); + delete Sugar.Number.add; + }); + + it('should be able to define instance with object', function() { + Sugar.Number.defineInstance({ add: add }); + assertEqual(Sugar.Number.add(1, 2), 3); + delete Sugar.Number.add; + }); + + it('should be able to define static aliases', function() { + Sugar.Number.defineStaticAlias('add1 add2', alias); + assertEqual(Sugar.Number.add1(1), 2); + assertEqual(Sugar.Number.add2(1), 3); + delete Sugar.Number.add1; + delete Sugar.Number.add2; + }); + + it('should be able to define instance aliases', function() { + Sugar.Number.defineInstanceAlias('add1 add2', alias); + assertEqual(Sugar.Number.add1(1), 2); + assertEqual(Sugar.Number.add2(1), 3); + delete Sugar.Number.add1; + delete Sugar.Number.add2; + }); + + }); + +}); diff --git a/test/extended.js b/test/extended.js new file mode 100644 index 000000000..a6c564e5a --- /dev/null +++ b/test/extended.js @@ -0,0 +1,68 @@ +'use strict'; + +fdescribe('Extended', function () { + + // TODO: except vs exclude? + // TODO: defineAlias vs defineSimilar??? + // TODO: how to handle enhanced methods? flags?? defineMathMethods? + // TODO: Sugar.Array.extend({ enhanceArray: false }); + // TODO: document API changes in changelog! + + it('should alias global extend method to all namespaces', function() { + Sugar.extend(); + }); + + it('should allow extending object prototypes', function() { + Sugar.extend({ + dangerousObjectPrototype: true + }); + }); + + it('should allow extending by namespace ??', function() { + Sugar.extend([ + namespaces: [String, Number], + exclude: [String, Number] + ]); + }); + + it('should extend instance methods', function() { + Sugar.Array.extend(); + // assert no non-array methods are extended + }); + + it('should extend specific methods by array argument ??', function() { + Sugar.Number.extend(['add']); + assertEqual((5).add(1,2,3,4,5,6,7,8,9,10), 60); + }); + + it('should accept methods param', function() { + Sugar.Number.extend({ + methods: ['add'] + }); + }); + + it('should accept exclude param', function() { + Sugar.Number.extend({ + exclude: ['add'] + }); + }); + + it('should not extend instance methods', function() { + Sugar.Object.extend(); + }); + + // MORE + it('should extend after global hijacking', function() { + var nativeDate = Date; + function FakeDate() {} + Sugar.Date.defineStatic('foo', function() { return 'foo!'; }); + // Hijacking the global Date object. Sinon does this to allow time mocking + // in tests, so need to support this here. + Date = FakeDate; + Sugar.Date.extend(); + equal(Date.foo(), 'foo!', 'hijacked global is now the target'); + Date = nativeDate; + }); + + +}); diff --git a/test/helpers/methods.js b/test/helpers/methods.js new file mode 100644 index 000000000..3a19a1bfb --- /dev/null +++ b/test/helpers/methods.js @@ -0,0 +1,11 @@ +pass = function(instance, obj) { + return obj; +}; + +add = function(n1, n2) { + return n1 + n2; +}; + +mult = function(n1, n2) { + return n1 * n2; +}; diff --git a/test/helpers/module.js b/test/helpers/module.js new file mode 100644 index 000000000..92d1b3f4e --- /dev/null +++ b/test/helpers/module.js @@ -0,0 +1,29 @@ + +getModuleNamedExports = function(module) { + return Object.keys(module).filter(function(name) { + return name !== 'default'; + }); +} + +getNamespaceMethodNames = function(namespace) { + return Object.keys(namespace); +} + +assertNamedExports = function(module) { + var namespace = module.default; + var methodNames = getModuleNamedExports(module).concat(getNamespaceMethodNames(namespace)); + var asserted = {}; + methodNames.forEach(function(methodName) { + if (asserted[methodName]) { + return; + } + asserted[methodName] = true; + + var exportExists = typeof module[methodName] === 'function'; + var methodExists = typeof namespace[methodName] === 'function'; + + var msg = 'method ' + methodName + ' should be a named export and namespace metho and namespace methodd'; + assertTrue(exportExists && methodExists, msg); + }); +} + diff --git a/test/helpers/namespace.js b/test/helpers/namespace.js new file mode 100644 index 000000000..83ef16121 --- /dev/null +++ b/test/helpers/namespace.js @@ -0,0 +1,10 @@ + +ensureNamespaceNotInitialized = function(name, fn) { + var namespaceExisted = Sugar.hasOwnProperty(name); + var previousNamespace = Sugar[name]; + delete Sugar[name]; + fn(); + if (namespaceExisted) { + Sugar[name] = previousNamespace; + } +}; diff --git a/test/helpers/suite.js b/test/helpers/suite.js new file mode 100644 index 000000000..552a4608e --- /dev/null +++ b/test/helpers/suite.js @@ -0,0 +1,36 @@ + +(function() { + + var currentNamespace; + + function withSuite(describeFn) { + return function(name, suite) { + describeFn(name, function() { + beforeAll(function() { + currentNamespace = Sugar[name]; + }); + afterAll(function() { + currentNamespace = null; + }); + suite(); + }); + } + } + + function withTest(testFn) { + return function(name, test) { + testFn(name, function() { + test(currentNamespace[name]); + }); + } + } + + namespace = withSuite(describe); + fnamespace = withSuite(fdescribe); + xnamespace = withSuite(xdescribe); + + method = withTest(it); + fmethod = withTest(fit); + xmethod = withTest(xit); + +})(); diff --git a/test/index.html b/test/index.html new file mode 100644 index 000000000..b65b1fdc4 --- /dev/null +++ b/test/index.html @@ -0,0 +1,19 @@ + + + + + + + Sugar Tests + + + + + + + + + + + + diff --git a/test/index.js b/test/index.js new file mode 100644 index 000000000..5f3cbe47d --- /dev/null +++ b/test/index.js @@ -0,0 +1,16 @@ +import Sugar from '../src'; + +// Export Sugar to global for tests. +global.Sugar = Sugar; + +// Helpers +import './helpers/suite'; +import './helpers/module'; +import './helpers/methods'; +import './helpers/namespace'; + +// Tests +import './core'; +import './number'; +import './modules'; +import './chainable'; diff --git a/test/modules.js b/test/modules.js new file mode 100644 index 000000000..d421c817f --- /dev/null +++ b/test/modules.js @@ -0,0 +1,19 @@ +'use strict'; + +import * as NumberImport from '../src/number'; + +import absStandalone from '../src/number/abs'; +import roundStandalone from '../src/number/round'; + +describe('Modules', function () { + + it('should have matching named exports', function() { + assertNamedExports(NumberImport); + }); + + it('should have standalone exports', function() { + assertEqual(absStandalone(-5), 5); + assertEqual(roundStandalone(5.25, 1), 5.3); + }); + +}); diff --git a/test/number.js b/test/number.js new file mode 100644 index 000000000..1f025647e --- /dev/null +++ b/test/number.js @@ -0,0 +1,1049 @@ +'use strict'; + +namespace('Number', function () { + + /* + TODO: what about these? + group('Options', function() { + equal(Sugar.Number.getOption('thousands'), ',', 'Thousands should be comma by default'); + equal(Sugar.Number.getOption('decimal'), '.', 'Decimal should be dot by default'); + }); + */ + + method('random', function(random) { + assertOneOf(random(), [0,1]); + assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); + assertOneOf(random(25, 30), [25,26,27,28,29,30]); + assertOneOf(random(30, 25), [25,26,27,28,29,30]); + assertOneOf(random(-5, -2), [-5,-4,-3,-2]); + assertOneOf(random(0, 0), [0]); + }); + + method('round', function(round) { + assertEqual(round(3), 3); + assertEqual(round(3.241), 3); + assertEqual(round(3.752), 4); + assertEqual(round(-3.241), -3); + assertEqual(round(-3.752), -4); + assertEqual(round(3.241, 1), 3.2); + assertEqual(round(3.752, 1), 3.8); + assertEqual(round(3.241, 2), 3.24); + assertEqual(round(3.752, 2), 3.75); + assertEqual(round(322855.241, -2), 322900); + assertEqual(round(322855.241, -3), 323000); + assertEqual(round(322855.241, -4), 320000); + assertEqual(round(322855.241, -6), 0); + assertEqual(round(722855.241, -6), 1000000); + assertEqual(round(722855.241, -8), 0); + }); + + method('ceil', function(ceil) { + assertEqual(ceil(5.5), 6); + assertEqual(ceil(5.14), 6); + assertEqual(ceil(5), 5); + assertEqual(ceil(-5.5), -5); + assertEqual(ceil(-5.14), -5); + assertEqual(ceil(-5), -5); + assertEqual(ceil(4417.1318, 0), 4418); + assertEqual(ceil(4417.1318, 1), 4417.2); + assertEqual(ceil(4417.1318, 2), 4417.14); + assertEqual(ceil(4417.1318, 3), 4417.132); + assertEqual(ceil(4417.1318, -1), 4420); + assertEqual(ceil(4417.1318, -2), 4500); + assertEqual(ceil(4417.1318, -3), 5000); + }); + + method('floor', function(floor) { + assertEqual(floor(5.5), 5); + assertEqual(floor(5.14), 5); + assertEqual(floor(5.9), 5); + assertEqual(floor(5), 5); + assertEqual(floor(-5.5), -6); + assertEqual(floor(-5.14), -6); + assertEqual(floor(-5), -5); + assertEqual(floor(4417.1318, [0]), 4417); + assertEqual(floor(4417.1318, [1]), 4417.1); + assertEqual(floor(4417.1318, [2]), 4417.13); + assertEqual(floor(4417.1318, [3]), 4417.131); + assertEqual(floor(4417.1318, [-1]), 4410); + assertEqual(floor(4417.1318, [-2]), 4400); + assertEqual(floor(4417.1318, [-3]), 4000); + }); + + method('abs', function(abs) { + assertEqual(abs(-5), 5); + assertEqual(abs(5), 5); + assertEqual(abs(-3.324), 3.324); + assertEqual(abs(3.324), 3.324); + }); + + method('pow', function(pow) { + assertEqual(pow(3, [2]), 9); + assertEqual(pow(3, [1]), 3); + assertEqual(pow(12, [2]), 144); + assertEqual(pow(3, [3]), 27); + assertEqual(pow(3, [0]), 1); + assertEqual(pow(3), NaN); + }); + + method('log', function(log) { + assertEqual(log(64, 2), 6); + assertEqual(log(32, 2), 5); + assertEqual(log(16, 2), 4); + assertEqual(log(Math.E), 1); + }); + + method('sin', function(sin) { + assertEqual(sin(0), 0); + assertEqual(sin(Math.PI), 0); + assertEqual(sin(Math.PI / 2), 1); + assertEqual(sin(Math.PI / 4), Math.sqrt(2) / 2); + assertEqual(sin(Math.PI / 6), 0.5); + }); + + method('cos', function(cos) { + assertEqual(cos(0), 1); + assertEqual(cos(Math.PI), -1); + assertEqual(cos(Math.PI / 2), 0); + assertEqual(cos(Math.PI / 4), Math.sqrt(2) / 2); + assertEqual(cos(Math.PI / 6), Math.sqrt(3) / 2); + }); + + method('tan', function(tan) { + assertEqual(tan(0), 0); + assertEqual(tan(Math.PI), 0); + assertEqual(tan(Math.PI / 4), 1); + }); + + method('asin', function(asin) { + assertEqual(asin(0), 0); + assertEqual(asin(1), Math.PI / 2); + }); + + method('acos', function(acos) { + assertEqual(acos(1), 0); + assertEqual(acos(0), Math.PI / 2); + }); + + method('atan', function(atan) { + assertEqual(atan(0), 0); + assertEqual(atan(1), Math.PI / 4); + }); + + method('atan2', function(atan2) { + assertEqual(atan2(0, 0), 0); + assertEqual(atan2(1, 1), Math.PI / 4); + }); + + method('exp', function(exp) { + assertEqual(exp(0), 1); + assertEqual(exp(1), Math.exp(1)); + }); + + method('sqrt', function(sqrt) { + assertEqual(sqrt(9), 3); + assertEqual(sqrt(1024), 32); + }); + + method('toChar', function(toChar) { + assertEqual(toChar(65), 'A'); + assertEqual(toChar(24536), '忘'); + assertEqual(toChar(20294), '但'); + }); + + method('isMultipleOf', function(isMultipleOf) { + assertEqual(isMultipleOf(2, 2), true); + assertEqual(isMultipleOf(6, 2), true); + assertEqual(isMultipleOf(100, 2), true); + assertEqual(isMultipleOf(2, 100), false); + assertEqual(isMultipleOf(100, -2), true); + assertEqual(isMultipleOf(6, -2), true); + assertEqual(isMultipleOf(6, 3), true); + assertEqual(isMultipleOf(7, 3), false); + assertEqual(isMultipleOf(2.5, 1.25), true); + assertEqual(isMultipleOf(2, 'a'), false); + assertEqual(isMultipleOf(2, /af/), false); + assertEqual(isMultipleOf(2, null), false); + assertEqual(isMultipleOf(2), false); + }); + + method('isOdd', function(isOdd) { + assertEqual(isOdd(0), false); + assertEqual(isOdd(1), true); + assertEqual(isOdd(2), false); + assertEqual(isOdd(24), false); + assertEqual(isOdd(200), false); + assertEqual(isOdd(1.1), false); + assertEqual(isOdd(NaN), false); + assertEqual(isOdd(Infinity), false); + assertEqual(isOdd(-Infinity), false); + }); + + method('isEven', function(isEven) { + assertEqual(isEven(0), true); + assertEqual(isEven(1), false); + assertEqual(isEven(2), true); + assertEqual(isEven(24), true); + assertEqual(isEven(200), true); + assertEqual(isEven(1.1), false); + assertEqual(isEven(NaN), false); + assertEqual(isEven(Infinity), false); + assertEqual(isEven(-Infinity), false); + }); + + method('toOrdinal', function(toOrdinal) { + + assertEqual(toOrdinal(1), '1st'); + assertEqual(toOrdinal(2), '2nd'); + assertEqual(toOrdinal(3), '3rd'); + assertEqual(toOrdinal(4), '4th'); + assertEqual(toOrdinal(5), '5th'); + assertEqual(toOrdinal(6), '6th'); + assertEqual(toOrdinal(7), '7th'); + assertEqual(toOrdinal(8), '8th'); + assertEqual(toOrdinal(9), '9th'); + assertEqual(toOrdinal(10), '10th'); + assertEqual(toOrdinal(11), '11th'); + assertEqual(toOrdinal(12), '12th'); + assertEqual(toOrdinal(13), '13th'); + assertEqual(toOrdinal(14), '14th'); + assertEqual(toOrdinal(15), '15th'); + assertEqual(toOrdinal(20), '20th'); + assertEqual(toOrdinal(21), '21st'); + assertEqual(toOrdinal(22), '22nd'); + assertEqual(toOrdinal(23), '23rd'); + assertEqual(toOrdinal(24), '24th'); + assertEqual(toOrdinal(25), '25th'); + assertEqual(toOrdinal(100), '100th'); + assertEqual(toOrdinal(101), '101st'); + assertEqual(toOrdinal(102), '102nd'); + assertEqual(toOrdinal(103), '103rd'); + assertEqual(toOrdinal(104), '104th'); + assertEqual(toOrdinal(105), '105th'); + + assertEqual(toOrdinal(-1), '-1st'); + assertEqual(toOrdinal(-2), '-2nd'); + assertEqual(toOrdinal(-3), '-3rd'); + assertEqual(toOrdinal(-4), '-4th'); + assertEqual(toOrdinal(-5), '-5th'); + + assertError(toOrdinal.bind(null, 0)); + assertError(toOrdinal.bind(null, -0)); + assertError(toOrdinal.bind(null, NaN)); + assertError(toOrdinal.bind(null, null)); + assertError(toOrdinal.bind(null, undefined)); + assertError(toOrdinal.bind(null, Infinity)); + + }); + + method('isInteger', function(isInteger) { + assertEqual(isInteger(15), true); + assertEqual(isInteger(15.2), false); + assertEqual(isInteger(15.2668), false); + assertEqual(isInteger(15.0), true); + assertEqual(isInteger('15'), false); + assertEqual(isInteger('15.8'), false); + }); + + method('isSafeInteger', function(isSafeInteger) { + assertEqual(isSafeInteger(-0), true); + assertEqual(isSafeInteger(0), true); + assertEqual(isSafeInteger(1), true); + assertEqual(isSafeInteger(1e255), false); + assertEqual(isSafeInteger(NaN), false); + assertEqual(isSafeInteger(Infinity), false); + }); + + method('isFinite', function(isFinite) { + assertEqual(isFinite(-0), true); + assertEqual(isFinite(0), true); + assertEqual(isFinite(1), true); + assertEqual(isFinite(1e255), true); + assertEqual(isFinite(NaN), false); + assertEqual(isFinite(Infinity), false); + assertEqual(isFinite(-Infinity), false); + }); + + method('isNaN', function(isNaN) { + assertEqual(isNaN(1), false); + assertEqual(isNaN(NaN), true); + assertEqual(isNaN(Infinity), false); + assertEqual(isNaN(-Infinity), false); + }); + + /* + + method('times', function() { + var count = 0; + var callback = function(first) { + equal(first, count, 'first parameter is the index'); + count++; + return count; + }; + var result = run(5, 'times', [callback]); + equal(result, [1,2,3,4,5], 'result should be the collected return values'); + equal(count, 5, 'iterated 5 times'); + + var fn = function() {}; + var result = run(3, 'times', [fn]); + equal(result, undefined, 'Returning undefined should return nothing'); + + var fn = function(i) { + return i || undefined; + }; + var result = run(3, 'times', [fn]); + equal(result, [1, 2], 'Mixed return values only collects non-undefined'); + + raisesError(function() { run(5, 'times', []); }, 'no callback raises error', TypeError); + }); + + + method('format', function() { + + test(100, '100'); + test(1, '1'); + test(10, '10'); + test(100, '100'); + test(1000, '1,000'); + test(10000, '10,000'); + test(100000, '100,000'); + test(1000000, '1,000,000'); + test(1000000.01, '1,000,000.01'); + test(-100, '-100'); + test(-1, '-1'); + test(-1000, '-1,000'); + test(-1000000.01, '-1,000,000.01'); + test(0.52, '0.52'); + test(9999999.99, '9,999,999.99'); + + // These discrepancies are due to floating point variable limitations. + equal(run(100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '100,046,546,510,000'); + equal(run(-100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '-100,046,546,510,000'); + + Sugar.Number.setOption('thousands', ' '); + Sugar.Number.setOption('decimal', ','); + test(1000, [null, ' '], '1 000', 'with space'); + test(1532587, [null, ' '], '1 532 587', 'larget with space'); + test(1532587.5752, [null, ' ', ','], '1 532 587,5752', 'larger number with decimal'); + + Sugar.Number.setOption('thousands', '.'); + Sugar.Number.setOption('decimal', ','); + test(9999999.99, [null, '.',','], '9.999.999,99', 'Euro style!'); + + Sugar.Number.setOption('thousands', ''); + Sugar.Number.setOption('decimal', '.'); + test(9999999.99, [null, ''], '9999999.99', 'empty string'); + + Sugar.Number.setOption('thousands', ''); + Sugar.Number.setOption('decimal', ''); + test(9999999.99, [null, '', ''], '999999999', 'no punctuation'); + + Sugar.Number.setOption('thousands', null); + Sugar.Number.setOption('decimal', null); + test(9999999.99, [null, '', ''], '9,999,999.99', 'null returns to defaults'); + + withArgs([2], function() { + test(1, '1.00'); + test(10, '10.00'); + test(100, '100.00'); + test(1000, '1,000.00'); + test(10000, '10,000.00'); + test(100000, '100,000.00'); + test(1000000, '1,000,000.00'); + + test(-1, '-1.00'); + test(-10, '-10.00'); + test(-100, '-100.00'); + test(-1000, '-1,000.00'); + test(-10000, '-10,000.00'); + test(-100000, '-100,000.00'); + test(-1000000, '-1,000,000.00'); + + test(2.435, '2.44'); + }); + + withArgs([4], function() { + test(1, '1.0000'); + test(10, '10.0000'); + test(100, '100.0000'); + test(1000, '1,000.0000'); + test(10000, '10,000.0000'); + test(100000, '100,000.0000'); + test(1000000, '1,000,000.0000'); + test(-1, '-1.0000'); + test(-10, '-10.0000'); + test(-100, '-100.0000'); + test(-1000, '-1,000.0000'); + test(-10000, '-10,000.0000'); + test(-100000, '-100,000.0000'); + test(-1000000, '-1,000,000.0000'); + }); + + test(553599.435, [2], '553,599.44', 'to 2 places'); + test(553599.435, [1], '553,599.4', 'to 1 place'); + test(553599.435, [0], '553,599', 'to 0 places'); + test(553599.435, [-1], '553,600', 'to -1 places'); + test(553599.435, [-2], '553,600', 'to -2 places'); + test(553599.435, [-3], '554,000', 'to -3 places'); + test(553599.435, [-4], '550,000', 'to -4 places'); + test(553599.435, [-5], '600,000', 'to -5 places'); + + // Testing object form + Sugar.Number.setOption({ + thousands: 'y' + }); + test(1000, [null, ' '], '1y000', 'y as separator'); + Sugar.Number.setOption({ + thousands: null + }); + + }); + + method('pad', function() { + test(1, [0], '1', '1 no padding'); + test(1, [1], '1', '1 padded to 1 place'); + test(1, [2], '01', '1 padded to 2 places'); + test(1, [3], '001', '1 padded to 3 places'); + test(1, [4], '0001', '1 padded to 4 places'); + test(547, [0], '547', '547 no padding'); + test(547, [1], '547', '547 padded to 1 place'); + test(547, [2], '547', '547 padded to 2 places'); + test(547, [3], '547', '547 padded to 3 places'); + test(547, [4], '0547', '547 padded to 4 places'); + test(0, [0], '0', '0 no padding'); + test(0, [1], '0', '0 padded to 1 place'); + test(0, [2], '00', '0 padded to 2 places'); + test(0, [3], '000', '0 padded to 3 places'); + test(0, [4], '0000', '0 padded to 4 places'); + test(-1, [1], '-1', '-1 padded to 1 places'); + test(-1, [2], '-01', '-1 padded to 2 places'); + test(-1, [3], '-001', '-1 padded to 3 places'); + test(-1, [4], '-0001', '-1 padded to 4 places'); + test(1, [1, true], '+1', '1 padded to 1 places and sign'); + test(1, [2, true], '+01', '1 padded to 2 places and sign'); + test(1, [3, true], '+001', '1 padded to 3 places and sign'); + test(1, [4, true], '+0001', '1 padded to 4 places and sign'); + test(0, [1, true], '+0', '0 padded to 1 place and sign'); + test(547.528, [4], '0547.528', 'does not take decimal places into account'); + + test(255, [4, false, 16], '00ff', 'handles hex'); + test(2, [4, false, 2], '0010', 'handles binary'); + }); + + method('hex', function() { + test(0, '0'); + test(10, 'a'); + test(255, 'ff'); + test(0.5, '0.8'); + test(2.5, '2.8'); + test(2553423, '26f64f'); + + withArgs([2], function() { + test(0, '00'); + test(10, '0a'); + test(255, 'ff'); + test(0.5, '00.8'); + test(2.5, '02.8'); + }); + + withArgs([4], function() { + test(0, '0000'); + test(10, '000a'); + test(255, '00ff'); + test(0.5, '0000.8'); + test(2.5, '0002.8'); + }); + }); + + method('abbr', function() { + test(1, '1'); + test(10, '10'); + test(100, '100'); + test(1000, '1k'); + test(10000, '10k'); + test(100000, '100k'); + test(1000000, '1m'); + test(10000000, '10m'); + test(100000000, '100m'); + test(1000000000, '1b'); + test(10000000000, '10b'); + test(100000000000, '100b'); + test(1000000000000, '1t'); + test(1000000000000000000, '1,000,000t'); + + test(1, '1'); + test(12, '12'); + test(124, '124'); + test(1249, '1k'); + test(1749, '2k'); + test(12495, '12k'); + test(17495, '17k'); + test(124958, '125k'); + test(174958, '175k'); + test(1249584, '1m'); + test(1749584, '2m'); + + withArgs([1], function() { + test(1, '1', 'decimal 1 place | 1'); + test(12, '12', 'decimal 1 place | 12'); + test(124, '124', 'decimal 1 place | 124'); + test(1249, '1.2k', 'decimal 1 place | 1,249'); + test(1749, '1.7k', 'decimal 1 place | 1,749'); + test(12495, '12.5k', 'decimal 1 place | 12,495'); + test(17495, '17.5k', 'decimal 1 place | 17,495'); + test(124958, '125k', 'decimal 1 place | 124,958'); + test(174958, '175k', 'decimal 1 place | 174,958'); + test(1249584, '1.2m', 'decimal 1 place | 1,249,584'); + test(1749584, '1.7m', 'decimal 1 place | 1,749,584'); + }); + + withArgs([2], function() { + test(1, '1', 'decimal 2 places | 1'); + test(12, '12', 'decimal 2 places | 12'); + test(124, '124', 'decimal 2 places | 124'); + test(1249, '1.25k', 'decimal 2 places | 1,249'); + test(1749, '1.75k', 'decimal 2 places | 1,749'); + test(12495, '12.5k', 'decimal 2 places | 12,495'); + test(17495, '17.5k', 'decimal 2 places | 17,495'); + test(124958, '124.96k', 'decimal 2 places | 124,958'); + test(174958, '174.96k', 'decimal 2 places | 174,958'); + test(1249584, '1.25m', 'decimal 2 places | 1,249,584'); + test(1749584, '1.75m', 'decimal 2 places | 1,749,584'); + }); + + withArgs([3], function() { + test(1, '1', 'decimal 3 places | 1'); + test(12, '12', 'decimal 3 places | 12'); + test(124, '124', 'decimal 3 places | 124'); + test(1249, '1.249k', 'decimal 3 places | 1,249'); + test(1749, '1.749k', 'decimal 3 places | 1,749'); + test(12495, '12.495k', 'decimal 3 places | 12,495'); + test(17495, '17.495k', 'decimal 3 places | 17,495'); + test(124958, '124.958k', 'decimal 3 places | 124,958'); + test(174958, '174.958k', 'decimal 3 places | 174,958'); + test(1249584, '1.25m', 'decimal 3 places | 1,249,584'); + test(1749584, '1.75m', 'decimal 3 places | 1,749,584'); + + // Issue #422 + Sugar.Number.setOption('decimal', ','); + test(1749584, '1,75m', 'should respect global decimal marker'); + Sugar.Number.setOption('decimal', null); + }); + + withArgs([-1], function() { + test(1, '0', 'decimal -1 places | 1'); + test(12, '10', 'decimal -1 places | 12'); + test(124, '120', 'decimal -1 places | 124'); + test(1249, '0k', 'decimal -1 places | 1,249'); + test(1749, '0k', 'decimal -1 places | 1,749'); + test(12495, '10k', 'decimal -1 places | 12,495'); + test(17495, '20k', 'decimal -1 places | 17,495'); + test(124958, '120k', 'decimal -1 places | 124,958'); + test(174958, '170k', 'decimal -1 places | 174,958'); + test(1249584, '0m', 'decimal -1 places | 1,249,584'); + test(1749584, '0m', 'decimal -1 places | 1,749,584'); + }); + + test(0.1, '0', '0.1'); + test(0.01, '0', '0.01'); + test(0.001, '0', '0.001'); + test(0.0001, '0', '0.00001'); + test(0.00001, '0', '0.000001'); + test(0.000001, '0', '0.0000001'); + test(0.0000001, '0', '0.00000001'); + test(0.00000001, '0', '0.000000001'); + + test(1.1, '1', '1.1'); + test(1.01, '1', '1.01'); + test(1.001, '1', '1.001'); + test(1.0001, '1', '1.00001'); + test(1.00001, '1', '1.000001'); + test(1.000001, '1', '1.0000001'); + test(1.0000001, '1', '1.00000001'); + test(1.00000001, '1', '1.000000001'); + + test(1000.004, '1k', '1000.004'); + test(10000.004, '10k', '10,000.004'); + test(100000.004, '100k', '100,000.004'); + test(1000000.004, '1m', '1,000,000.004'); + + withArgs([2], function() { + test(1000.004, '1k', '2 places | 1000.004'); + test(10000.004, '10k', '2 places | 10,000.004'); + test(100000.004, '100k', '2 places | 100,000.004'); + test(1000000.004, '1m', '2 places | 1,000,000.004'); + }); + }); + + method('metric', function() { + + test(1, '1'); + test(10, '10'); + test(100, '100'); + test(1000, '1k'); + test(10000, '10k'); + test(100000, '100k'); + test(1000000, '1,000k'); + test(10000000, '10,000k'); + test(100000000, '100,000k'); + test(1000000000, '1,000,000k'); + test(10000000000, '10,000,000k'); + test(100000000000, '100,000,000k'); + test(1000000000000, '1,000,000,000k'); + test(10000000000000, '10,000,000,000k'); + test(100000000000000, '100,000,000,000k'); + test(1000000000000000, '1,000,000,000,000k'); + test(10000000000000000, '10,000,000,000,000k'); + test(100000000000000000, '100,000,000,000,000k'); + + test(1, '1', 'decimal | 1'); + test(12, '12', 'decimal | 12'); + test(124, '124', 'decimal | 124'); + test(1249, '1k', 'decimal | 1,249'); + test(1749, '2k', 'decimal | 1,749'); + test(12495, '12k', 'decimal | 12,495'); + test(17495, '17k', 'decimal | 17,495'); + test(124958, '125k', 'decimal | 124,958'); + test(174958, '175k', 'decimal | 174,958'); + test(1249584, '1,250k', 'decimal | 1,249,584'); + test(1749584, '1,750k', 'decimal | 1,749,584'); + test(1249584000, '1,249,584k', 'decimal | 1,249,584,000'); + test(1749584000, '1,749,584k', 'decimal | 1,749,584,000'); + + test(0.1000000000000, '100m', 'fractional | 0.1'); + test(0.0100000000000, '10m', 'fractional | 0.01'); + test(0.0010000000000, '1m', 'fractional | 0.001'); + test(0.0001000000000, '100μ', 'fractional | 0.0001'); + test(0.0000100000000, '10μ', 'fractional | 0.00001'); + test(0.0000010000000, '1μ', 'fractional | 0.000001'); + test(0.0000001000000, '100n', 'fractional | 0.0000001'); + test(0.0000000100000, '10n', 'fractional | 0.00000001'); + test(0.0000000010000, '1n', 'fractional | 0.000000001'); + test(0.0000000001000, '0.1n', 'fractional | 0.0000000001'); + test(0.0000000000100, '0.01n', 'fractional | 0.00000000001'); + test(0.0000000000010, '0.001n', 'fractional | 0.000000000001'); + test(0.0000000000001, '0.0001n', 'fractional | 0.0000000000001'); + + test(0.1111111111111, '111m', 'fractional | 0 places | 0.1111111111111'); + test(0.0111111111111, '11m', 'fractional | 0 places | 0.0111111111111'); + test(0.0011111111111, '1m', 'fractional | 0 places | 0.0011111111111'); + test(0.0001111111111, '111μ', 'fractional | 0 places | 0.0001111111111'); + test(0.0000111111111, '11μ', 'fractional | 0 places | 0.0000111111111'); + test(0.0000011111111, '1μ', 'fractional | 0 places | 0.0000011111111'); + test(0.0000001111111, '111n', 'fractional | 0 places | 0.0000001111111'); + test(0.0000000111111, '11n', 'fractional | 0 places | 0.0000000111111'); + test(0.0000000011111, '1n', 'fractional | 0 places | 0.0000000011111'); + test(0.0000000001111, '0.1n', 'fractional | 0 places | 0.0000000001111'); + test(0.0000000000111, '0.01n', 'fractional | 0 places | 0.0000000000111'); + test(0.0000000000011, '0.001n', 'fractional | 0 places | 0.0000000000011'); + test(0.0000000000001, '0.0001n', 'fractional | 0 places | 0.0000000000001'); + + test(0.000000000000000001, '1e-9n', 'fractional | 0 places | 0.0000000000001'); + + test(1.1111111111111, '1', 'fractional | 0 places | 1.1111111111111'); + test(1.0111111111111, '1', 'fractional | 0 places | 1.0111111111111'); + test(1.0011111111111, '1', 'fractional | 0 places | 1.0011111111111'); + test(1.0001111111111, '1', 'fractional | 0 places | 1.0001111111111'); + test(1.0000111111111, '1', 'fractional | 0 places | 1.0000111111111'); + test(1.0000011111111, '1', 'fractional | 0 places | 1.0000011111111'); + test(1.0000001111111, '1', 'fractional | 0 places | 1.0000001111111'); + test(1.0000000111111, '1', 'fractional | 0 places | 1.0000000111111'); + test(1.0000000011111, '1', 'fractional | 0 places | 1.0000000011111'); + test(1.0000000001111, '1', 'fractional | 0 places | 1.0000000001111'); + test(1.0000000000111, '1', 'fractional | 0 places | 1.0000000000111'); + test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); + + test(1.1000000000001, '1', 'fractional | 0 places | 1.1000000000001'); + test(1.0100000000001, '1', 'fractional | 0 places | 1.0100000000001'); + test(1.0010000000001, '1', 'fractional | 0 places | 1.0010000000001'); + test(1.0001000000001, '1', 'fractional | 0 places | 1.0001000000001'); + test(1.0000100000001, '1', 'fractional | 0 places | 1.0000100000001'); + test(1.0000010000001, '1', 'fractional | 0 places | 1.0000010000001'); + test(1.0000001000001, '1', 'fractional | 0 places | 1.0000001000001'); + test(1.0000000100001, '1', 'fractional | 0 places | 1.0000000100001'); + test(1.0000000010001, '1', 'fractional | 0 places | 1.0000000010001'); + test(1.0000000001001, '1', 'fractional | 0 places | 1.0000000001001'); + test(1.0000000000101, '1', 'fractional | 0 places | 1.0000000000101'); + test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); + + withArgs([0, 'all'], function() { + test(10000000, '10M'); + test(100000000, '100M'); + test(1000000000, '1G'); + test(10000000000, '10G'); + test(100000000000, '100G'); + test(1000000000000, '1T'); + test(10000000000000, '10T'); + test(100000000000000, '100T'); + test(1000000000000000, '1P'); + test(10000000000000000, '10P'); + test(100000000000000000, '100P'); + + test(1, '1', 'decimal | 1'); + test(12, '12', 'decimal | 12'); + test(124, '124', 'decimal | 124'); + test(1249, '1K', 'decimal | 1,249'); + test(1749, '2K', 'decimal | 1,749'); + test(12495, '12K', 'decimal | 12,495'); + test(17495, '17K', 'decimal | 17,495'); + test(124958, '125K', 'decimal | 124,958'); + test(174958, '175K', 'decimal | 174,958'); + test(1249584, '1M', 'decimal | 1,249,584'); + test(1749584, '2M', 'decimal | 1,749,584'); + test(1249584000, '1G', 'decimal | 1,249,584,000'); + test(1749584000, '2G', 'decimal | 1,749,584,000'); + }); + + withArgs([1], function() { + test(1, '1', 'decimal 1 place | 1'); + test(12, '12', 'decimal 1 place | 12'); + test(124, '124', 'decimal 1 place | 124'); + test(1249, '1.2k', 'decimal 1 place | 1,249'); + test(1749, '1.7k', 'decimal 1 place | 1,749'); + test(12495, '12.5k', 'decimal 1 place | 12,495'); + test(17495, '17.5k', 'decimal 1 place | 17,495'); + test(124958, '125k', 'decimal 1 place | 124,958'); + test(174958, '175k', 'decimal 1 place | 174,958'); + test(1249584, '1,249.6k', 'decimal 1 place | 1,249,584'); + + // Issue #422 + Sugar.Number.setOption('decimal', ','); + test(3232, [1], '3,2k', 'should respect global decimal marker'); + Sugar.Number.setOption('decimal', null); + }); + + withArgs([1, 'all'], function() { + test(1, '1', 'decimal 1 place | 1'); + test(12, '12', 'decimal 1 place | 12'); + test(124, '124', 'decimal 1 place | 124'); + test(1249, '1.2K', 'decimal 1 place | 1,249'); + test(1749, '1.7K', 'decimal 1 place | 1,749'); + test(12495, '12.5K', 'decimal 1 place | 12,495'); + test(17495, '17.5K', 'decimal 1 place | 17,495'); + test(124958, '125K', 'decimal 1 place | 124,958'); + test(174958, '175K', 'decimal 1 place | 174,958'); + test(1249584, '1.2M', 'decimal 1 place | 1,249,584'); + test(1749584, '1.7M', 'decimal 1 place | 1,749,584'); + test(1249584000, '1.2G', 'decimal 1 place | 1,249,584,000'); + test(1749584000, '1.7G', 'decimal 1 place | 1,749,584,000'); + }); + + withArgs([2], function() { + test(1, '1', 'decimal 2 places | 1'); + test(12, '12', 'decimal 2 places | 12'); + test(124, '124', 'decimal 2 places | 124'); + test(1249, '1.25k', 'decimal 2 places | 1,249'); + test(1749, '1.75k', 'decimal 2 places | 1,749'); + test(12495, '12.5k', 'decimal 2 places | 12,495'); + test(17495, '17.5k', 'decimal 2 places | 17,495'); + test(124958, '124.96k', 'decimal 2 places | 124,958'); + test(174958, '174.96k', 'decimal 2 places | 174,958'); + test(1249584, '1,249.58k', 'decimal 2 places | 1,249,584'); + }); + + withArgs([2, 'all'], function() { + test(1, '1', 'decimal 2 places | 1'); + test(12, '12', 'decimal 2 places | 12'); + test(124, '124', 'decimal 2 places | 124'); + test(1249, '1.25K', 'decimal 2 places | 1,249'); + test(1749, '1.75K', 'decimal 2 places | 1,749'); + test(12495, '12.5K', 'decimal 2 places | 12,495'); + test(17495, '17.5K', 'decimal 2 places | 17,495'); + test(124958, '124.96K', 'decimal 2 places | 124,958'); + test(174958, '174.96K', 'decimal 2 places | 174,958'); + test(1249584, '1.25M', 'decimal 2 places | 1,249,584'); + test(1749584, '1.75M', 'decimal 2 places | 1,749,584'); + test(1249584000, '1.25G', 'decimal 2 places | 1,249,584,000'); + test(1749584000, '1.75G', 'decimal 2 places | 1,749,584,000'); + }); + + withArgs([3], function() { + test(1, '1', 'decimal 3 places | 1'); + test(12, '12', 'decimal 3 places | 12'); + test(124, '124', 'decimal 3 places | 124'); + test(1249, '1.249k', 'decimal 3 places | 1,249'); + test(1749, '1.749k', 'decimal 3 places | 1,749'); + test(12495, '12.495k', 'decimal 3 places | 12,495'); + test(17495, '17.495k', 'decimal 3 places | 17,495'); + test(124958, '124.958k', 'decimal 3 places | 124,958'); + test(174958, '174.958k', 'decimal 3 places | 174,958'); + test(1249584, '1,249.584k', 'decimal 3 places | 1,249,584'); + }); + + withArgs([3, 'all'], function() { + test(1, '1', 'decimal 3 places | 1'); + test(12, '12', 'decimal 3 places | 12'); + test(124, '124', 'decimal 3 places | 124'); + test(1249, '1.249K', 'decimal 3 places | 1,249'); + test(1749, '1.749K', 'decimal 3 places | 1,749'); + test(12495, '12.495K', 'decimal 3 places | 12,495'); + test(17495, '17.495K', 'decimal 3 places | 17,495'); + test(124958, '124.958K', 'decimal 3 places | 124,958'); + test(174958, '174.958K', 'decimal 3 places | 174,958'); + test(1249584, '1.25M', 'decimal 3 places | 1,249,584'); + test(1749584, '1.75M', 'decimal 3 places | 1,749,584'); + test(1249584000, '1.25G', 'decimal 3 places | 1,249,584,000'); + test(1749584000, '1.75G', 'decimal 3 places | 1,749,584,000'); + }); + + withArgs([-1], function() { + test(1, '0', 'decimal -1 places | 1'); + test(12, '10', 'decimal -1 places | 12'); + test(124, '120', 'decimal -1 places | 124'); + test(1249, '0k', 'decimal -1 places | 1,249'); + test(1749, '0k', 'decimal -1 places | 1,749'); + test(12495, '10k', 'decimal -1 places | 12,495'); + test(17495, '20k', 'decimal -1 places | 17,495'); + test(124958, '120k', 'decimal -1 places | 124,958'); + test(174958, '170k', 'decimal -1 places | 174,958'); + test(1249584, '1,250k', 'decimal -1 places | 1,249,584'); + }); + + withArgs([-1, 'all'], function() { + test(1, '0', 'decimal -1 places | 1'); + test(12, '10', 'decimal -1 places | 12'); + test(124, '120', 'decimal -1 places | 124'); + test(1249, '0K', 'decimal -1 places | 1,249'); + test(1749, '0K', 'decimal -1 places | 1,749'); + test(12495, '10K', 'decimal -1 places | 12,495'); + test(17495, '20K', 'decimal -1 places | 17,495'); + test(124958, '120K', 'decimal -1 places | 124,958'); + test(174958, '170K', 'decimal -1 places | 174,958'); + test(1249584, '0M', 'decimal -1 places | 1,249,584'); + test(1749584, '0M', 'decimal -1 places | 1,749,584'); + test(1249584000, '0G', 'decimal -1 places | 1,249,584,000'); + test(1749584000, '0G', 'decimal -1 places | 1,749,584,000'); + }); + + withArgs([2], function() { + test(0.1111111111111, '111.11m', 'fractional | 2 places | 0.1111111111111'); + test(0.0111111111111, '11.11m', 'fractional | 2 places | 0.0111111111111'); + test(0.0011111111111, '1.11m', 'fractional | 2 places | 0.0011111111111'); + test(0.0001111111111, '111.11μ', 'fractional | 2 places | 0.0001111111111'); + test(0.0000111111111, '11.11μ', 'fractional | 2 places | 0.0000111111111'); + test(0.0000011111111, '1.11μ', 'fractional | 2 places | 0.0000011111111'); + test(0.0000001111111, '111.11n', 'fractional | 2 places | 0.0000001111111'); + test(0.0000000111111, '11.11n', 'fractional | 2 places | 0.0000000111111'); + test(0.0000000011111, '1.11n', 'fractional | 2 places | 0.0000000011111'); + test(0.0000000001111, '0.1n', 'fractional | 2 places | 0.0000000001111'); + test(0.0000000000111, '0.01n', 'fractional | 2 places | 0.0000000000111'); + test(0.0000000000011, '0.001n', 'fractional | 2 places | 0.0000000000011'); + test(0.0000000000001, '0.0001n', 'fractional | 2 places | 0.0000000000001'); + + test(1.1111111111111, '1.11', 'fractional | 2 places | 1.1111111111111'); + test(1.0111111111111, '1.01', 'fractional | 2 places | 1.0111111111111'); + test(1.0011111111111, '1', 'fractional | 2 places | 1.0011111111111'); + test(1.0001111111111, '1', 'fractional | 2 places | 1.0001111111111'); + test(1.0000111111111, '1', 'fractional | 2 places | 1.0000111111111'); + test(1.0000011111111, '1', 'fractional | 2 places | 1.0000011111111'); + test(1.0000001111111, '1', 'fractional | 2 places | 1.0000001111111'); + test(1.0000000111111, '1', 'fractional | 2 places | 1.0000000111111'); + test(1.0000000011111, '1', 'fractional | 2 places | 1.0000000011111'); + test(1.0000000001111, '1', 'fractional | 2 places | 1.0000000001111'); + test(1.0000000000111, '1', 'fractional | 2 places | 1.0000000000111'); + test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); + + test(1.1000000000001, '1.1', 'fractional | 2 places | 1.1000000000001'); + test(1.0100000000001, '1.01', 'fractional | 2 places | 1.0100000000001'); + test(1.0010000000001, '1', 'fractional | 2 places | 1.0010000000001'); + test(1.0001000000001, '1', 'fractional | 2 places | 1.0001000000001'); + test(1.0000100000001, '1', 'fractional | 2 places | 1.0000100000001'); + test(1.0000010000001, '1', 'fractional | 2 places | 1.0000010000001'); + test(1.0000001000001, '1', 'fractional | 2 places | 1.0000001000001'); + test(1.0000000100001, '1', 'fractional | 2 places | 1.0000000100001'); + test(1.0000000010001, '1', 'fractional | 2 places | 1.0000000010001'); + test(1.0000000001001, '1', 'fractional | 2 places | 1.0000000001001'); + test(1.0000000000101, '1', 'fractional | 2 places | 1.0000000000101'); + test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); + }); + + equal(run(0.0001) + 'm', '100μm', '100μm'); + equal(run(0.001) + 'm', '1mm', '1mm'); + equal(run(0.01) + 'm', '10mm', '10mm'); + equal(run(0.1) + 'm', '100mm', '100mm'); + equal(run(1) + 'm', '1m', '1m'); + equal(run(1000) + 'm', '1km', '1km'); + equal(run(1000000) + 'm', '1,000km', '1,000km'); + equal(run(1000000000) + 'm', '1,000,000km', '1,000,000km'); + + withArgs([0, '|'], function() { + equal(run(1000000000) + 'm', '1,000,000,000m', 'limited to meters | 1,000,000,000m'); + equal(run(1000000) + 'm', '1,000,000m', 'limited to meters | 1,000,000m'); + equal(run(1000) + 'm', '1,000m', 'limited to meters | 1,000m'); + equal(run(1) + 'm', '1m', 'limited to meters | 1m'); + }); + + test(12334.5880, '12k', 'fractional | 0 places | 12334.5880'); + test(12334.5880, [3], '12.335k', 'fractional | 3 places | 12334.5880'); + test(.588500, [9], '588.5m', 'fractional | 9 places | .5885'); + test(.580085, [9], '580.085m', 'fractional | 9 places | .580085'); + test(.580085, [7], '580.085m', 'fractional | 7 places | .580085'); + test(.580085, [5], '580.085m', 'fractional | 5 places | .580085'); + test(.580085, [3], '580.085m', 'fractional | 3 places | .580085'); + test(.580085, [1], '580.1m', 'fractional | 1 places | .580085'); + test(12323.424558, [3, '|'], '12,323.425', 'limited and 3 decimals'); + + equal(run(1, 'metric', [0, '']) + 'm', '1m', 'no format uses short'); + equal(run(1000, 'metric', [0, '|']) + 'm', '1,000m', 'simple placeholder limits'); + + equal(run(1, 'metric', [0, 'm']) + 'm', '1,000mm', 'millimeter max'); + equal(run(1, 'metric', [0, 'μ_']) + 'm', '1,000,000μm', 'micrometer max'); + equal(run(1, 'metric', [0, 'n__']) + 'm', '1,000,000,000nm', 'nanometer max'); + equal(run(1, 'metric', [3, '_k']) + 'm', '0.001km', 'kilometer min'); + + equal(run(0.0000001, 'metric', [0, 'nμ_']) + 'm', '100nm', '100nm with micrometer max'); + equal(run(0.0001, 'metric', [0, 'nμ_']) + 'm', '100μm', '100μm with micrometer max'); + + equal(run(1000000, 'metric', [3, '_KG']) + 'W', '1GW', 'minimum can format higher'); + }); + + method('bytes', function() { + + test(1, '1B', 'default | 1B '); + test(10, '10B', 'default | 10B '); + test(100, '100B', 'default | 100B '); + test(1000, '1KB', 'default | 1KB '); + test(10000, '10KB', 'default | 10KB '); + test(100000, '100KB', 'default | 100KB'); + test(1000000, '1MB', 'default | 1MB '); + test(10000000, '10MB', 'default | 10MB '); + test(100000000, '100MB', 'default | 100MB'); + test(1000000000, '1GB', 'default | 1GB '); + test(10000000000, '10GB', 'default | 10GB '); + test(100000000000, '100GB', 'default | 100GB'); + test(1000000000000, '1TB', 'default | 1TB '); + test(10000000000000, '10TB', 'default | 10TB '); + test(100000000000000, '100TB', 'default | 100TB'); + test(1000000000000000, '1PB', 'default | 1PB '); + test(10000000000000000, '10PB', 'default | 10PB '); + test(100000000000000000, '100PB', 'default | 100PB'); + + withArgs([2], function() { + test(1, '1B', '2 places | 1B '); + test(10, '10B', '2 places | 10B '); + test(100, '100B', '2 places | 100B '); + test(1000, '1KB', '2 places | 1KB '); + test(10000, '10KB', '2 places | 10KB '); + test(100000, '100KB', '2 places | 100KB'); + test(1000000, '1MB', '2 places | 1MB '); + test(10000000, '10MB', '2 places | 10MB '); + test(100000000, '100MB', '2 places | 100MB'); + test(1000000000, '1GB', '2 places | 1GB '); + test(10000000000, '10GB', '2 places | 10GB '); + test(100000000000, '100GB', '2 places | 100GB'); + test(1000000000000, '1TB', '2 places | 1TB '); + test(10000000000000, '10TB', '2 places | 10TB '); + test(100000000000000, '100TB', '2 places | 100TB'); + test(1000000000000000, '1PB', '2 places | 1PB '); + test(10000000000000000, '10PB', '2 places | 10PB '); + test(100000000000000000, '100PB', '2 places | 100PB'); + }); + + withArgs([0, true], function() { + test(1, '1B', '0 places | base 2 | 1B '); + test(10, '10B', '0 places | base 2 | 10B '); + test(100, '100B', '0 places | base 2 | 100B '); + test(1000, '1KiB', '0 places | base 2 | 1KiB '); + test(10000, '10KiB', '0 places | base 2 | 10KiB '); + test(100000, '98KiB', '0 places | base 2 | 100KiB'); + test(1000000, '1MiB', '0 places | base 2 | 1MiB '); + test(10000000, '10MiB', '0 places | base 2 | 10MiB '); + test(100000000, '95MiB', '0 places | base 2 | 100MiB'); + test(1000000000, '1GiB', '0 places | base 2 | 1GiB '); + test(10000000000, '9GiB', '0 places | base 2 | 10GiB '); + test(100000000000, '93GiB', '0 places | base 2 | 100GiB'); + test(1000000000000, '1TiB', '0 places | base 2 | 1TiB '); + test(10000000000000, '9TiB', '0 places | base 2 | 10TiB '); + test(100000000000000, '91TiB', '0 places | base 2 | 100TiB'); + test(1000000000000000, '1PiB', '0 places | base 2 | 1PiB '); + test(10000000000000000, '9PiB', '0 places | base 2 | 10PiB '); + test(100000000000000000, '89PiB', '0 places | base 2 | 100PiB'); + }); + + withArgs([2, true], function() { + + test(1, '1B', '2 places | base 2 | 1B '); + test(10, '10B', '2 places | base 2 | 10B '); + test(100, '100B', '2 places | base 2 | 100B '); + test(1000, '0.98KiB', '2 places | base 2 | 1KB '); + test(10000, '9.77KiB', '2 places | base 2 | 10KB '); + test(100000, '97.66KiB', '2 places | base 2 | 100KB'); + test(1000000, '0.95MiB', '2 places | base 2 | 1MB '); + test(10000000, '9.54MiB', '2 places | base 2 | 10MB '); + test(100000000, '95.37MiB', '2 places | base 2 | 100MB'); + test(1000000000, '0.93GiB', '2 places | base 2 | 1GB '); + test(10000000000, '9.31GiB', '2 places | base 2 | 10GB '); + test(100000000000, '93.13GiB', '2 places | base 2 | 100GB'); + test(1000000000000, '0.91TiB', '2 places | base 2 | 1TB '); + test(10000000000000, '9.09TiB', '2 places | base 2 | 10TB '); + test(100000000000000, '90.95TiB', '2 places | base 2 | 100TB'); + test(1000000000000000, '0.89PiB', '2 places | base 2 | 1PB '); + test(10000000000000000, '8.88PiB', '2 places | base 2 | 10PB '); + test(100000000000000000, '88.82PiB', '2 places | base 2 | 100PB'); + + // Issue #422 + Sugar.Number.setOption('decimal', ','); + test(1000, '0,98KiB', 'should respect global decimal'); + Sugar.Number.setOption('decimal', null); + + }); + + withArgs([0, true, 'si'], function() { + test(1, '1B', 'base 2 with si units | 1B '); + test(10, '10B', 'base 2 with si units | 10B '); + test(100, '100B', 'base 2 with si units | 100B '); + test(1000, '1KB', 'base 2 with si units | 1KB '); + test(10000, '10KB', 'base 2 with si units | 10KB '); + test(100000, '98KB', 'base 2 with si units | 100KB'); + test(1000000, '1MB', 'base 2 with si units | 1MB '); + test(10000000, '10MB', 'base 2 with si units | 10MB '); + test(100000000, '95MB', 'base 2 with si units | 100MB'); + test(1000000000, '1GB', 'base 2 with si units | 1GB '); + test(10000000000, '9GB', 'base 2 with si units | 10GB '); + test(100000000000, '93GB', 'base 2 with si units | 100GB'); + test(1000000000000, '1TB', 'base 2 with si units | 1TB '); + test(10000000000000, '9TB', 'base 2 with si units | 10TB '); + test(100000000000000, '91TB', 'base 2 with si units | 100TB'); + test(1000000000000000, '1PB', 'base 2 with si units | 1PB '); + test(10000000000000000, '9PB', 'base 2 with si units | 10PB '); + test(100000000000000000, '89PB', 'base 2 with si units | 100PB'); + }); + + withArgs([0, false, 'binary'], function() { + + test(1, '1B', 'base 10 with binary units | 1B '); + test(10, '10B', 'base 10 with binary units | 10B '); + test(100, '100B', 'base 10 with binary units | 100B '); + test(1000, '1KiB', 'base 10 with binary units | 1KiB '); + test(10000, '10KiB', 'base 10 with binary units | 10KiB '); + test(100000, '100KiB', 'base 10 with binary units | 100KiB'); + test(1000000, '1MiB', 'base 10 with binary units | 1MiB '); + test(10000000, '10MiB', 'base 10 with binary units | 10MiB '); + test(100000000, '100MiB', 'base 10 with binary units | 100MiB'); + test(1000000000, '1GiB', 'base 10 with binary units | 1GiB '); + test(10000000000, '10GiB', 'base 10 with binary units | 10GiB '); + test(100000000000, '100GiB', 'base 10 with binary units | 100GiB'); + test(1000000000000, '1TiB', 'base 10 with binary units | 1TiB '); + test(10000000000000, '10TiB', 'base 10 with binary units | 10TiB '); + test(100000000000000, '100TiB', 'base 10 with binary units | 100TiB'); + test(1000000000000000, '1PiB', 'base 10 with binary units | 1PiB '); + test(10000000000000000, '10PiB', 'base 10 with binary units | 10PiB '); + test(100000000000000000, '100PiB', 'base 10 with binary units | 100PiB'); + + }); + + test(1024, [0, true], '1KiB', '1024 bytes is 1KiB'); + test(1048576, [0, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); + test(1024, [2, true], '1KiB', '2 places | 1024 bytes is 1KiB'); + test(1048576, [2, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); + + test(Math.pow(10, 16), [0, true], '9PiB', '10 ^ 16 bytes'); + test(Math.pow(10, 16), [-2, true], '0PiB', '10 ^ 16 bytes | -2 places'); + }); + */ + +}); diff --git a/test/tests/core.js b/test/tests/core.js index de37823c5..c0d79d3cc 100644 --- a/test/tests/core.js +++ b/test/tests/core.js @@ -1,650 +1,3 @@ namespace('Core', function() { 'use strict'; - - function defineCustom(target) { - var methods = { - foo: function() { - return 'foo!'; - }, - bar: function() { - return 'bar!'; - }, - moo: function() { - return 'moo!'; - } - }; - target.defineInstance(methods); - } - - setup(function() { - storeNativeState(); - }); - - teardown(function() { - restoreNativeState(); - }); - - group('Core toString behavior', function () { - equal(Sugar.toString(), 'Sugar', 'Global toString should return "Sugar"'); - }); - - - group('Sugar namespace', function () { - Sugar(); - assertAllMethodsMappedToNative(['Array', 'Boolean', 'Number', 'String', 'Date', 'RegExp', 'Function']); - assertStaticMethodsMappedToNative(['Object']); - assertInstanceMethodsNotMappedToNative(['Object']); - }); - - group('Sugar extend', function () { - var result = Sugar.extend(); - equal(result, Sugar, 'Return value should be the global object'); - assertAllMethodsMappedToNative(['Array', 'Boolean', 'Number', 'String', 'Date', 'RegExp', 'Function']); - assertStaticMethodsMappedToNative(['Object']); - assertInstanceMethodsNotMappedToNative(['Object']); - }); - - group('Sugar Array extend', function () { - Sugar.Array.extend(); - assertAllMethodsMappedToNative(['Array']); - assertNoMethodsMappedToNative(['Object', 'Boolean', 'Number', 'String', 'Date', 'RegExp', 'Function']); - }); - - group('Sugar Date extend', function () { - Sugar.Date.extend(); - assertAllMethodsMappedToNative(['Date']); - assertNoMethodsMappedToNative(['Array', 'Object', 'Boolean', 'Number', 'String', 'RegExp', 'Function']); - }); - - group('Sugar Object extend', function () { - Sugar.Object.extend(); - assertStaticMethodsMappedToNative(['Object']); - assertInstanceMethodsNotMappedToNative(['Object']); - assertNoMethodsMappedToNative(['Array', 'Boolean', 'Number', 'Date', 'String', 'RegExp', 'Function']); - }); - - group('Sugar Object namespace full', function () { - Sugar.Object.extend({ - objectPrototype: true - }); - assertAllMethodsMappedToNative(['Object']); - assertNoMethodsMappedToNative(['Array', 'Boolean', 'Number', 'Date', 'String', 'RegExp', 'Function']); - }); - - group('Sugar Object extend full', function () { - Sugar.Object.extend({ - objectPrototype: true - }); - assertAllMethodsMappedToNative(['Object']); - assertNoMethodsMappedToNative(['Array', 'Boolean', 'Number', 'Date', 'String', 'RegExp', 'Function']); - }); - - group('Extend return values', function () { - equal(Sugar.extend(), Sugar, 'Global extend should return Sugar'); - equal(Sugar.String.extend(), Sugar.String, 'Namespace extend should return the namespace'); - }); - - group('Custom with no arguments', function () { - Sugar.String.defineInstance({ - foo: function() { - return 'foo!'; - } - }); - equal(Sugar.String.foo(), 'foo!', 'Namespace method exists'); - equal(String.prototype.foo, undefined, 'Instance method is undefined'); - Sugar.String.extend('foo'); - equal('wasabi'.foo(), 'foo!', 'Instance method is mapped'); - }); - - group('Custom with 1 argument', function () { - Sugar.String.defineInstance({ - foo: function(str) { - return str + 'foo!'; - } - }); - equal(Sugar.String.foo('wasabi'), 'wasabifoo!', 'Namespace method exists'); - Sugar.String.extend('foo'); - equal('wasabi'.foo(), 'wasabifoo!', 'Instance method is mapped'); - }); - - group('Custom with 2 arguments', function () { - Sugar.String.defineInstance({ - foo: function(str, a) { - return str + '|' + a; - } - }); - equal(Sugar.String.foo('foo', '1'), 'foo|1', 'Namespace method exists'); - Sugar.String.extend('foo'); - equal('foo'.foo('1'), 'foo|1', 'Instance method is mapped'); - }); - - group('Custom with 3 arguments', function () { - Sugar.String.defineInstance({ - foo: function(str, a, b) { - return str + '|' + a + '|' + b; - } - }); - equal(Sugar.String.foo('foo', '1', '2'), 'foo|1|2', 'Namespace method exists'); - Sugar.String.extend('foo'); - equal('foo'.foo('1', '2'), 'foo|1|2', 'Instance method is mapped'); - }); - - group('Custom with 4 arguments', function () { - Sugar.String.defineInstance({ - foo: function(str, a, b, c) { - return str + '|' + a + '|' + b + '|' + c; - } - }); - equal(Sugar.String.foo('foo', '1', '2', '3'), 'foo|1|2|3', 'Namespace method exists'); - Sugar.String.extend('foo'); - equal('foo'.foo('1', '2', '3'), 'foo|1|2|3', 'Instance method is mapped'); - }); - - group('Custom with 5 arguments', function () { - Sugar.String.defineInstance({ - foo: function(str, a, b, c, d) { - return str + '|' + a + '|' + b + '|' + c + '|' + d; - } - }); - equal(Sugar.String.foo('foo', '1', '2', '3', '4'), 'foo|1|2|3|4', 'Namespace method exists'); - Sugar.String.extend('foo'); - equal('foo'.foo('1', '2', '3', '4'), 'foo|1|2|3|4', 'Instance method is mapped'); - }); - - group('Custom beyond argument limit', function () { - // An instance object + 4 arguments should be the maximum allowed curried arguments - // for methods defined in Sugar. Beyond this limit, methods will not be mapped to prototypes. - Sugar.String.defineInstance({ - foo: function(str, a, b, c, d, e) { - return str + '|' + a + '|' + b + '|' + c + '|' + d + '|' + e; - } - }); - equal(Sugar.String.foo('foo', '1', '2', '3', '4', '5'), 'foo|1|2|3|4|5', '5 argument method is still mapped to global'); - Sugar.String.extend('foo'); - raisesError(function() { 'foo'.foo('1', '2', '3', '4', '5'); }, 'Instance method with 5 arguments will not be mapped to prototype'); - }); - - group('Can define single', function () { - Sugar.String.defineInstance('foo', function(str) { - return str + ' + you!'; - }); - equal(Sugar.String.foo('wasabi'), 'wasabi + you!', 'Namespace method exists'); - Sugar.String.extend('foo'); - equal('wasabi'.foo(), 'wasabi + you!', 'Instance method is mapped'); - }); - - group('Custom Methods after extending', function () { - Sugar.String.extend(); - defineCustom(Sugar.String); - equal(Sugar.String.foo(), 'foo!', 'Namespace method exists when defined after namespace extend'); - equal('wasabi'.foo(), 'foo!', 'Instance method exists when defined after namespace extend'); - }); - - group('Will not extend to Object.prototype after namespace extend', function () { - defineCustom(Sugar.Object); - equal(({}).foo, undefined, 'foo has not been mapped'); - }); - - group('Will extend to Object.prototype after namespace extend', function () { - Sugar.Object.extend({ - objectPrototype: true - }); - defineCustom(Sugar.Object); - equal(({}).foo(), 'foo!', 'foo has been mapped'); - }); - - group('Will extend to Object.prototype on global call with true', function () { - Sugar({ - objectPrototype: true - }); - defineCustom(Sugar.Object); - equal(({}).foo(), 'foo!', 'foo has been mapped'); - }); - - group('Will extend to Object.prototype on global extend with true', function () { - Sugar.extend({ - objectPrototype: true - }); - defineCustom(Sugar.Object); - equal(({}).foo(), 'foo!', 'foo has been mapped'); - }); - - group('Can extend single method to Object without prototype extension', function () { - Sugar.Object.defineStatic('foo', function() { return 'foo!'; }); - Sugar.Object.defineStatic('bar', function() { return 'foo!'; }); - Sugar.Object.extend({ - methods: ['foo'] - }); - equal(Object.foo(), 'foo!', 'foo static has been mapped'); - equal(Object.bar, undefined, 'bar static has not been mapped'); - equal(Object.moo, undefined, 'moo static has not been mapped'); - equal(({}).foo, undefined, 'foo instance has not been mapped'); - equal(({}).bar, undefined, 'bar instance has not been mapped'); - equal(({}).moo, undefined, 'moo instance has not been mapped'); - }); - - group('Can extend single method to Object.prototype', function () { - defineCustom(Sugar.Object); - Sugar.Object.extend({ - methods: ['foo'], - objectPrototype: true - }); - equal(Object.foo(), 'foo!', 'foo static has been mapped'); - equal(Object.bar, undefined, 'bar static has not been mapped'); - equal(Object.moo, undefined, 'moo static has not been mapped'); - equal(({}).foo(), 'foo!', 'foo has been mapped'); - equal(({}).bar, undefined, 'bar has not been mapped'); - equal(({}).moo, undefined, 'moo has not been mapped'); - }); - - group('Extending specific namespaces by array', function() { - Sugar.String.defineInstance('foo', function() { return 'foo!'; }); - Sugar.Number.defineInstance('bar', function() { return 'bar!'; }); - Sugar.extend({ - namespaces: [String] - }); - equal(''.foo(), 'foo!', 'foo was mapped'); - equal((5).bar, undefined, 'bar was not mapped'); - }); - - group('Extending with namespace exceptions', function() { - Sugar.String.defineInstance('foo', function() { return 'foo!'; }); - Sugar.Number.defineInstance('bar', function() { return 'bar!'; }); - Sugar.extend({ - except: [String] - }); - equal(''.foo, undefined, 'foo was not mapped'); - equal((5).bar(), 'bar!', 'bar was mapped'); - }); - - group('Extending with method exceptions', function() { - defineCustom(Sugar.String); - Sugar.String.extend({ - except: ['foo'] - }); - equal(''.foo, undefined, 'foo was not mapped'); - equal(''.bar(), 'bar!', 'bar was mapped'); - equal(''.moo(), 'moo!', 'moo was mapped'); - }); - - group('Aliasing', function() { - defineCustom(Sugar.String); - var result = Sugar.String.alias('foo2', Sugar.String.foo); - Sugar.String.alias('bar2', 'bar'); - Sugar.String.extend(); - equal(('').foo2(), 'foo!', 'foo2 is an alias of foo'); - equal(('').bar2(), 'bar!', 'bar2 is an alias of foo'); - equal(result, Sugar.String, 'return value should be the namespace'); - delete Sugar.String.foo2; - delete Sugar.String.bar2; - }); - - group('Defining with flags', function() { - String.foo = function() { - return 'native foo!'; - } - String.prototype.bar = function() { - return 'native bar!'; - } - Sugar.String.defineStatic('foo', function() { - return 'enhanced foo!'; - }, ['fooFlag']); - Sugar.String.defineInstance('bar', function() { - return 'enhanced bar!'; - }, ['barFlag']); - Sugar.String.extend({ - fooFlag: false, - barFlag: false - }); - equal(String.foo(), 'native foo!', 'static enhance prevented by flag'); - equal(''.bar(), 'native bar!', 'instance enhance prevented by flag'); - Sugar.String.extend({ - fooFlag: true, - barFlag: true - }); - equal(String.foo(), 'enhanced foo!', 'static extended'); - equal(''.bar(), 'enhanced bar!', 'instance extended'); - }); - - group('Aliases with flags', function() { - String.prototype.foo = function() { - return 'something native!'; - } - Sugar.String.defineInstance('foo', function(str) { - return str + ' enhanced!'; - }, ['fooFlag']); - Sugar.String.alias('foo2', 'foo'); - Sugar.String.extend({ - fooFlag: false - }); - equal('hi'.foo(), 'something native!', 'foo should not be enhanced'); - equal('hi'.foo2(), 'hi enhanced!', 'foo2 should be extended'); - }); - - group('Defining static polyfills', function() { - var nativeFrom = Array.from; - delete Array.from; - function testFrom() { - return 'polyfilled!'; - } - var result = Sugar.Array.defineStaticPolyfill('from', testFrom); - equal(Array.from(), 'polyfilled!', 'from should be polyfilled'); - equal(result, Sugar.Array, 'defineStaticPolyfill should return the namespace'); - Array.from = nativeFrom; - }); - - group('Defining instance polyfills', function() { - var nativeForEach = Array.prototype.forEach; - delete Array.prototype.forEach; - function testForEach() { - return 'polyfilled!'; - } - var result = Sugar.Array.defineInstancePolyfill('forEach', testForEach); - equal([].forEach(), 'polyfilled!', 'forEach should be polyfilled'); - equal(result, Sugar.Array, 'defineInstancePolyfill should return the namespace'); - Array.prototype.forEach = nativeForEach; - }); - - group('Array enhancements', function() { - // This test is in core because it cannot be run in - // the "extended" tests where arrays may already be enhanced. - Sugar.Array.extend({ - enhanceArray: false - }); - raisesError(function() { [1,2,3].every(1); }, 'every is not enhanced'); - raisesError(function() { [1,2,3].some(1); }, 'some is not enhanced'); - raisesError(function() { [1,2,3].filter(1); }, 'filter is not enhanced'); - raisesError(function() { [1,2,3].find(1); }, 'find is not enhanced'); - raisesError(function() { [1,2,3].findIndex(1); }, 'findIndex is not enhanced'); - raisesError(function() { [1,2,3].map(1); }, 'map is not enhanced'); - }); - - group('Array enhancements with enhance flag', function() { - // This test is in core because it cannot be run in - // the "extended" tests where arrays may already be enhanced. - Sugar.Array.extend({ - enhance: false - }); - raisesError(function() { [1,2,3].every(1); }, 'every is not enhanced'); - raisesError(function() { [1,2,3].some(1); }, 'some is not enhanced'); - raisesError(function() { [1,2,3].filter(1); }, 'filter is not enhanced'); - raisesError(function() { [1,2,3].find(1); }, 'find is not enhanced'); - raisesError(function() { [1,2,3].findIndex(1); }, 'findIndex is not enhanced'); - raisesError(function() { [1,2,3].map(1); }, 'map is not enhanced'); - }); - - group('String enhancements', function() { - // This test is in core because it cannot be run in - // the "extended" tests where strings may already be enhanced. - Sugar.String.extend({ - enhanceString: false - }); - raisesError(function() { 'foobar'.includes(/foo/); }, 'includes is not enhanced'); - }); - - group('String enhancements with enhance flag', function() { - // This test is in core because it cannot be run in - // the "extended" tests where strings may already be enhanced. - Sugar.String.extend({ - enhance: false - }); - raisesError(function() { 'foobar'.includes(/foo/); }, 'includes is not enhanced'); - }); - - group('Extending after global hijacking', function() { - var nativeDate = Date; - function FakeDate() {} - Sugar.Date.defineStatic('foo', function() { return 'foo!'; }); - // Hijacking the global Date object. Sinon does this to allow time mocking - // in tests, so need to support this here. - Date = FakeDate; - Sugar.Date.extend(); - equal(Date.foo(), 'foo!', 'hijacked global is now the target'); - Date = nativeDate; - }); - - group('Creating new namespaces', function() { - - Sugar.createNamespace('Boolean'); - Sugar.Boolean.defineInstance('trueOnSundays', function(bool) { - return bool && new Date().getDay() === 0; - }); - Sugar.Boolean.extend(); - equal(Sugar.Boolean.trueOnSundays(true), new Date().getDay() === 0, 'Only true on sundays!'); - equal(true.trueOnSundays(), new Date().getDay() === 0, 'Only true on sundays! | extended'); - - delete Boolean.prototype.trueOnSundays; - - Sugar.extend(); - equal(true.trueOnSundays(), new Date().getDay() === 0, 'extend also extends the namespace'); - - delete Boolean.prototype.trueOnSundays; - delete Sugar.Boolean; - - if (typeof WeakMap !== 'undefined') { - Sugar.createNamespace('WeakMap'); - Sugar.WeakMap.defineInstance('deleteIf', function(map, key, check) { - if (check) { - // Avoiding IE syntax errors - map['delete'](key); - } - }); - - Sugar.WeakMap.extend(); - var map = new WeakMap(); - var key = new String('foo'); - - map.set(key, 'bar'); - Sugar.WeakMap.deleteIf(map, key, false); - equal(map.get(key), 'bar', 'no delete'); - Sugar.WeakMap.deleteIf(map, key, true); - equal(map.get(key), undefined, 'deleted'); - - map.set(key, 'bar'); - map.deleteIf(key, false); - equal(map.get(key), 'bar', 'no delete | extended'); - map.deleteIf(key, true); - equal(map.get(key), undefined, 'deleted | extended'); - - delete WeakMap.prototype.deleteIf; - delete Sugar.WeakMap; - } - - }); - - group('Basic Chaining', function() { - defineCustom(Sugar.String); - var superString = new Sugar.String('hai'); - equal(superString.foo().raw, 'foo!', 'foo is chainable'); - equal(superString.bar().raw, 'bar!', 'bar is chainable'); - equal(superString.moo().raw, 'moo!', 'moo is chainable'); - equal(superString.foo().valueOf(), 'foo!', 'valueOf also returns raw value'); - equal(superString.foo().bar().moo().raw, 'moo!', 'long chain'); - }); - - group('Chainables as factories', function() { - defineCustom(Sugar.String); - var superString = Sugar.String('hai'); - equal(superString.foo().raw, 'foo!', 'foo is chainable'); - equal(superString.bar().raw, 'bar!', 'bar is chainable'); - equal(superString.moo().raw, 'moo!', 'moo is chainable'); - }); - - group('Chaining across namespaces', function() { - Sugar.Array.defineInstance('rate', function(arr) { - // I like even arrays! - return arr.length % 2 === 0 ? 10 : 2; - }); - Sugar.Number.defineInstance('twofold', function(num) { - // Double all the things! - return num * 2; - }); - Sugar.Number.defineInstance('large', function(num) { - // Do I think this number is large?? - return num > 10 ? 'large!' : 'small!'; - }); - Sugar.String.defineInstance('noIs', function(str) { - // I just love splitting on "i". - return str.split('a'); - }); - - equal(new Sugar.Array([1]).large, undefined, 'array chainable does not have number method'); - - var arr = new Sugar.Array([1,2,3]); - equal(arr.rate().twofold().large().noIs().raw, ['sm','ll!'], 'long chain of methods with odd'); - - var arr = new Sugar.Array([1,2]); - equal(arr.rate().twofold().large().noIs().raw, ['l','rge!'], 'long chain of methods with even'); - - }); - - group('Chaining with dismbiguation', function() { - Sugar.Array.defineInstance('foo', function(arr) { - return 'array says foo'; - }); - Sugar.String.defineInstance('foo', function(arr) { - return 'string says foo'; - }); - - equal(Sugar.Array().foo().raw, 'array says foo', 'Array method'); - equal(Sugar.Array().foo().foo().raw, 'string says foo', 'chained disambiguated from Array'); - equal(Sugar.String().foo().foo().raw, 'string says foo', 'chained disambiguated from String'); - equal(Sugar.Number('a').foo, undefined, 'number has no method foo'); - }); - - group('Disambiguation of an undefined namespace', function() { - Sugar.Array.defineInstance('foo', function(arr) { - return null; - }); - Sugar.String.defineInstance('foo', function(arr) { - return {}; - }); - raisesError(function() { Sugar.Array().foo().foo(); }, 'Null type cannot be disambiguated', TypeError); - raisesError(function() { Sugar.String().foo().foo(); }, 'Unrelated type cannot be disambiguated from default chainable', TypeError); - raisesError(function() { Sugar.Number(8).foo(); }, 'Unrelated type cannot be disambiguated from class chainable', TypeError); - }); - - group('Disambiguation only happens once', function() { - var before, after; - Sugar.String.defineInstance('foo', function(arr) { - return 'string foo!'; - }); - Sugar.Number.defineInstance('foo', function(arr) { - return 'number foo!'; - }); - before = testGetDefaultChainablePrototype().foo; - Sugar.Array.defineInstance('foo', function(arr) { - return 'array foo!'; - }); - after = testGetDefaultChainablePrototype().foo; - equal(before === after, true, 'Disambiguation function was only defined once'); - }); - - group('Chainables with Object', function() { - Sugar.Object.defineInstance('foo', function(arr) { - return 'object foo!'; - }); - Sugar.String.defineInstance('foo', function(arr) { - return 'string foo!'; - }); - Sugar.Number.defineInstance('bar', function(arr) { - return null; - }); - equal(new Sugar.Number(8).foo().raw, 'object foo!', 'object method should work from non-object chainable'); - equal(new Sugar.String(8).foo().raw, 'string foo!', 'non-object chainable still shadows object'); - equal(new Sugar.Number(8).bar().foo().raw, 'object foo!', 'null type disambiguation falls back to Object'); - - Sugar.createNamespace('Boolean'); - equal(new Sugar.Boolean(true).foo().raw, 'object foo!', 'namespaces created later still receive object methods'); - delete Sugar.Boolean; - }); - - group('Chaining special cases', function() { - Sugar.Array.defineInstance('getNull', function(arr) { - return null; - }); - Sugar.Number.defineInstance('getNaN', function(arr) { - return NaN; - }); - Sugar.String.defineInstance('getUndefined', function(arr) { - return undefined; - }); - - equal(Sugar.Array().getNull().getNaN().getUndefined().raw, undefined, 'Chained to undefined'); - equal(Sugar.Number().getNaN().getUndefined().getNull().raw, null, 'Chained to null'); - equal(Sugar.String().getUndefined().getNull().getNaN().raw, NaN, 'Chained to NaN'); - - }); - - group('Chainable built-in methods', function() { - - defineCustom(Sugar.String); - var str = new Sugar.String('wow'); - equal(str.charCodeAt(0).toFixed(2).raw, '119.00', 'Chaining built-ins'); - - var fn = function(n) { return String.fromCharCode(n); } - var arr = new Sugar.Array([102,111,111]); - arr.push(33); - equal(arr.map(fn).join('.').bar().replace('!', '').raw, 'bar', 'run between native and Sugar methods'); - - equal(new Sugar.Array([1,2,3]).map(function() { return 'a'; }).raw, ['a','a','a'], 'built-in is mapped to chainable'); - Sugar.String.defineInstance('map', function(str) { - return 'enhanced string map!' - }); - Sugar.Array.defineInstance('map', function(str) { - return 'enhanced array map!' - }); - equal(new Sugar.Array([1,2,3]).map().raw, 'enhanced array map!', 'enhanced method is mapped to chainable'); - equal(new Sugar.String('1,2,3').split(',').map().raw, 'enhanced array map!', 'enhanced method is disambiguated'); - equal(new Sugar.String('1,2,3').map().raw, 'enhanced string map!', 'string enhancement still works'); - - var dcp = testGetDefaultChainablePrototype(); - equal(dcp.hasOwnProperty === Sugar.Object.prototype.hasOwnProperty, true, 'Object#hasOwnProperty should not require disambiguation'); - equal(testHasOwn(Sugar.String.prototype, 'hasOwnProperty'), true, 'Sugar.String should now have its own hasOwnProperty chainable method'); - - }); - - group('Chainable valueOf behavior', function() { - - var eight = new Sugar.Number(8); - equal(eight + 8, 16, 'lhs can add primitives'); - equal(12 + eight, 20, 'rhs can be added to primitives'); - equal(eight > 3, true, 'greater than true'); - equal(eight > 13, false, 'greater than false'); - equal(eight < 3, false, 'less than false'); - equal(eight < 13, true, 'less than true'); - equal(eight >= 8, true, 'greater or equal true'); - equal(eight <= 8, true, 'less than or equal true'); - equal(eight * 2 * 8, 128, 'multiplication'); - equal(eight / 2 / 8, .5, 'division'); - equal(eight % 2, 0, 'modulo'); - - var foo = new Sugar.String('foo'); - equal(foo + 'bar', 'foobar', 'lhs string concat works'); - equal('bar' + foo, 'barfoo', 'rhs string concat works'); - equal(foo == 'foo', true, '== equality is true'); - equal(foo == 'bar', false, '== equality is false'); - - var f = new Sugar.RegExp(/f/); - equal(f.test('q') == false, true, '== equality is false'); - equal(f.test('f') == true, true, '== equality is true'); - equal(f.test('f') === false, false, '=== equality is always false'); - - }); - - group('Chainable toString behavior', function() { - equal(new Sugar.Number(8).toString().raw, '8', 'toString returns chainable as well'); - equal(new Sugar.Array([1,2,3]).toString().raw, '1,2,3', 'toString are not generic, but match their built-in class'); - equal(new Sugar.String('a,b').split(',').toString().raw, 'a,b', 'toString disambiguates'); - equal(new Sugar.Object(null).toString().raw, testGetClass(null), 'null with Object#toString'); - equal(new Sugar.Object(undefined).toString().raw, testGetClass(undefined), 'undefined with Object#toString'); - }); - - group('Chainable polyfill methods', function() { - var d = new Date(1460646000000); - function r(a, b) { return parseInt(a, 10) + parseInt(b, 10); } - equal(new Sugar.Array(['a','b','c']).indexOf('b').raw, 1, 'indexOf should be mapped'); - equal(new Sugar.Date(d).toISOString().trim().split('-').reduce(r).toFixed(2).raw, '2034.00', 'long chained'); - }); - }); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..005cc520c --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,55 @@ + +const path = require('path'); +const VERSION = require('./package.json').version; + +module.exports = { + mode: 'none', + devtool: 'cheap-module-eval-source-map', + output: { + filename: 'sugar.js' + }, + entry: { + sugar: [ + './src', + './src/polyfills' + ] + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + useBuiltIns: 'usage', + targets: [ + '> 1%', + 'not dead', + 'last 2 versions', + 'ie >= 9', + ] + } + ], + ], + plugins: [ + '@babel/plugin-transform-runtime' + ] + } + } + }, + { + test: path.resolve(__dirname, './src/core/index.js'), + loader: 'string-replace-loader', + options: { + search: "'edge'", + replace: JSON.stringify(VERSION) + } + } + ] + } +}; From 7fbe227611c6b4467c243484638fbebe323e8c95 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 13 Dec 2018 02:12:39 +0900 Subject: [PATCH 002/191] tests for extended --- .gitignore | 2 - .npmignore | 1 - .npmrc | 1 + CHANGELOG.md | 2 + dist/sugar.js | 822 --- package-lock.json | 11297 -------------------------------------- package.json | 2 +- src/core/index.js | 119 +- test/chainable.js | 39 +- test/core.js | 1 + test/extended.js | 162 +- test/helpers/methods.js | 4 +- test/helpers/module.js | 2 +- test/index.html | 1 + test/index.js | 1 + webpack.config.js | 2 +- 16 files changed, 272 insertions(+), 12186 deletions(-) delete mode 100644 .npmignore create mode 100644 .npmrc delete mode 100644 dist/sugar.js delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 37ace0b1a..487c1e146 100755 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ *.swp node_modules dist - -## PROJECT::SPECIFIC diff --git a/.npmignore b/.npmignore deleted file mode 100644 index bb4964323..000000000 --- a/.npmignore +++ /dev/null @@ -1 +0,0 @@ -bower.json diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..43c97e719 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fb5f8d04..7d4a453a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ v3.0.0 - Cannot instantiate chainable without new keyword anymore (ES6). - `Sugar()` alias is no longer supported. Use `Sugar.extend()` instead. - Removed `String#includes` with RegExp support. +- Removed ability to extend Object.prototype +- Removed support for bower. TODO: diff --git a/dist/sugar.js b/dist/sugar.js deleted file mode 100644 index 0c4eda249..000000000 --- a/dist/sugar.js +++ /dev/null @@ -1,822 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(1); -module.exports = __webpack_require__(110); - - -/***/ }), -/* 1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _core__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9pbmRleC5qcz9iNjM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9udW1iZXInO1xuXG5leHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb3JlJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n"); - -/***/ }), -/* 2 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"abs\", function() { return abs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"acos\", function() { return acos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"asin\", function() { return asin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan\", function() { return atan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan2\", function() { return atan2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ceil\", function() { return ceil; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cos\", function() { return cos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"exp\", function() { return exp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"floor\", function() { return floor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isEven\", function() { return isEven; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return isFinite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isInteger\", function() { return isInteger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isMultipleOf\", function() { return isMultipleOf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return isNaN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isOdd\", function() { return isOdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isSafeInteger\", function() { return isSafeInteger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"log\", function() { return log; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pow\", function() { return pow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"random\", function() { return random; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"round\", function() { return round; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sin\", function() { return sin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sqrt\", function() { return sqrt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"tan\", function() { return tan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toChar\", function() { return toChar; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toOrdinal\", function() { return toOrdinal; });\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _abs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(67);\n/* harmony import */ var _acos__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69);\n/* harmony import */ var _asin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70);\n/* harmony import */ var _atan__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(71);\n/* harmony import */ var _atan2__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(72);\n/* harmony import */ var _ceil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(73);\n/* harmony import */ var _cos__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(76);\n/* harmony import */ var _exp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(77);\n/* harmony import */ var _floor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(78);\n/* harmony import */ var _isEven__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(79);\n/* harmony import */ var _isFinite__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(91);\n/* harmony import */ var _isInteger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(93);\n/* harmony import */ var _isMultipleOf__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(94);\n/* harmony import */ var _isNaN__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(95);\n/* harmony import */ var _isOdd__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(96);\n/* harmony import */ var _isSafeInteger__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(97);\n/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(98);\n/* harmony import */ var _pow__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(99);\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(100);\n/* harmony import */ var _round__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(102);\n/* harmony import */ var _sin__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(103);\n/* harmony import */ var _sqrt__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(104);\n/* harmony import */ var _tan__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(105);\n/* harmony import */ var _toChar__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(106);\n/* harmony import */ var _toOrdinal__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(108);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar abs = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].abs,\n acos = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].acos,\n asin = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].asin,\n atan = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].atan,\n atan2 = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].atan2,\n ceil = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].ceil,\n cos = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cos,\n exp = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].exp,\n floor = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].floor,\n isEven = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isEven,\n isFinite = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFinite,\n isInteger = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isInteger,\n isMultipleOf = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isMultipleOf,\n isNaN = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isNaN,\n isOdd = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isOdd,\n isSafeInteger = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isSafeInteger,\n log = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].log,\n pow = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].pow,\n random = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].random,\n round = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].round,\n sin = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].sin,\n sqrt = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].sqrt,\n tan = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tan,\n toChar = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toChar,\n toOrdinal = _namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toOrdinal;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_namespace__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9udW1iZXIvaW5kZXguanM/YzYxYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3VnYXJOdW1iZXIgZnJvbSAnLi9uYW1lc3BhY2UnO1xuXG5pbXBvcnQgJy4vYWJzJztcbmltcG9ydCAnLi9hY29zJztcbmltcG9ydCAnLi9hc2luJztcbmltcG9ydCAnLi9hdGFuJztcbmltcG9ydCAnLi9hdGFuMic7XG5pbXBvcnQgJy4vY2VpbCc7XG5pbXBvcnQgJy4vY29zJztcbmltcG9ydCAnLi9leHAnO1xuaW1wb3J0ICcuL2Zsb29yJztcbmltcG9ydCAnLi9pc0V2ZW4nO1xuaW1wb3J0ICcuL2lzRmluaXRlJztcbmltcG9ydCAnLi9pc0ludGVnZXInO1xuaW1wb3J0ICcuL2lzTXVsdGlwbGVPZic7XG5pbXBvcnQgJy4vaXNOYU4nO1xuaW1wb3J0ICcuL2lzT2RkJztcbmltcG9ydCAnLi9pc1NhZmVJbnRlZ2VyJztcbmltcG9ydCAnLi9sb2cnO1xuaW1wb3J0ICcuL3Bvdyc7XG5pbXBvcnQgJy4vcmFuZG9tJztcbmltcG9ydCAnLi9yb3VuZCc7XG5pbXBvcnQgJy4vc2luJztcbmltcG9ydCAnLi9zcXJ0JztcbmltcG9ydCAnLi90YW4nO1xuaW1wb3J0ICcuL3RvQ2hhcic7XG5pbXBvcnQgJy4vdG9PcmRpbmFsJztcblxuZXhwb3J0IGNvbnN0IHtcbiAgYWJzLFxuICBhY29zLFxuICBhc2luLFxuICBhdGFuLFxuICBhdGFuMixcbiAgY2VpbCxcbiAgY29zLFxuICBleHAsXG4gIGZsb29yLFxuICBpc0V2ZW4sXG4gIGlzRmluaXRlLFxuICBpc0ludGVnZXIsXG4gIGlzTXVsdGlwbGVPZixcbiAgaXNOYU4sXG4gIGlzT2RkLFxuICBpc1NhZmVJbnRlZ2VyLFxuICBsb2csXG4gIHBvdyxcbiAgcmFuZG9tLFxuICByb3VuZCxcbiAgc2luLFxuICBzcXJ0LFxuICB0YW4sXG4gIHRvQ2hhcixcbiAgdG9PcmRpbmFsXG59ID0gU3VnYXJOdW1iZXI7XG5cbmV4cG9ydCBkZWZhdWx0IFN1Z2FyTnVtYmVyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2\n"); - -/***/ }), -/* 3 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineStatic\", function() { return defineStatic; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineInstance\", function() { return defineInstance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineStaticAlias\", function() { return defineStaticAlias; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defineInstanceAlias\", function() { return defineInstanceAlias; });\n/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n\nvar namespace = Object(_core__WEBPACK_IMPORTED_MODULE_0__[\"createNamespace\"])('Number');\nvar defineStatic = namespace.defineStatic,\n defineInstance = namespace.defineInstance,\n defineStaticAlias = namespace.defineStaticAlias,\n defineInstanceAlias = namespace.defineInstanceAlias;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (namespace);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9udW1iZXIvbmFtZXNwYWNlLmpzPzQ3ZjkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlTmFtZXNwYWNlIH0gZnJvbSAnLi4vY29yZSc7XG5cbmNvbnN0IG5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZSgnTnVtYmVyJyk7XG5cbmV4cG9ydCBjb25zdCB7XG4gIGRlZmluZVN0YXRpYyxcbiAgZGVmaW5lSW5zdGFuY2UsXG4gIGRlZmluZVN0YXRpY0FsaWFzLFxuICBkZWZpbmVJbnN0YW5jZUFsaWFzLFxufSA9IG5hbWVzcGFjZTtcblxuZXhwb3J0IGRlZmF1bHQgbmFtZXNwYWNlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3\n"); - -/***/ }), -/* 4 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return extend; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return VERSION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createNamespace\", function() { return createNamespace; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8);\n/* harmony import */ var core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_split__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(45);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\nvar SUGAR = 'Sugar'; // TODO: test browserify\n// TODO: test broccoli\n// TODO: test rhino\n// TODO: test QML\n\nvar IS_BROWSER = typeof window !== 'undefined';\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar globalContext = getGlobalContext();\n\nfunction hasOwn(obj, prop) {\n return !!obj && hasOwnProperty.call(obj, prop);\n}\n\nfunction forEachProperty(obj, fn) {\n for (var key in obj) {\n if (!hasOwn(obj, key)) continue;\n if (fn.call(obj, key, obj[key], obj) === false) break;\n }\n}\n\nfunction getGlobalContext() {\n // Get global context by keyword here to avoid issues with libraries\n // that can potentially alter this script's context object.\n return testGlobalContext(typeof global !== 'undefined' && global) || testGlobalContext(typeof window !== 'undefined' && window) || testGlobalContext(typeof self !== 'undefined' && self);\n}\n\nfunction testGlobalContext(obj) {\n // Note that Rhino uses a different \"global\" keyword so perform an\n // extra check here to ensure that it's actually the global object.\n // TODO: test this!\n return obj && obj.Object === Object ? obj : null;\n}\n\nfunction toString() {\n return SUGAR;\n} // TODO: rinse arrow functions\n// TODO: need to export anything?\n\n\nfunction nativeMethodProhibitedOnChainable(methodName) {\n // Sugar chainables have their own constructors as well as \"valueOf\"\n // methods, so exclude them here. The __proto__ argument should be\n // trapped by the function check, however simply accessing this property\n // on Object.prototype causes QML to segfault, so pre-emptively excluding\n // it. Note we're intentionally allowing toString through to allow\n // it to be wrapped as a chainable.\n return methodName === 'constructor' || methodName === 'valueOf' || methodName === '__proto__';\n}\n\nfunction mapNativeToChainable(namespace, name) {\n var proto = globalContext[name].prototype;\n Object.getOwnPropertyNames(proto).forEach(function (methodName) {\n // TODO: not toString??\n if (nativeMethodProhibitedOnChainable(methodName)) {\n return;\n }\n\n try {\n var fn = proto[methodName];\n\n if (typeof fn !== 'function') {\n // Bail on anything not a function.\n return;\n }\n } catch (e) {\n // Function.prototype has properties that\n // will throw errors when accessed.\n return;\n }\n\n return namespace.prototype[methodName] = wrapChainableResult(fn);\n });\n}\n\nfunction canWrapChainable(obj) {\n return obj != null && obj !== true && obj !== false;\n}\n\nfunction wrapChainableResult(fn) {\n return function () {\n var result = fn.apply(this.raw, arguments);\n\n if (!canWrapChainable(result)) {\n return result;\n } // Objects may not have prototypes.\n\n\n var ctor = result.constructor;\n var name = ctor ? ctor.name : 'Object';\n var namespace = Sugar[name];\n\n if (!namespace && (!ctor || ctor === globalContext[name])) {\n namespace = createNamespace(name);\n }\n\n return namespace ? new namespace(result) : result;\n };\n}\n\nfunction createExport() {\n var obj = {\n VERSION: VERSION,\n extend: extend,\n toString: toString,\n createNamespace: createNamespace\n };\n\n if (IS_BROWSER) {\n try {\n // Reuse already defined Sugar global object.\n globalContext[SUGAR] = globalContext[SUGAR] || obj;\n } catch (e) {\n console.error(e); // Contexts such as QML have a read-only global context.\n }\n }\n\n return obj;\n}\n\nfunction extend() {\n console.info('EXTENDINNNNNNNn');\n}\n\nfunction assertMethodDoesNotExist(namespace, methodName) {\n if (namespace[methodName]) {\n throw new Error(ERROR_METHOD_DEFINED);\n }\n}\n\nfunction _defineStatic(namespace, methodName, fn) {\n assertMethodDoesNotExist(namespace, methodName);\n return namespace[methodName] = fn;\n}\n\nfunction _defineInstance(namespace, methodName, fn) {\n assertMethodDoesNotExist(namespace, methodName);\n var instance = wrapStaticMethodAsInstance(namespace, fn);\n namespace[methodName] = fn;\n namespace.prototype[methodName] = wrapChainableResult(instance);\n}\n\nfunction wrapStaticMethodAsInstance(namespace, fn) {\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n args.unshift(this);\n return fn.apply(namespace, args);\n };\n}\n\nfunction defineWithArgs(namespace, defineMethod, args) {\n if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_3___default()(args[0]) === 'object') {\n forEachProperty(args[0], function (methodName, fn) {\n defineMethod(namespace, methodName, fn);\n });\n } else {\n return defineMethod(namespace, args[0], args[1]);\n }\n}\n\nfunction defineAliases(namespace, defineMethod, str, fn) {\n str.split(' ').forEach(function (methodName) {\n defineMethod(namespace, methodName, fn(methodName));\n });\n}\n\nvar ERROR_METHOD_DEFINED = 'Method already defined';\nvar ERROR_NATIVE_UNKNOWN = 'Native class does not exist';\nvar INSTANCE = 0x1;\nvar STATIC = 0x2;\nvar VERSION = \"3.0.0\";\nfunction createNamespace(name) {\n if (!globalContext[name]) {\n throw new Error(ERROR_NATIVE_UNKNOWN);\n }\n\n if (Sugar[name]) {\n return Sugar[name];\n }\n\n var SugarChainable =\n /*#__PURE__*/\n function () {\n function SugarChainable(raw) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SugarChainable);\n\n this.raw = raw;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SugarChainable, [{\n key: \"valueOf\",\n value: function valueOf() {\n return this.raw;\n }\n }], [{\n key: \"defineStatic\",\n value: function defineStatic() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return defineWithArgs(SugarChainable, _defineStatic, args);\n }\n }, {\n key: \"defineInstance\",\n value: function defineInstance() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return defineWithArgs(SugarChainable, _defineInstance, args);\n }\n }, {\n key: \"defineStaticAlias\",\n value: function defineStaticAlias(str, fn) {\n return defineAliases(SugarChainable, _defineStatic, str, fn);\n }\n }, {\n key: \"defineInstanceAlias\",\n value: function defineInstanceAlias(str, fn) {\n return defineAliases(SugarChainable, _defineInstance, str, fn);\n }\n }, {\n key: \"toString\",\n value: function toString() {\n return SUGAR + name;\n }\n }]);\n\n return SugarChainable;\n }();\n\n mapNativeToChainable(SugarChainable, name);\n return Sugar[name] = SugarChainable;\n}\nvar Sugar = createExport();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Sugar);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb3JlL2luZGV4LmpzP2M3YjIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU1VHQVIgPSAnU3VnYXInO1xuXG4vLyBUT0RPOiB0ZXN0IGJyb3dzZXJpZnlcbi8vIFRPRE86IHRlc3QgYnJvY2NvbGlcbi8vIFRPRE86IHRlc3Qgcmhpbm9cbi8vIFRPRE86IHRlc3QgUU1MXG5jb25zdCBJU19CUk9XU0VSID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmNvbnN0IGdsb2JhbENvbnRleHQgPSBnZXRHbG9iYWxDb250ZXh0KCk7XG5cbmZ1bmN0aW9uIGhhc093bihvYmosIHByb3ApIHtcbiAgcmV0dXJuICEhb2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaFByb3BlcnR5KG9iaiwgZm4pIHtcbiAgZm9yKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFoYXNPd24ob2JqLCBrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoZm4uY2FsbChvYmosIGtleSwgb2JqW2tleV0sIG9iaikgPT09IGZhbHNlKSBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHbG9iYWxDb250ZXh0KCkge1xuICAvLyBHZXQgZ2xvYmFsIGNvbnRleHQgYnkga2V5d29yZCBoZXJlIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGxpYnJhcmllc1xuICAvLyB0aGF0IGNhbiBwb3RlbnRpYWxseSBhbHRlciB0aGlzIHNjcmlwdCdzIGNvbnRleHQgb2JqZWN0LlxuICByZXR1cm4gdGVzdEdsb2JhbENvbnRleHQodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgdGVzdEdsb2JhbENvbnRleHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93KSB8fFxuICAgICAgICAgdGVzdEdsb2JhbENvbnRleHQodHlwZW9mIHNlbGYgICAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZik7XG59XG5cbmZ1bmN0aW9uIHRlc3RHbG9iYWxDb250ZXh0KG9iaikge1xuICAvLyBOb3RlIHRoYXQgUmhpbm8gdXNlcyBhIGRpZmZlcmVudCBcImdsb2JhbFwiIGtleXdvcmQgc28gcGVyZm9ybSBhblxuICAvLyBleHRyYSBjaGVjayBoZXJlIHRvIGVuc3VyZSB0aGF0IGl0J3MgYWN0dWFsbHkgdGhlIGdsb2JhbCBvYmplY3QuXG4gIC8vIFRPRE86IHRlc3QgdGhpcyFcbiAgcmV0dXJuIG9iaiAmJiBvYmouT2JqZWN0ID09PSBPYmplY3QgPyBvYmogOiBudWxsO1xufVxuXG5mdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIFNVR0FSO1xufVxuLy8gVE9ETzogcmluc2UgYXJyb3cgZnVuY3Rpb25zXG4vLyBUT0RPOiBuZWVkIHRvIGV4cG9ydCBhbnl0aGluZz9cblxuZnVuY3Rpb24gbmF0aXZlTWV0aG9kUHJvaGliaXRlZE9uQ2hhaW5hYmxlKG1ldGhvZE5hbWUpIHtcbiAgLy8gU3VnYXIgY2hhaW5hYmxlcyBoYXZlIHRoZWlyIG93biBjb25zdHJ1Y3RvcnMgYXMgd2VsbCBhcyBcInZhbHVlT2ZcIlxuICAvLyBtZXRob2RzLCBzbyBleGNsdWRlIHRoZW0gaGVyZS4gVGhlIF9fcHJvdG9fXyBhcmd1bWVudCBzaG91bGQgYmVcbiAgLy8gdHJhcHBlZCBieSB0aGUgZnVuY3Rpb24gY2hlY2ssIGhvd2V2ZXIgc2ltcGx5IGFjY2Vzc2luZyB0aGlzIHByb3BlcnR5XG4gIC8vIG9uIE9iamVjdC5wcm90b3R5cGUgY2F1c2VzIFFNTCB0byBzZWdmYXVsdCwgc28gcHJlLWVtcHRpdmVseSBleGNsdWRpbmdcbiAgLy8gaXQuIE5vdGUgd2UncmUgaW50ZW50aW9uYWxseSBhbGxvd2luZyB0b1N0cmluZyB0aHJvdWdoIHRvIGFsbG93XG4gIC8vIGl0IHRvIGJlIHdyYXBwZWQgYXMgYSBjaGFpbmFibGUuXG4gIHJldHVybiBtZXRob2ROYW1lID09PSAnY29uc3RydWN0b3InIHx8XG4gICAgICAgICBtZXRob2ROYW1lID09PSAndmFsdWVPZicgfHxcbiAgICAgICAgIG1ldGhvZE5hbWUgPT09ICdfX3Byb3RvX18nO1xufVxuXG5mdW5jdGlvbiBtYXBOYXRpdmVUb0NoYWluYWJsZShuYW1lc3BhY2UsIG5hbWUpIHtcblxuICBjb25zdCBwcm90byA9IGdsb2JhbENvbnRleHRbbmFtZV0ucHJvdG90eXBlO1xuXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIC8vIFRPRE86IG5vdCB0b1N0cmluZz8/XG4gICAgaWYgKG5hdGl2ZU1ldGhvZFByb2hpYml0ZWRPbkNoYWluYWJsZShtZXRob2ROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdmFyIGZuID0gcHJvdG9bbWV0aG9kTmFtZV07XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEJhaWwgb24gYW55dGhpbmcgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBGdW5jdGlvbi5wcm90b3R5cGUgaGFzIHByb3BlcnRpZXMgdGhhdFxuICAgICAgLy8gd2lsbCB0aHJvdyBlcnJvcnMgd2hlbiBhY2Nlc3NlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzcGFjZS5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSB3cmFwQ2hhaW5hYmxlUmVzdWx0KGZuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNhbldyYXBDaGFpbmFibGUob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogIT09IHRydWUgJiYgb2JqICE9PSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gd3JhcENoYWluYWJsZVJlc3VsdChmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4uYXBwbHkodGhpcy5yYXcsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFjYW5XcmFwQ2hhaW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIE9iamVjdHMgbWF5IG5vdCBoYXZlIHByb3RvdHlwZXMuXG4gICAgY29uc3QgY3RvciA9IHJlc3VsdC5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCBuYW1lID0gY3RvciA/IGN0b3IubmFtZSA6ICdPYmplY3QnO1xuICAgIGxldCBuYW1lc3BhY2UgPSBTdWdhcltuYW1lXTtcbiAgICBpZiAoIW5hbWVzcGFjZSAmJiAoIWN0b3IgfHwgY3RvciA9PT0gZ2xvYmFsQ29udGV4dFtuYW1lXSkpIHtcbiAgICAgIG5hbWVzcGFjZSA9IGNyZWF0ZU5hbWVzcGFjZShuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzcGFjZSA/IG5ldyBuYW1lc3BhY2UocmVzdWx0KSA6IHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFeHBvcnQoKSB7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIHRvU3RyaW5nOiB0b1N0cmluZyxcbiAgICBjcmVhdGVOYW1lc3BhY2U6IGNyZWF0ZU5hbWVzcGFjZVxuICB9O1xuXG4gIGlmIChJU19CUk9XU0VSKSB7XG4gICAgdHJ5IHtcbiAgICAvLyBSZXVzZSBhbHJlYWR5IGRlZmluZWQgU3VnYXIgZ2xvYmFsIG9iamVjdC5cbiAgICAgIGdsb2JhbENvbnRleHRbU1VHQVJdID0gZ2xvYmFsQ29udGV4dFtTVUdBUl0gfHwgb2JqO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIC8vIENvbnRleHRzIHN1Y2ggYXMgUU1MIGhhdmUgYSByZWFkLW9ubHkgZ2xvYmFsIGNvbnRleHQuXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgY29uc29sZS5pbmZvKCdFWFRFTkRJTk5OTk5OTm4nKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0TWV0aG9kRG9lc05vdEV4aXN0KG5hbWVzcGFjZSwgbWV0aG9kTmFtZSkge1xuICBpZiAobmFtZXNwYWNlW21ldGhvZE5hbWVdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01FVEhPRF9ERUZJTkVEKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVTdGF0aWMobmFtZXNwYWNlLCBtZXRob2ROYW1lLCBmbikge1xuICBhc3NlcnRNZXRob2REb2VzTm90RXhpc3QobmFtZXNwYWNlLCBtZXRob2ROYW1lKTtcbiAgcmV0dXJuIG5hbWVzcGFjZVttZXRob2ROYW1lXSA9IGZuO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVJbnN0YW5jZShuYW1lc3BhY2UsIG1ldGhvZE5hbWUsIGZuKSB7XG4gIGFzc2VydE1ldGhvZERvZXNOb3RFeGlzdChuYW1lc3BhY2UsIG1ldGhvZE5hbWUpO1xuICBjb25zdCBpbnN0YW5jZSA9IHdyYXBTdGF0aWNNZXRob2RBc0luc3RhbmNlKG5hbWVzcGFjZSwgZm4pO1xuICBuYW1lc3BhY2VbbWV0aG9kTmFtZV0gPSBmbjtcbiAgbmFtZXNwYWNlLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IHdyYXBDaGFpbmFibGVSZXN1bHQoaW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiB3cmFwU3RhdGljTWV0aG9kQXNJbnN0YW5jZShuYW1lc3BhY2UsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBmbi5hcHBseShuYW1lc3BhY2UsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZVdpdGhBcmdzKG5hbWVzcGFjZSwgZGVmaW5lTWV0aG9kLCBhcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3JFYWNoUHJvcGVydHkoYXJnc1swXSwgKG1ldGhvZE5hbWUsIGZuKSA9PiB7XG4gICAgICBkZWZpbmVNZXRob2QobmFtZXNwYWNlLCBtZXRob2ROYW1lLCBmbik7XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmaW5lTWV0aG9kKG5hbWVzcGFjZSwgYXJnc1swXSwgYXJnc1sxXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lQWxpYXNlcyhuYW1lc3BhY2UsIGRlZmluZU1ldGhvZCwgc3RyLCBmbikge1xuICBzdHIuc3BsaXQoJyAnKS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIGRlZmluZU1ldGhvZChuYW1lc3BhY2UsIG1ldGhvZE5hbWUsIGZuKG1ldGhvZE5hbWUpKTtcbiAgfSk7XG59XG5cbmNvbnN0IEVSUk9SX01FVEhPRF9ERUZJTkVEID0gJ01ldGhvZCBhbHJlYWR5IGRlZmluZWQnO1xuY29uc3QgRVJST1JfTkFUSVZFX1VOS05PV04gPSAnTmF0aXZlIGNsYXNzIGRvZXMgbm90IGV4aXN0JztcblxuY29uc3QgSU5TVEFOQ0UgPSAweDE7XG5jb25zdCBTVEFUSUMgICA9IDB4MjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIjMuMC4wXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOYW1lc3BhY2UobmFtZSkge1xuXG4gIGlmICghZ2xvYmFsQ29udGV4dFtuYW1lXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9OQVRJVkVfVU5LTk9XTik7XG4gIH1cblxuICBpZiAoU3VnYXJbbmFtZV0pIHtcbiAgICByZXR1cm4gU3VnYXJbbmFtZV07XG4gIH1cblxuICBjbGFzcyBTdWdhckNoYWluYWJsZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihyYXcpIHtcbiAgICAgIHRoaXMucmF3ID0gcmF3O1xuICAgIH1cblxuICAgIHN0YXRpYyBkZWZpbmVTdGF0aWMoLi4uYXJncykge1xuICAgICAgcmV0dXJuIGRlZmluZVdpdGhBcmdzKFN1Z2FyQ2hhaW5hYmxlLCBkZWZpbmVTdGF0aWMsIGFyZ3MpO1xuICAgIH1cblxuICAgIHN0YXRpYyBkZWZpbmVJbnN0YW5jZSguLi5hcmdzKSB7XG4gICAgICByZXR1cm4gZGVmaW5lV2l0aEFyZ3MoU3VnYXJDaGFpbmFibGUsIGRlZmluZUluc3RhbmNlLCBhcmdzKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmaW5lU3RhdGljQWxpYXMoc3RyLCBmbikge1xuICAgICAgcmV0dXJuIGRlZmluZUFsaWFzZXMoU3VnYXJDaGFpbmFibGUsIGRlZmluZVN0YXRpYywgc3RyLCBmbik7XG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmluZUluc3RhbmNlQWxpYXMoc3RyLCBmbikge1xuICAgICAgcmV0dXJuIGRlZmluZUFsaWFzZXMoU3VnYXJDaGFpbmFibGUsIGRlZmluZUluc3RhbmNlLCBzdHIsIGZuKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gU1VHQVIgKyBuYW1lO1xuICAgIH1cblxuICAgIHZhbHVlT2YoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXc7XG4gICAgfVxuXG4gIH1cblxuICBtYXBOYXRpdmVUb0NoYWluYWJsZShTdWdhckNoYWluYWJsZSwgbmFtZSk7XG5cbiAgcmV0dXJuIFN1Z2FyW25hbWVdID0gU3VnYXJDaGFpbmFibGU7XG59XG5cbmNvbnN0IFN1Z2FyID0gY3JlYXRlRXhwb3J0KCk7XG5leHBvcnQgZGVmYXVsdCBTdWdhcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQUFBO0FBQUE7QUFZQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFmQTtBQUFBO0FBQUE7QUFxQ0E7QUFDQTtBQXRDQTtBQUFBO0FBQUE7QUFnQkE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBbEJBO0FBQUE7QUFBQTtBQW9CQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUF0QkE7QUFBQTtBQUFBO0FBeUJBO0FBQ0E7QUExQkE7QUFBQTtBQUFBO0FBNkJBO0FBQ0E7QUE5QkE7QUFBQTtBQUFBO0FBaUNBO0FBQ0E7QUFsQ0E7QUFDQTtBQURBO0FBQUE7QUFDQTtBQXlDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4\n"); - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanM/Y2QwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5\n"); - -/***/ }), -/* 6 */ -/***/ (function(module, exports) { - -eval("function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzPzk3MGIiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6\n"); - -/***/ }), -/* 7 */ -/***/ (function(module, exports) { - -eval("function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzPzViYzMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n"); - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\nvar isRegExp = __webpack_require__(9);\nvar anObject = __webpack_require__(18);\nvar speciesConstructor = __webpack_require__(19);\nvar advanceStringIndex = __webpack_require__(21);\nvar toLength = __webpack_require__(25);\nvar callRegExpExec = __webpack_require__(26);\nvar regexpExec = __webpack_require__(28);\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\n\n// eslint-disable-next-line no-empty\nvar SUPPORTS_Y = !!(function () { try { return new RegExp('x', 'y'); } catch (e) {} })();\n\n// @@split logic\n__webpack_require__(30)('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit = $split;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? 0xffffffff : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcz8yOGE1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNhbGxSZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnZhciAkbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyICRTUExJVCA9ICdzcGxpdCc7XG52YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbnZhciBTVVBQT1JUU19ZID0gISEoZnVuY3Rpb24gKCkgeyB0cnkgeyByZXR1cm4gbmV3IFJlZ0V4cCgneCcsICd5Jyk7IH0gY2F0Y2ggKGUpIHt9IH0pKCk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgU1BMSVQsICRzcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBpbnRlcm5hbFNwbGl0ID0gJHNwbGl0O1xuICBpZiAoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICkge1xuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuICRzcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gNDI5NDk2NzI5NSA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgaWYgKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pICRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKG91dHB1dFtMRU5HVEhdID49IHNwbGl0TGltaXQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleCkgc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSsrOyAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICB9XG4gICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pIHtcbiAgICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvckNvcHkudGVzdCgnJykpIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZiAoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6ICRzcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwbGl0dGVyLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXRcbiAgICAvL1xuICAgIC8vIE5PVEU6IFRoaXMgY2Fubm90IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQgaW4gZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnRcbiAgICAvLyB0aGUgJ3knIGZsYWcuXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgbGltaXQpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoaW50ZXJuYWxTcGxpdCwgcmVnZXhwLCB0aGlzLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gJHNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocngubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gMHhmZmZmZmZmZiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gJG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoU1VQUE9SVFNfWSA/IDAgOiBxKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEEucHVzaCh6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBLnB1c2goUy5zbGljZShwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n"); - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(10);\nvar cof = __webpack_require__(11);\nvar MATCH = __webpack_require__(12)('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcz9hYWUzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n"); - -/***/ }), -/* 10 */ -/***/ (function(module, exports) { - -eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanM/ZDNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n"); - -/***/ }), -/* 11 */ -/***/ (function(module, exports) { - -eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanM/MmQ5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11\n"); - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var store = __webpack_require__(13)('wks');\nvar uid = __webpack_require__(17);\nvar Symbol = __webpack_require__(15).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MuanM/MmI0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///12\n"); - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var core = __webpack_require__(14);\nvar global = __webpack_require__(15);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: __webpack_require__(16) ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanM/NTUzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///13\n"); - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - -eval("var core = module.exports = { version: '2.6.0' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzPzgzNzgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi4wJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14\n"); - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - -eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanM/NzcyNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///15\n"); - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - -eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzPzJkMDAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///16\n"); - -/***/ }), -/* 17 */ -/***/ (function(module, exports) { - -eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191aWQuanM/Y2E1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n"); - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var isObject = __webpack_require__(10);\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanM/Y2I3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///18\n"); - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(18);\nvar aFunction = __webpack_require__(20);\nvar SPECIES = __webpack_require__(12)('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzP2ViZDYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///19\n"); - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - -eval("module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzP2Q4ZTgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///20\n"); - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\nvar at = __webpack_require__(22)(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZHZhbmNlLXN0cmluZy1pbmRleC5qcz8wMzkwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4gLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gYXQoUywgaW5kZXgpLmxlbmd0aCA6IDEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///21\n"); - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var toInteger = __webpack_require__(23);\nvar defined = __webpack_require__(24);\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanM/MDJmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22\n"); - -/***/ }), -/* 23 */ -/***/ (function(module, exports) { - -eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzPzQ1ODgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///23\n"); - -/***/ }), -/* 24 */ -/***/ (function(module, exports) { - -eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzP2JlMTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///24\n"); - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(23);\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanM/OWRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///25\n"); - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\nvar classof = __webpack_require__(27);\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy1hYnN0cmFjdC5qcz81ZjFiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgYnVpbHRpbkV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG5cbiAvLyBgUmVnRXhwRXhlY2AgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpO1xuICB9XG4gIHJldHVybiBidWlsdGluRXhlYy5jYWxsKFIsIFMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///26\n"); - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(11);\nvar TAG = __webpack_require__(12)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzPzIzYzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///27\n"); - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n\nvar regexpFlags = __webpack_require__(29);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy5qcz81MjBhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZ2V4cEZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcblxudmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG4vLyBUaGlzIGFsd2F5cyByZWZlcnMgdG8gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZSB0aGVcbi8vIFN0cmluZyNyZXBsYWNlIHBvbHlmaWxsIHVzZXMgLi9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzLFxuLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLlxudmFyIG5hdGl2ZVJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG5cbnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7XG5cbnZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvLFxuICAgICAgcmUyID0gL2IqL2c7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTEsICdhJyk7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7XG4gIHJldHVybiByZTFbTEFTVF9JTkRFWF0gIT09IDAgfHwgcmUyW0xBU1RfSU5ERVhdICE9PSAwO1xufSkoKTtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxudmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDtcblxudmFyIFBBVENIID0gVVBEQVRFU19MQVNUX0lOREVYX1dST05HIHx8IE5QQ0dfSU5DTFVERUQ7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuXG4gICAgaWYgKE5QQ0dfSU5DTFVERUQpIHtcbiAgICAgIHJlQ29weSA9IG5ldyBSZWdFeHAoJ14nICsgcmUuc291cmNlICsgJyQoPyFcXFxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7XG4gICAgfVxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcpIGxhc3RJbmRleCA9IHJlW0xBU1RfSU5ERVhdO1xuXG4gICAgbWF0Y2ggPSBuYXRpdmVFeGVjLmNhbGwocmUsIHN0cik7XG5cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HICYmIG1hdGNoKSB7XG4gICAgICByZVtMQVNUX0lOREVYXSA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICBuYXRpdmVSZXBsYWNlLmNhbGwobWF0Y2hbMF0sIHJlQ29weSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///28\n"); - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(18);\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcz8wYmZiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29\n"); - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\n__webpack_require__(31);\nvar redefine = __webpack_require__(41);\nvar hide = __webpack_require__(33);\nvar fails = __webpack_require__(37);\nvar defined = __webpack_require__(24);\nvar wks = __webpack_require__(12);\nvar regexpExec = __webpack_require__(28);\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzPzIxNGYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmV4ZWMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3a3MoJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxudmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDIgJiYgcmVzdWx0WzBdID09PSAnYScgJiYgcmVzdWx0WzFdID09PSAnYic7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCA/ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgIH1cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIGZucyA9IGV4ZWMoXG4gICAgICBkZWZpbmVkLFxuICAgICAgU1lNQk9MLFxuICAgICAgJydbS0VZXSxcbiAgICAgIGZ1bmN0aW9uIG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgICB9XG4gICAgKTtcbiAgICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gICAgdmFyIHJ4Zm4gPSBmbnNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///30\n"); - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\nvar regexpExec = __webpack_require__(28);\n__webpack_require__(32)({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYy5qcz9iMGM1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnJlcXVpcmUoJy4vX2V4cG9ydCcpKHtcbiAgdGFyZ2V0OiAnUmVnRXhwJyxcbiAgcHJvdG86IHRydWUsXG4gIGZvcmNlZDogcmVnZXhwRXhlYyAhPT0gLy4vLmV4ZWNcbn0sIHtcbiAgZXhlYzogcmVnZXhwRXhlY1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///31\n"); - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var global = __webpack_require__(15);\nvar core = __webpack_require__(14);\nvar hide = __webpack_require__(33);\nvar redefine = __webpack_require__(41);\nvar ctx = __webpack_require__(43);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19leHBvcnQuanM/NWNhMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSk7XG4gIHZhciBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmICh0YXJnZXQpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmIChleHBvcnRzW2tleV0gIT0gb3V0KSBoaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZiAoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpIGV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///32\n"); - -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var dP = __webpack_require__(34);\nvar createDesc = __webpack_require__(40);\nmodule.exports = __webpack_require__(36) ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzPzMyZTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///33\n"); - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var anObject = __webpack_require__(18);\nvar IE8_DOM_DEFINE = __webpack_require__(35);\nvar toPrimitive = __webpack_require__(39);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(36) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanM/ODZjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///34\n"); - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("module.exports = !__webpack_require__(36) && !__webpack_require__(37)(function () {\n return Object.defineProperty(__webpack_require__(38)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcz9jNjlhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///35\n"); - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(37)(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcz85ZTFlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///36\n"); - -/***/ }), -/* 37 */ -/***/ (function(module, exports) { - -eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcz83OWU1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37\n"); - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var isObject = __webpack_require__(10);\nvar document = __webpack_require__(15).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzPzIzMGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///38\n"); - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(10);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanM/NmE5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n"); - -/***/ }), -/* 40 */ -/***/ (function(module, exports) { - -eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzPzQ2MzAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40\n"); - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var global = __webpack_require__(15);\nvar hide = __webpack_require__(33);\nvar has = __webpack_require__(42);\nvar SRC = __webpack_require__(17)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(14).inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcz8yYWJhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41\n"); - -/***/ }), -/* 42 */ -/***/ (function(module, exports) { - -eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanM/NjlhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///42\n"); - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// optional / simple context binding\nvar aFunction = __webpack_require__(20);\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanM/OWI0MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43\n"); - -/***/ }), -/* 44 */ -/***/ (function(module, exports) { - -eval("function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanM/NzAzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZjIob2JqKTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///44\n"); - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var $iterators = __webpack_require__(46);\nvar getKeys = __webpack_require__(56);\nvar redefine = __webpack_require__(41);\nvar global = __webpack_require__(15);\nvar hide = __webpack_require__(33);\nvar Iterators = __webpack_require__(49);\nvar wks = __webpack_require__(12);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanM/YWM2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///45\n"); - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\nvar addToUnscopables = __webpack_require__(47);\nvar step = __webpack_require__(48);\nvar Iterators = __webpack_require__(49);\nvar toIObject = __webpack_require__(50);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(52)(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcz9jYWRmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46\n"); - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(12)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(33)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanM/OWM2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///47\n"); - -/***/ }), -/* 48 */ -/***/ (function(module, exports) { - -eval("module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanM/ZDUzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n"); - -/***/ }), -/* 49 */ -/***/ (function(module, exports) { - -eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanM/ODRmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///49\n"); - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(51);\nvar defined = __webpack_require__(24);\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzPzY4MjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50\n"); - -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(11);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzPzYyNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51\n"); - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\nvar LIBRARY = __webpack_require__(16);\nvar $export = __webpack_require__(32);\nvar redefine = __webpack_require__(41);\nvar hide = __webpack_require__(33);\nvar Iterators = __webpack_require__(49);\nvar $iterCreate = __webpack_require__(53);\nvar setToStringTag = __webpack_require__(63);\nvar getPrototypeOf = __webpack_require__(64);\nvar ITERATOR = __webpack_require__(12)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcz8wMWY5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52\n"); - -/***/ }), -/* 53 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\nvar create = __webpack_require__(54);\nvar descriptor = __webpack_require__(40);\nvar setToStringTag = __webpack_require__(63);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(33)(IteratorPrototype, __webpack_require__(12)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcz80MWEwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53\n"); - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(18);\nvar dPs = __webpack_require__(55);\nvar enumBugKeys = __webpack_require__(61);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(38)('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(62).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzJhZWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54\n"); - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var dP = __webpack_require__(34);\nvar anObject = __webpack_require__(18);\nvar getKeys = __webpack_require__(56);\n\nmodule.exports = __webpack_require__(36) ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzPzE0OTUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///55\n"); - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(57);\nvar enumBugKeys = __webpack_require__(61);\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcz8wZDU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n"); - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var has = __webpack_require__(42);\nvar toIObject = __webpack_require__(50);\nvar arrayIndexOf = __webpack_require__(58)(false);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jZTEwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///57\n"); - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(50);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(59);\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcz9jMzY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58\n"); - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var toInteger = __webpack_require__(23);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcz83N2YxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///59\n"); - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var shared = __webpack_require__(13)('keys');\nvar uid = __webpack_require__(17);\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzPzYxM2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///60\n"); - -/***/ }), -/* 61 */ -/***/ (function(module, exports) { - -eval("// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzP2UxMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///61\n"); - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var document = __webpack_require__(15).document;\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzP2ZhYjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///62\n"); - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var def = __webpack_require__(34).f;\nvar has = __webpack_require__(42);\nvar TAG = __webpack_require__(12)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcz83ZjIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63\n"); - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(42);\nvar toObject = __webpack_require__(65);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzPzM4ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64\n"); - -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(24);\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanM/NGJmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///65\n"); - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var dP = __webpack_require__(34).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(36) && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzPzdmN2YiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///66\n"); - -/***/ }), -/* 67 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"abs\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Ficy5qcz9hZjkxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGFicyBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///67\n"); - -/***/ }), -/* 68 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"abs\", function() { return abs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pow\", function() { return pow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sin\", function() { return sin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"asin\", function() { return asin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cos\", function() { return cos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"acos\", function() { return acos; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"tan\", function() { return tan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan\", function() { return atan; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"atan2\", function() { return atan2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"exp\", function() { return exp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sqrt\", function() { return sqrt; });\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n\n\nObject(_namespace__WEBPACK_IMPORTED_MODULE_1__[\"defineInstanceAlias\"])('abs pow sin asin cos acos tan atan atan2 exp sqrt', function (name) {\n return function (n, arg) {\n // Note that .valueOf() here is only required due to a\n // very strange bug in iOS7 that only occurs occasionally\n // in which Math.abs() called on non-primitive numbers\n // returns a completely different number (Issue #400)\n return Math[name](n.valueOf(), arg);\n };\n});\nvar abs = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].abs,\n pow = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].pow,\n sin = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].sin,\n asin = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].asin,\n cos = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].cos,\n acos = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].acos,\n tan = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].tan,\n atan = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].atan,\n atan2 = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].atan2,\n exp = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].exp,\n sqrt = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].sqrt;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvbWF0aEFsaWFzZXMuanM/NDc0NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3VnYXJOdW1iZXIsIHsgZGVmaW5lSW5zdGFuY2VBbGlhcyB9IGZyb20gJy4uL25hbWVzcGFjZSc7XG5cbmRlZmluZUluc3RhbmNlQWxpYXMoJ2FicyBwb3cgc2luIGFzaW4gY29zIGFjb3MgdGFuIGF0YW4gYXRhbjIgZXhwIHNxcnQnLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG4sIGFyZykge1xuICAgICAgLy8gTm90ZSB0aGF0IC52YWx1ZU9mKCkgaGVyZSBpcyBvbmx5IHJlcXVpcmVkIGR1ZSB0byBhXG4gICAgICAvLyB2ZXJ5IHN0cmFuZ2UgYnVnIGluIGlPUzcgdGhhdCBvbmx5IG9jY3VycyBvY2Nhc2lvbmFsbHlcbiAgICAgIC8vIGluIHdoaWNoIE1hdGguYWJzKCkgY2FsbGVkIG9uIG5vbi1wcmltaXRpdmUgbnVtYmVyc1xuICAgICAgLy8gcmV0dXJucyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG51bWJlciAoSXNzdWUgIzQwMClcbiAgICAgIHJldHVybiBNYXRoW25hbWVdKG4udmFsdWVPZigpLCBhcmcpO1xuICAgIH07XG4gIH1cbik7XG5cbmV4cG9ydCBjb25zdCB7IGFicywgcG93LCBzaW4sIGFzaW4sIGNvcywgYWNvcywgdGFuLCBhdGFuLCBhdGFuMiwgZXhwLCBzcXJ0IH0gPSBTdWdhck51bWJlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///68\n"); - -/***/ }), -/* 69 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"acos\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Fjb3MuanM/NDRhMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhY29zIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbWF0aEFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///69\n"); - -/***/ }), -/* 70 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"asin\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2FzaW4uanM/MWIzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhc2luIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbWF0aEFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70\n"); - -/***/ }), -/* 71 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"atan\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2F0YW4uanM/NWUwYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhdGFuIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbWF0aEFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71\n"); - -/***/ }), -/* 72 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"atan2\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2F0YW4yLmpzP2IyNTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgYXRhbjIgYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9tYXRoQWxpYXNlcyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///72\n"); - -/***/ }), -/* 73 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__[\"ceil\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2NlaWwuanM/ZmViMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjZWlsIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvcm91bmRpbmdBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///73\n"); - -/***/ }), -/* 74 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"round\", function() { return round; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"floor\", function() { return floor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ceil\", function() { return ceil; });\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n/* harmony import */ var _roundWithPrecision__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(75);\n\n\n\nObject(_namespace__WEBPACK_IMPORTED_MODULE_1__[\"defineInstanceAlias\"])('round floor ceil', function (name) {\n var fn = Math[name];\n return function (n, place) {\n return place ? Object(_roundWithPrecision__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(n, place, fn) : fn(n);\n };\n});\nvar round = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].round,\n floor = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].floor,\n ceil = _namespace__WEBPACK_IMPORTED_MODULE_1__[\"default\"].ceil;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvcm91bmRpbmdBbGlhc2VzLmpzPzUxMzkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFN1Z2FyTnVtYmVyLCB7IGRlZmluZUluc3RhbmNlQWxpYXMgfSBmcm9tICcuLi9uYW1lc3BhY2UnO1xuaW1wb3J0IHJvdW5kV2l0aFByZWNpc2lvbiBmcm9tICcuL3JvdW5kV2l0aFByZWNpc2lvbic7XG5cbmRlZmluZUluc3RhbmNlQWxpYXMoJ3JvdW5kIGZsb29yIGNlaWwnLCBmdW5jdGlvbihuYW1lKSB7XG4gIGNvbnN0IGZuID0gTWF0aFtuYW1lXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKG4sIHBsYWNlKSB7XG4gICAgcmV0dXJuIHBsYWNlID8gcm91bmRXaXRoUHJlY2lzaW9uKG4sIHBsYWNlLCBmbikgOiBmbihuKTtcbiAgfTtcbn0pO1xuXG5leHBvcnQgY29uc3QgeyByb3VuZCwgZmxvb3IsIGNlaWwgfSA9IFN1Z2FyTnVtYmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///74\n"); - -/***/ }), -/* 75 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (val, place) {\n var fn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Math.round;\n var mult = Math.pow(10, Math.abs(place || 0));\n\n if (place < 0) {\n mult = 1 / mult;\n }\n\n return fn(val * mult) / mult;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvcm91bmRXaXRoUHJlY2lzaW9uLmpzPzQ1ODEiXSwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWwsIHBsYWNlLCBmbiA9IE1hdGgucm91bmQpIHtcbiAgbGV0IG11bHQgPSBNYXRoLnBvdygxMCwgTWF0aC5hYnMocGxhY2UgfHwgMCkpO1xuICBpZiAocGxhY2UgPCAwKSB7XG4gICAgbXVsdCA9IDEgLyBtdWx0O1xuICB9XG4gIHJldHVybiBmbih2YWwgKiBtdWx0KSAvIG11bHQ7XG59XG5cbiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///75\n"); - -/***/ }), -/* 76 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"cos\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Nvcy5qcz9hMTkzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGNvcyBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///76\n"); - -/***/ }), -/* 77 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"exp\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2V4cC5qcz82NmJkIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGV4cCBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///77\n"); - -/***/ }), -/* 78 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__[\"floor\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2Zsb29yLmpzP2E0NTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZmxvb3IgYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9yb3VuZGluZ0FsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///78\n"); - -/***/ }), -/* 79 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(88);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n/* harmony import */ var _util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(90);\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_2__[\"defineInstance\"])('isEven', function (n) {\n return Number.isInteger(n) && Object(_util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(n, 2);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzRXZlbi5qcz85ZWVmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUluc3RhbmNlIH0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuaW1wb3J0IGlzTXVsdGlwbGVPZiBmcm9tICcuL3V0aWwvaXNNdWx0aXBsZU9mJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lSW5zdGFuY2UoJ2lzRXZlbicsIGZ1bmN0aW9uKG4pIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgaXNNdWx0aXBsZU9mKG4sIDIpO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///79\n"); - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -eval("\nvar global = __webpack_require__(15);\nvar has = __webpack_require__(42);\nvar cof = __webpack_require__(11);\nvar inheritIfRequired = __webpack_require__(81);\nvar toPrimitive = __webpack_require__(39);\nvar fails = __webpack_require__(37);\nvar gOPN = __webpack_require__(85).f;\nvar gOPD = __webpack_require__(83).f;\nvar dP = __webpack_require__(34).f;\nvar $trim = __webpack_require__(86).trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(54)(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = __webpack_require__(36) ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n __webpack_require__(41)(global, NUMBER, $Number);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanM/YzVmNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciAkTnVtYmVyID0gZ2xvYmFsW05VTUJFUl07XG52YXIgQmFzZSA9ICROdW1iZXI7XG52YXIgcHJvdG8gPSAkTnVtYmVyLnByb3RvdHlwZTtcbi8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xudmFyIEJST0tFTl9DT0YgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSO1xudmFyIFRSSU0gPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKSB7XG4gICAgaXQgPSBUUklNID8gaXQudHJpbSgpIDogJHRyaW0oaXQsIDMpO1xuICAgIHZhciBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZiAoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSkge1xuICAgICAgdGhpcmQgPSBpdC5jaGFyQ29kZUF0KDIpO1xuICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PT0gNDgpIHtcbiAgICAgIHN3aXRjaCAoaXQuY2hhckNvZGVBdCgxKSkge1xuICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wYlswMV0rJC9pXG4gICAgICAgIGNhc2UgNzk6IGNhc2UgMTExOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gK2l0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiBtYXhDb2RlKSByZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZiAoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKSB7XG4gICROdW1iZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24gKCkgeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSh0b051bWJlcihpdCkpLCB0aGF0LCAkTnVtYmVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoQmFzZSwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKSB7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///80\n"); - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var isObject = __webpack_require__(10);\nvar setPrototypeOf = __webpack_require__(82).set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzPzVkYmMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///81\n"); - -/***/ }), -/* 82 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(10);\nvar anObject = __webpack_require__(18);\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = __webpack_require__(43)(Function.call, __webpack_require__(83).f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanM/OGI5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///82\n"); - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var pIE = __webpack_require__(84);\nvar createDesc = __webpack_require__(40);\nvar toIObject = __webpack_require__(50);\nvar toPrimitive = __webpack_require__(39);\nvar has = __webpack_require__(42);\nvar IE8_DOM_DEFINE = __webpack_require__(35);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(36) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcz8xMWU5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///83\n"); - -/***/ }), -/* 84 */ -/***/ (function(module, exports) { - -eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzPzUyYTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///84\n"); - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(57);\nvar hiddenKeys = __webpack_require__(61).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcz85MDkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///85\n"); - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var $export = __webpack_require__(32);\nvar defined = __webpack_require__(24);\nvar fails = __webpack_require__(37);\nvar spaces = __webpack_require__(87);\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcz9hYTc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///86\n"); - -/***/ }), -/* 87 */ -/***/ (function(module, exports) { - -eval("module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanM/ZmRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///87\n"); - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(32);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(89) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qcz83Y2RmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IGlzSW50ZWdlcjogcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpIH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///88\n"); - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(10);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzPzljMTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///89\n"); - -/***/ }), -/* 90 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (n1, n2) {\n return n1 % n2 === 0;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvaXNNdWx0aXBsZU9mLmpzP2Q4NjUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24objEsIG4yKSB7XG4gIHJldHVybiBuMSAlIG4yID09PSAwO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///90\n"); - -/***/ }), -/* 91 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isFinite\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzRmluaXRlLmpzP2Q1MjEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgaXNGaW5pdGUgYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9udW1iZXJBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91\n"); - -/***/ }), -/* 92 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return isNaN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return isFinite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isInteger\", function() { return isInteger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isSafeInteger\", function() { return isSafeInteger; });\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(66);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n\n\n\nObject(_namespace__WEBPACK_IMPORTED_MODULE_2__[\"defineInstanceAlias\"])('isNaN isFinite isInteger isSafeInteger', function (name) {\n return function (n, place) {\n return Number[name](n);\n };\n});\nvar isNaN = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isNaN,\n isFinite = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isFinite,\n isInteger = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isInteger,\n isSafeInteger = _namespace__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isSafeInteger;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3V0aWwvbnVtYmVyQWxpYXNlcy5qcz8zMDAzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTdWdhck51bWJlciwgeyBkZWZpbmVJbnN0YW5jZUFsaWFzIH0gZnJvbSAnLi4vbmFtZXNwYWNlJztcblxuZGVmaW5lSW5zdGFuY2VBbGlhcygnaXNOYU4gaXNGaW5pdGUgaXNJbnRlZ2VyIGlzU2FmZUludGVnZXInLCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihuLCBwbGFjZSkge1xuICAgIHJldHVybiBOdW1iZXJbbmFtZV0obik7XG4gIH07XG59KTtcblxuZXhwb3J0IGNvbnN0IHsgaXNOYU4sIGlzRmluaXRlLCBpc0ludGVnZXIsIGlzU2FmZUludGVnZXIgfSA9IFN1Z2FyTnVtYmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///92\n"); - -/***/ }), -/* 93 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isInteger\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzSW50ZWdlci5qcz8yM2RiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGlzSW50ZWdlciBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL251bWJlckFsaWFzZXMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///93\n"); - -/***/ }), -/* 94 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _util_isMultipleOf__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(90);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineInstance\"])('isMultipleOf', function (n1, n2) {\n return Object(_util_isMultipleOf__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(n1, n2);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzTXVsdGlwbGVPZi5qcz8wYzkyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUluc3RhbmNlIH0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuaW1wb3J0IGlzTXVsdGlwbGVPZiBmcm9tICcuL3V0aWwvaXNNdWx0aXBsZU9mJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lSW5zdGFuY2UoJ2lzTXVsdGlwbGVPZicsIGZ1bmN0aW9uKG4xLCBuMikge1xuICByZXR1cm4gaXNNdWx0aXBsZU9mKG4xLCBuMik7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///94\n"); - -/***/ }), -/* 95 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isNaN\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzTmFOLmpzPzRhOTkiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgaXNOYU4gYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9udW1iZXJBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///95\n"); - -/***/ }), -/* 96 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_constructor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(88);\n/* harmony import */ var core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_integer__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n/* harmony import */ var _util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(90);\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_2__[\"defineInstance\"])('isOdd', function (n) {\n return Number.isInteger(n) && !Object(_util_isMultipleOf__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(n, 2);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzT2RkLmpzPzFiMzEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lSW5zdGFuY2UgfSBmcm9tICcuL25hbWVzcGFjZSc7XG5pbXBvcnQgaXNNdWx0aXBsZU9mIGZyb20gJy4vdXRpbC9pc011bHRpcGxlT2YnO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVJbnN0YW5jZSgnaXNPZGQnLCBmdW5jdGlvbihuKSB7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmICFpc011bHRpcGxlT2YobiwgMik7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///96\n"); - -/***/ }), -/* 97 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_numberAliases__WEBPACK_IMPORTED_MODULE_0__[\"isSafeInteger\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2lzU2FmZUludGVnZXIuanM/OGE0OCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBpc1NhZmVJbnRlZ2VyIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvbnVtYmVyQWxpYXNlcyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///97\n"); - -/***/ }), -/* 98 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineInstance\"])('log', function (n, base) {\n return Math.log(n) / (base ? Math.log(base) : 1);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL2xvZy5qcz8xYjA3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUluc3RhbmNlIH0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVJbnN0YW5jZSgnbG9nJywgZnVuY3Rpb24obiwgYmFzZSkge1xuICByZXR1cm4gTWF0aC5sb2cobikgLyAoYmFzZSA/IE1hdGgubG9nKGJhc2UpIDogMSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///98\n"); - -/***/ }), -/* 99 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"pow\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbnVtYmVyL3Bvdy5qcz9iMjM3Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHBvdyBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///99\n"); - -/***/ }), -/* 100 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _util_trunc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(101);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineStatic\"])('random', function (n1, n2) {\n if (arguments.length == 0) {\n n1 = 0;\n n2 = 1;\n } else if (arguments.length == 1) {\n n2 = n1;\n n1 = 0;\n }\n\n var min = Math.min(n1, n2);\n var max = Math.max(n1, n2) + 1;\n return Math.floor(Math.random() * (max - min) + min);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9yYW5kb20uanM/MzgxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVTdGF0aWMgfSBmcm9tICcuL25hbWVzcGFjZSc7XG5pbXBvcnQgdHJ1bmMgZnJvbSAnLi91dGlsL3RydW5jJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lU3RhdGljKCdyYW5kb20nLCBmdW5jdGlvbihuMSwgbjIpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgIG4xID0gMDtcbiAgICBuMiA9IDE7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgbjIgPSBuMTtcbiAgICBuMSA9IDA7XG4gIH1cbiAgY29uc3QgbWluID0gTWF0aC5taW4objEsIG4yKTtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgobjEsIG4yKSArIDE7XG4gIHJldHVybiBNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///100\n"); - -/***/ }), -/* 101 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (n) {\n return n | 0;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci91dGlsL3RydW5jLmpzPzU2ZmUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obikge1xuICByZXR1cm4gbiB8IDA7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///101\n"); - -/***/ }), -/* 102 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_roundingAliases__WEBPACK_IMPORTED_MODULE_0__[\"round\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9yb3VuZC5qcz8zMjlmIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHJvdW5kIGFzIGRlZmF1bHQgfSBmcm9tICcuL3V0aWwvcm91bmRpbmdBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///102\n"); - -/***/ }), -/* 103 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"sin\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9zaW4uanM/ZDZkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBzaW4gYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9tYXRoQWxpYXNlcyc7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///103\n"); - -/***/ }), -/* 104 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"sqrt\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci9zcXJ0LmpzPzc1OTMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgc3FydCBhcyBkZWZhdWx0IH0gZnJvbSAnLi91dGlsL21hdGhBbGlhc2VzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///104\n"); - -/***/ }), -/* 105 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _util_mathAliases__WEBPACK_IMPORTED_MODULE_0__[\"tan\"]; });\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci90YW4uanM/ODFlYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyB0YW4gYXMgZGVmYXVsdCB9IGZyb20gJy4vdXRpbC9tYXRoQWxpYXNlcyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///105\n"); - -/***/ }), -/* 106 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_string_from_code_point__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);\n/* harmony import */ var core_js_modules_es6_string_from_code_point__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_string_from_code_point__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_1__[\"defineInstance\"])('toChar', function (n) {\n // Note that fromCharCode was historically 2x faster than\n // fromCodePoint, however this no longer seems to be the case.\n // https://jsperf.com/fromcharcode-vs-fromcodepoint/6\n return String.fromCodePoint(n);\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci90b0NoYXIuanM/ZDNhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVJbnN0YW5jZSB9IGZyb20gJy4vbmFtZXNwYWNlJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lSW5zdGFuY2UoJ3RvQ2hhcicsIGZ1bmN0aW9uKG4pIHtcbiAgLy8gTm90ZSB0aGF0IGZyb21DaGFyQ29kZSB3YXMgaGlzdG9yaWNhbGx5IDJ4IGZhc3RlciB0aGFuXG4gIC8vIGZyb21Db2RlUG9pbnQsIGhvd2V2ZXIgdGhpcyBubyBsb25nZXIgc2VlbXMgdG8gYmUgdGhlIGNhc2UuXG4gIC8vIGh0dHBzOi8vanNwZXJmLmNvbS9mcm9tY2hhcmNvZGUtdnMtZnJvbWNvZGVwb2ludC82XG4gIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChuKTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///106\n"); - -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var $export = __webpack_require__(32);\nvar toAbsoluteIndex = __webpack_require__(59);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcz81Njk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyICRmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCEhJGZyb21Db2RlUG9pbnQgJiYgJGZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDEpLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuMiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKVxuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChhTGVuID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///107\n"); - -/***/ }), -/* 108 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var _util_toOrdinal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(109);\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_namespace__WEBPACK_IMPORTED_MODULE_0__[\"defineInstance\"])('toOrdinal', _util_toOrdinal__WEBPACK_IMPORTED_MODULE_1__[\"default\"]));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL251bWJlci90b09yZGluYWwuanM/NjVlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVJbnN0YW5jZSB9IGZyb20gJy4vbmFtZXNwYWNlJztcbmltcG9ydCB0b09yZGluYWwgZnJvbSAnLi4vdXRpbC90b09yZGluYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVJbnN0YW5jZSgndG9PcmRpbmFsJywgdG9PcmRpbmFsKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///108\n"); - -/***/ }), -/* 109 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\nfunction getSuffix(n) {\n if (n >= 11 && n <= 13) {\n return 'th';\n } else {\n switch (Math.abs(n) % 10) {\n case 1:\n return 'st';\n\n case 2:\n return 'nd';\n\n case 3:\n return 'rd';\n\n default:\n return 'th';\n }\n }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (n) {\n if (!n || !isFinite(n)) {\n throw new RangeError('Invalid number');\n }\n\n return n + getSuffix(n);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWwvdG9PcmRpbmFsLmpzP2Y0OTkiXSwic291cmNlc0NvbnRlbnQiOlsiXG5mdW5jdGlvbiBnZXRTdWZmaXgobikge1xuICBpZiAobiA+PSAxMSAmJiBuIDw9IDEzKSB7XG4gICAgcmV0dXJuICd0aCc7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoKE1hdGguYWJzKG4pICUgMTApIHtcbiAgICAgIGNhc2UgMTogIHJldHVybiAnc3QnO1xuICAgICAgY2FzZSAyOiAgcmV0dXJuICduZCc7XG4gICAgICBjYXNlIDM6ICByZXR1cm4gJ3JkJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAndGgnO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuKSB7XG4gIGlmICghbiB8fCAhaXNGaW5pdGUobikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBudW1iZXInKTtcbiAgfVxuICByZXR1cm4gbiArIGdldFN1ZmZpeChuKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n"); - -/***/ }), -/* 110 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es6_number_is_safe_integer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(111);\n/* harmony import */ var core_js_modules_es6_number_is_safe_integer__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_safe_integer__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_number_is_finite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(112);\n/* harmony import */ var core_js_modules_es6_number_is_finite__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_finite__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_number_is_nan__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(113);\n/* harmony import */ var core_js_modules_es6_number_is_nan__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_number_is_nan__WEBPACK_IMPORTED_MODULE_2__);\n// TODO: These are better included using webpack.config.js\n// But that doesn't seem to work with Babel at the moment.\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3BvbHlmaWxscy5qcz8wNjc0Il0sInNvdXJjZXNDb250ZW50IjpbIlxuLy8gVE9ETzogVGhlc2UgYXJlIGJldHRlciBpbmNsdWRlZCB1c2luZyB3ZWJwYWNrLmNvbmZpZy5qc1xuLy8gQnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aCBCYWJlbCBhdCB0aGUgbW9tZW50LlxuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXInXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZSdcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJ1xuIl0sIm1hcHBpbmdzIjoiQUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///110\n"); - -/***/ }), -/* 111 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(32);\nvar isInteger = __webpack_require__(89);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcz9iMWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxZmZmZmZmZmZmZmZmZjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///111\n"); - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(32);\nvar _isFinite = __webpack_require__(15).isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcz9mY2EwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4yIE51bWJlci5pc0Zpbml0ZShudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///112\n"); - -/***/ }), -/* 113 */ -/***/ (function(module, exports, __webpack_require__) { - -eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(32);\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcz9lZTFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///113\n"); - -/***/ }) -/******/ ]); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index e27a140cc..000000000 --- a/package-lock.json +++ /dev/null @@ -1,11297 +0,0 @@ -{ - "name": "sugar", - "version": "3.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/cli": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.2.0.tgz", - "integrity": "sha512-FLteTkEoony0DX8NbnT51CmwmLBzINdlXmiJCSqCLmqWCDA/xk8EITPWqwDnVLbuK0bsZONt/grqHnQzQ15j0Q==", - "requires": { - "chokidar": "^2.0.3", - "commander": "^2.8.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.10", - "mkdirp": "^0.5.1", - "output-file-sync": "^2.0.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.0.tgz", - "integrity": "sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.0", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.2.0", - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.6", - "@babel/types": "^7.2.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.10", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", - "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", - "dev": true, - "requires": { - "@babel/types": "^7.2.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", - "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", - "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", - "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, - "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" - } - }, - "@babel/helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", - "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", - "dev": true, - "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.2.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", - "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.2.0" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", - "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", - "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.0.tgz", - "integrity": "sha512-aPCEkrhJYebDXcGTAP+cdUENkH7zqOlgbKwLbghjjHpJRJBWM/FSlCjMoPGA8oUdiMfOrk3+8EFPLLb5r7zj2w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.1.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", - "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", - "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", - "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", - "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", - "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", - "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", - "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.1.0", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", - "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", - "dev": true, - "requires": { - "regenerator-transform": "^0.13.3" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", - "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.0.tgz", - "integrity": "sha512-7TtPIdwjS/i5ZBlNiQePQCovDh9pAhVbp/nGVRBZuUdBiVRThyyLend3OHobc0G+RLCPPAN70+z/MAMhsgJd/A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", - "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", - "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" - } - }, - "@babel/polyfill": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", - "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", - "dev": true, - "requires": { - "core-js": "^2.5.7", - "regenerator-runtime": "^0.11.1" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.0.tgz", - "integrity": "sha512-haGR38j5vOGVeBatrQPr3l0xHbs14505DcM57cbJy48kgMFvvHHoYEhHuRV+7vi559yyAUAVbTWzbK/B/pzJng==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.2.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.2.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.2.0", - "@babel/plugin-transform-classes": "^7.2.0", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.2.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" - } - }, - "@babel/runtime": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", - "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", - "requires": { - "regenerator-runtime": "^0.12.0" - } - }, - "@babel/runtime-corejs2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.2.0.tgz", - "integrity": "sha512-kPfmKoRI8Hpo5ZJGACWyrc9Eq1j3ZIUpUAQT2yH045OuYpccFJ9kYA/eErwzOM2jeBG1sC8XX1nl1EArtuM8tg==", - "requires": { - "core-js": "^2.5.7", - "regenerator-runtime": "^0.12.0" - } - }, - "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.1.2", - "@babel/types": "^7.1.2" - } - }, - "@babel/traverse": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", - "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.6", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.6", - "@babel/types": "^7.1.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.10" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", - "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true - }, - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } - } - }, - "ajv": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", - "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", - "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", - "dev": true - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - } - } - }, - "babel-loader": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz", - "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "util.promisify": "^1.0.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-add-module-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz", - "integrity": "sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw==", - "requires": { - "chokidar": "^2.0.4" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es3-member-expression-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", - "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es3-property-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", - "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base62": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.8.tgz", - "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==", - "dev": true - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.5.tgz", - "integrity": "sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000912", - "electron-to-chromium": "^1.3.86", - "node-releases": "^1.0.5" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", - "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000916", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000916.tgz", - "integrity": "sha512-D6J9jloPm2MPkg0PXcODLMQAJKkeixKO9xhqTUMvtd44MtTYMyyDXPQ2Lk9IgBq5FH0frwiPa/N/w8ncQf7kIQ==", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "closure-compiler-stream": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/closure-compiler-stream/-/closure-compiler-stream-0.1.15.tgz", - "integrity": "sha1-FqwTfkK18w8u4h/ztPKnX20IT8U=", - "dev": true, - "requires": { - "temp-write": "~0.3.1", - "through2": "~0.5.1" - }, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "dev": true, - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - } - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", - "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "coveralls": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", - "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", - "dev": true, - "requires": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.79.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.3.88", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz", - "integrity": "sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A==", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es3ify": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/es3ify/-/es3ify-0.2.2.tgz", - "integrity": "sha1-Xa4+ZQ5b42hLiAZlE9Uo0JJimGI=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "jstransform": "~11.0.0", - "through": "~2.3.4" - } - }, - "es3ify-loader": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/es3ify-loader/-/es3ify-loader-0.2.0.tgz", - "integrity": "sha1-i4QjV2vb0eo5xZvhMLzWxYxGEDY=", - "dev": true, - "requires": { - "es3ify": "0.2.x" - } - }, - "es5-shim": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.12.tgz", - "integrity": "sha512-MjoCAHE6P2Dirme70Cxd9i2Ng8rhXiaVSsxDWdSwimfLERJL/ypR2ed2rTYkeeYrMk8gq281dzKLiGcdrmc8qg==", - "dev": true - }, - "es6-shim": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.4.tgz", - "integrity": "sha512-oJidbXjN/VWXZJs41E9JEqWzcFbjt43JupimIoVX82Thzt5qy1CiYezdhRmWkj3KOuwJ106IG/ZZrcFC6fgIUQ==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esm": { - "version": "3.0.84", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.0.84.tgz", - "integrity": "sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw==", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "~1.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minipass": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "optional": true - }, - "needle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", - "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "optional": true - }, - "rc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "google-closure-compiler": { - "version": "20180716.0.1", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180716.0.1.tgz", - "integrity": "sha1-SN6ysd/kwRity3DdEEz0+iuVCNc=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "google-closure-compiler-linux": "^20180716.0.0", - "google-closure-compiler-osx": "^20180716.0.0", - "vinyl": "^2.0.1", - "vinyl-sourcemaps-apply": "^0.2.0" - } - }, - "google-closure-compiler-linux": { - "version": "20180716.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20180716.0.0.tgz", - "integrity": "sha512-Lb/z7QCd4IKLBp39BCs+yhwsM7/5P9uLwZhR4D1RulwzOrj8GIz7hg26hqRSz88m/+dJMwKRRgV2XGw53e3D4A==", - "dev": true, - "optional": true - }, - "google-closure-compiler-osx": { - "version": "20180716.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20180716.0.0.tgz", - "integrity": "sha1-VpHAdYBXjf6jIF6QpqKWjSO4W9k=", - "dev": true, - "optional": true - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" - }, - "dependencies": { - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - }, - "dependencies": { - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - } - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - } - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - }, - "dependencies": { - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - } - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - }, - "dependencies": { - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - } - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - } - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - }, - "dependencies": { - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - }, - "dependencies": { - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - } - } - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "dependencies": { - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - } - } - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - } - } - } - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - } - } - } - } - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - }, - "dependencies": { - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - } - } - } - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - }, - "dependencies": { - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - } - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - }, - "dependencies": { - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - } - } - } - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - } - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - }, - "dependencies": { - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - }, - "dependencies": { - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - } - } - } - } - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - }, - "dependencies": { - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - }, - "dependencies": { - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - } - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - }, - "dependencies": { - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - } - } - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - } - } - } - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - } - } - } - } - } - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - }, - "dependencies": { - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - }, - "dependencies": { - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - } - } - } - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - }, - "dependencies": { - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "dependencies": { - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "dependencies": { - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - }, - "dependencies": { - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - }, - "dependencies": { - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - } - } - } - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - }, - "dependencies": { - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - } - } - } - } - } - } - }, - "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - }, - "dependencies": { - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - }, - "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", - "dev": true - } - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" - }, - "dependencies": { - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=", - "dev": true - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - } - } - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - } - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - }, - "dependencies": { - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - } - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - } - } - } - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - }, - "dependencies": { - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "~0.1.0" - }, - "dependencies": { - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - } - } - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - }, - "dependencies": { - "natives": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", - "integrity": "sha1-Lw8iT8mn3VNAfHZnyEz42+dz3lg=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } - } - } - } - }, - "gulp-file": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.3.0.tgz", - "integrity": "sha1-6MTXY/Em+zMy/EFuPR70btZ9jQ0=", - "dev": true, - "requires": { - "gulp-util": "^2.2.14", - "through2": "^0.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^0.2.0", - "multipipe": "^0.1.0", - "through2": "^0.5.0", - "vinyl": "^0.2.1" - }, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "minimist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - }, - "dependencies": { - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", - "dev": true, - "requires": { - "clone-stats": "~0.0.1" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - }, - "dependencies": { - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - } - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.18.0.tgz", - "integrity": "sha512-DWT87JHCSdCPCxbqBpS6Z2ajAt+MvrJq8I4xrpQljCvzODO5/fiquBp20a3sN6yCJvFbCRyYvJOHjpzkPTKJyA==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true - } - } - } - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - } - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - } - } - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true, - "optional": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true, - "optional": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - } - } - } - } - } - } - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - } - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "js-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", - "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "jstransform": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", - "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", - "dev": true, - "requires": { - "base62": "^1.1.0", - "commoner": "^0.10.1", - "esprima-fb": "^15001.1.0-dev-harmony-fb", - "object-assign": "^2.0.0", - "source-map": "^0.4.2" - }, - "dependencies": { - "esprima-fb": { - "version": "15001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", - "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1" - } - }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true - }, - "lodash._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true, - "requires": { - "lodash._escapehtmlchar": "~2.4.1", - "lodash._reunescapedhtml": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true, - "requires": { - "lodash._escapestringchar": "~2.4.1", - "lodash._reinterpolate": "~2.4.1", - "lodash.defaults": "~2.4.1", - "lodash.escape": "~2.4.1", - "lodash.keys": "~2.4.1", - "lodash.templatesettings": "~2.4.1", - "lodash.values": "~2.4.1" - } - }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~2.4.1", - "lodash.escape": "~2.4.1" - } - }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", - "dev": true, - "requires": { - "lodash.keys": "~2.4.1" - } - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge-stream": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.8.tgz", - "integrity": "sha1-SKB7O0oSHXSj7b/c20sIrb8CQLE=", - "dev": true, - "requires": { - "through2": "^0.6.1" - }, - "dependencies": { - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", - "dev": true, - "requires": { - "mime-db": "~1.35.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natives": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", - "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==", - "dev": true - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-releases": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.0.tgz", - "integrity": "sha512-+qV91QMDBvARuPxUEfI/mRF/BY+UAkTIn3pvmvM2iOLIRvv6RNYklFXBgrkky6P1wXUqQW1P3qKlWxxy4JZbfg==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "output-file-sync": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", - "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", - "requires": { - "graceful-fs": "^4.1.11", - "is-plain-obj": "^1.1.0", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - } - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", - "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-polyfill": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", - "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ready-test": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/ready-test/-/ready-test-1.0.15.tgz", - "integrity": "sha512-gvjIZsrkNK2jklwulASRayvr/g+1WlzcU2PHda2JJAxyg/0L0lAPYp7ieRy/ikjWp6OPlUFgFICr7KPd/MKpxg==", - "dev": true, - "requires": { - "argv": "0.0.2", - "chalk": "^2.4.1", - "chokidar": "^2.0.4", - "esm": "^3.0.66", - "glob": "^7.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - }, - "regenerator-transform": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", - "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpu-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", - "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^7.0.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.0.2" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-defineproperty-webpack-plugin": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/remove-defineproperty-webpack-plugin/-/remove-defineproperty-webpack-plugin-0.0.3.tgz", - "integrity": "sha512-MisJUwbQQQBi7CeDZcN680/KTFcgyWXpbzOMY41lL8Q8AvVBNvmrv+QxtrPsiyxsKjXSC8cyWGSxi3IWikZonA==", - "requires": { - "acorn-dynamic-import": "^2.0.2", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "requires": { - "acorn": "^4.0.3" - } - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-replace-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-2.1.1.tgz", - "integrity": "sha512-0Nvw1LDclF45AFNuYPcD2Jvkv0mwb/dQSnJZMvhqGrT+zzmrpG3OJFD600qfQfNUd5aqfp7fCm2mQMfF7zLbyQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true - }, - "temp-write": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-0.3.1.tgz", - "integrity": "sha1-C6Pkha8CkKWO6iHmsdO0v1QGPug=", - "dev": true, - "requires": { - "graceful-fs": "^3.0.1", - "mkdirp": "^0.5.0", - "uuid": "^1.4.1" - } - }, - "terser": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.11.0.tgz", - "integrity": "sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1", - "source-map-support": "~0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", - "dev": true, - "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "terser": "^3.8.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", - "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "uuid": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", - "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - } - } - }, - "webpack": { - "version": "4.27.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.27.1.tgz", - "integrity": "sha512-WArHiLvHrlfyRM8i7f+2SFbr/XbQ0bXqTkPF8JpHOzub5482Y3wx7rEO8stuLGOKOgZJcqcisLhD7LrM/+fVMw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", - "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "global-modules-path": "^2.3.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - } - } - } - } -} diff --git a/package.json b/package.json index afc0225d9..7272959d0 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.15", + "ready-test": "^1.0.17", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", diff --git a/src/core/index.js b/src/core/index.js index 914d890ce..28f6ce38e 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -119,8 +119,96 @@ function createExport() { return obj; } -export function extend() { - console.info('EXTENDINNNNNNNn'); +function methodIsIncluded(methodName, opt) { + return !opt.methods || opt.methods.includes(methodName); +} + +function methodIsExcluded(methodName, opt) { + return opt.exclude && opt.exclude.includes(methodName); +} + +function methodCanBeExtended(methodName, opt) { + return !opt || (methodIsIncluded(methodName, opt) && !methodIsExcluded(methodName, opt)); +} + +function collectExtendOptions(args) { + if (args.length) { + if (typeof args[0] == 'string') { + return { + methods: args + }; + } else { + return args[0]; + } + } +} + +class SugarNamespace { + + constructor(raw) { + this.raw = raw; + } + + valueOf() { + return this.raw; + } +} + + +export function extend(...args) { + forEachProperty(Sugar, (key, val) => { + if (val.prototype instanceof SugarNamespace) { + extendNamespace(val, key, args); + } + }); +} + +export function extendNamespace(namespace, name, args) { + const native = globalContext[name]; + const opt = collectExtendOptions(args); + + forEachProperty(namespace, (methodName, fn) => { + if (methodCanBeExtended(methodName, opt)) { + const instanceFn = getInstanceMethod(namespace, methodName); + if (instanceFn && canExtendNativePrototype(native)) { + extendNative(native.prototype, methodName, instanceFn); + } else { + extendNative(native, methodName, fn); + } + } + }); +} + +function canExtendNativePrototype(native) { + return native !== Object; +} + +function extendNative(target, methodName, fn) { + // Built-in methods MUST be configurable, writable, and non-enumerable. + Object.defineProperty(target, methodName, { + writable: true, + configurable: true, + value: fn + }); +} + +const methodsById = {}; + +function getInstanceMethod(namespace, methodName) { + return methodsById[getMethodId(namespace, methodName)]; +} + +function storeInstanceMethod(namespace, methodName, fn) { + methodsById[getMethodId(namespace, methodName)] = fn; +} + +function clearInstanceMethod(namespace, methodName) { + delete methodsById[getMethodId(namespace, methodName)]; +} + +function getMethodId(namespace, methodName) { + // Only need to store instance methods. + return namespace.toString() + '#' + methodName; } function assertMethodDoesNotExist(namespace, methodName) { @@ -129,16 +217,21 @@ function assertMethodDoesNotExist(namespace, methodName) { } } -function defineStatic(namespace, methodName, fn) { +function defineStatic(namespace, methodName, staticFn) { assertMethodDoesNotExist(namespace, methodName); - return namespace[methodName] = fn; + // Clear an instance method that previously exists. + // Sugar will error when redefining methods, so this + // is mostly for the test suite. + clearInstanceMethod(namespace, methodName); + namespace[methodName] = staticFn; } -function defineInstance(namespace, methodName, fn) { +function defineInstance(namespace, methodName, staticFn) { assertMethodDoesNotExist(namespace, methodName); - const instance = wrapStaticMethodAsInstance(namespace, fn); - namespace[methodName] = fn; - namespace.prototype[methodName] = wrapChainableResult(instance); + const instanceFn = wrapStaticMethodAsInstance(namespace, staticFn); + storeInstanceMethod(namespace, methodName, instanceFn); + namespace.prototype[methodName] = wrapChainableResult(instanceFn); + namespace[methodName] = staticFn; } function wrapStaticMethodAsInstance(namespace, fn) { @@ -182,10 +275,10 @@ export function createNamespace(name) { return Sugar[name]; } - class SugarChainable { + class SugarChainable extends SugarNamespace { - constructor(raw) { - this.raw = raw; + static extend(...args) { + extendNamespace(SugarChainable, name, args); } static defineStatic(...args) { @@ -208,10 +301,6 @@ export function createNamespace(name) { return SUGAR + name; } - valueOf() { - return this.raw; - } - } mapNativeToChainable(SugarChainable, name); diff --git a/test/chainable.js b/test/chainable.js index f477c4860..d7354d512 100644 --- a/test/chainable.js +++ b/test/chainable.js @@ -31,7 +31,8 @@ describe('Chainable', function () { it('should be able to accept an arbitrary number of arguments', function() { Sugar.Number.defineInstance('add', function() { - return Array.prototype.slice.call(arguments).reduce(function(sum, n) { + var args = Array.prototype.slice.call(arguments); + return args.reduce(function(sum, n) { return sum + n; }, 0); }); @@ -58,11 +59,11 @@ describe('Chainable', function () { it('should allow chaining across namespaces', function() { // Note that Object is being used here as a safeguard as // it's behavior differs slightly when extending. - Sugar.Number.defineInstance('passObject', pass); - Sugar.Object.defineInstance('passNumber', pass); - assertEqual(new Sugar.Number().passObject({}).passNumber(1).raw, 1); - delete Sugar.Number.passObject; - delete Sugar.Object.passNumber; + Sugar.Number.defineInstance('argObject', arg); + Sugar.Object.defineInstance('argNumber', arg); + assertEqual(new Sugar.Number().argObject({}).argNumber(1).raw, 1); + delete Sugar.Number.argObject; + delete Sugar.Object.argNumber; }); }); @@ -70,56 +71,56 @@ describe('Chainable', function () { describe('Wrapping Behavior', function() { beforeEach(function() { - Sugar.Number.defineInstance('pass', pass); + Sugar.Number.defineInstance('arg', arg); }); afterEach(function() { - delete Sugar.Number.pass; + delete Sugar.Number.arg; }); it('should not wrap boolean result', function() { - assertFalse(new Sugar.Number(1).pass(false)); - assertTrue(new Sugar.Number(2).pass(true)); + assertFalse(new Sugar.Number(1).arg(false)); + assertTrue(new Sugar.Number(2).arg(true)); }); it('should not wrap null', function() { - assertNull(new Sugar.Number(1).pass(null)); + assertNull(new Sugar.Number(1).arg(null)); }); it('should not wrap undefined', function() { - assertUndefined(new Sugar.Number(1).pass(undefined)); + assertUndefined(new Sugar.Number(1).arg(undefined)); }); it('should wrap empty string', function() { - assertEqual(new Sugar.Number(1).pass('').raw, ''); + assertEqual(new Sugar.Number(1).arg('').raw, ''); }); it('should wrap 0', function() { - assertEqual(new Sugar.Number(1).pass(0).raw, 0); + assertEqual(new Sugar.Number(1).arg(0).raw, 0); }); it('should wrap NaN', function() { - assertNaN(new Sugar.Number(1).pass(NaN).raw); + assertNaN(new Sugar.Number(1).arg(NaN).raw); }); it('should wrap object result and initialize namespace', function() { ensureNamespaceNotInitialized('Object', function() { var obj = {}; - assertEqual(new Sugar.Number(1).pass(obj).raw, obj); + assertEqual(new Sugar.Number(1).arg(obj).raw, obj); assertTrue(!!Sugar.Object); }); }); it('should not initialize namespace for custom classes', function() { function Foo() {} - new Sugar.Number(1).pass(new Foo); + new Sugar.Number(1).arg(new Foo); assertTrue(!Sugar.Foo); }); it('should not initialize namespace for custom classes with same name as built-ins', function() { ensureNamespaceNotInitialized('Array', function() { function Array() {} - new Sugar.Number(1).pass(new Array); + new Sugar.Number(1).arg(new Array); assertTrue(!Sugar.Array); }); }); @@ -127,7 +128,7 @@ describe('Chainable', function () { it('should not fail when object has no prototype', function() { if (Object.create) { var obj = Object.create(null); - assertEqual(new Sugar.Number(1).pass(obj).raw, obj); + assertEqual(new Sugar.Number(1).arg(obj).raw, obj); } }); diff --git a/test/core.js b/test/core.js index d81f105d3..2cd3e9c28 100644 --- a/test/core.js +++ b/test/core.js @@ -79,6 +79,7 @@ describe('Core', function () { }); it('should be able to define static aliases', function() { + // TODO: maybe this should be a comma?? Sugar.Number.defineStaticAlias('add1 add2', alias); assertEqual(Sugar.Number.add1(1), 2); assertEqual(Sugar.Number.add2(1), 3); diff --git a/test/extended.js b/test/extended.js index a6c564e5a..39825fbff 100644 --- a/test/extended.js +++ b/test/extended.js @@ -1,40 +1,151 @@ 'use strict'; -fdescribe('Extended', function () { +describe('Extended', function () { - // TODO: except vs exclude? - // TODO: defineAlias vs defineSimilar??? - // TODO: how to handle enhanced methods? flags?? defineMathMethods? - // TODO: Sugar.Array.extend({ enhanceArray: false }); - // TODO: document API changes in changelog! + Sugar.createNamespace('Number'); + Sugar.createNamespace('String'); + Sugar.createNamespace('Object'); - it('should alias global extend method to all namespaces', function() { - Sugar.extend(); - }); + describe('Static methods', function() { - it('should allow extending object prototypes', function() { - Sugar.extend({ - dangerousObjectPrototype: true + beforeEach(function() { + Sugar.Number.defineStatic('add', add); + Sugar.Object.defineStatic('arg', arg); }); - }); - it('should allow extending by namespace ??', function() { - Sugar.extend([ - namespaces: [String, Number], - exclude: [String, Number] - ]); - }); + afterEach(function() { + // TODO: method for this? + delete Sugar.Number.add; + delete Sugar.Object.arg; + delete Number.add; + delete Object.arg; + }); + + it('should extend static Number methods', function() { + Sugar.extend(); + assertInstanceOf(Number.add, Function); + }); + + it('should extend static Object methods', function() { + Sugar.extend(); + assertInstanceOf(Object.arg, Function); + }); - it('should extend instance methods', function() { - Sugar.Array.extend(); - // assert no non-array methods are extended }); - it('should extend specific methods by array argument ??', function() { - Sugar.Number.extend(['add']); - assertEqual((5).add(1,2,3,4,5,6,7,8,9,10), 60); + describe('Instance methods', function() { + + beforeEach(function() { + Sugar.Number.defineInstance('add', add); + Sugar.String.defineInstance('add', add); + Sugar.Object.defineInstance('arg', arg); + }); + + afterEach(function() { + // TODO: method for this? + delete Sugar.Number.add; + delete Sugar.String.add; + delete Sugar.Object.arg; + delete Number.prototype.add; + delete String.prototype.add; + }); + + describe('Basic', function() { + + it('should extend all namespaces', function() { + Sugar.extend(); + assertEqual((5).add(5), 10); + assertEqual('a'.add('b'), 'ab'); + }); + + it('should extend single namespace', function() { + Sugar.Number.extend(); + assertEqual((5).add(5), 10); + assertUndefined(String.prototype.add); + }); + + it('should not extend Object.prototype', function() { + Sugar.extend(); + assertUndefined(Object.prototype.arg); + }); + + it('should allow extended methods to be configurable', function() { + Sugar.extend(); + assertNoError(function() { + delete Number.prototype.add; + }); + }); + + it('should allow extended methods to be writable', function() { + Sugar.extend(); + assertNoError(function() { + Number.prototype.add = null; + }); + }); + + }); + + xdescribe('Options', function() { + + it('should allow array as shortcut for methods param', function() { + // TODO: decide syntax + Sugar.Number.extend('add', 'mult'); + assertEqual((5).add(5), 10); + assertEqual((5).mult(5), 25); + }); + + it('should allow methods param', function() { + // TODO: decide syntax + Sugar.Number.extend({ + methods: ['add'] + }); + assertEqual((5).add(5), 10); + assertUndefined((5).mult); + }); + + it('should allow exclude param', function() { + // TODO: decide syntax + Sugar.Number.extend({ + exclude: ['add'] + }); + assertUndefined((5).add); + assertEqual((5).mult(5), 25); + }); + + it('should allow extending by namespace ??', function() { + Sugar.extend({ + namespaces: [String, Number], + exclude: [String, Number] + }); + }); + + }); + + xdescribe('Enhancing', function() { + + it('should allow overwrite param', function() { + // TODO: work this out + Sugar.Number.defineInstance('every', stringCheck, function() { + }); + + Sugar.Number.extend({ + overwrite: false + }); + assertUndefined((5).add); + assertEqual((5).mult(5), 25); + }); + + }); + }); + // TODO: except vs exclude? + // TODO: defineAlias vs defineSimilar??? + // TODO: how to handle enhanced methods? flags?? defineMathMethods? + // TODO: Sugar.Array.extend({ enhanceArray: false }); + // TODO: document API changes in changelog! + + /* it('should accept methods param', function() { Sugar.Number.extend({ methods: ['add'] @@ -63,6 +174,7 @@ fdescribe('Extended', function () { equal(Date.foo(), 'foo!', 'hijacked global is now the target'); Date = nativeDate; }); + */ }); diff --git a/test/helpers/methods.js b/test/helpers/methods.js index 3a19a1bfb..1915c696a 100644 --- a/test/helpers/methods.js +++ b/test/helpers/methods.js @@ -1,5 +1,5 @@ -pass = function(instance, obj) { - return obj; +arg = function(obj, arg) { + return arg; }; add = function(n1, n2) { diff --git a/test/helpers/module.js b/test/helpers/module.js index 92d1b3f4e..0df34ab23 100644 --- a/test/helpers/module.js +++ b/test/helpers/module.js @@ -22,7 +22,7 @@ assertNamedExports = function(module) { var exportExists = typeof module[methodName] === 'function'; var methodExists = typeof namespace[methodName] === 'function'; - var msg = 'method ' + methodName + ' should be a named export and namespace metho and namespace methodd'; + var msg = 'method ' + methodName + ' should be a named export and namespace method'; assertTrue(exportExists && methodExists, msg); }); } diff --git a/test/index.html b/test/index.html index b65b1fdc4..fefb9fb2f 100644 --- a/test/index.html +++ b/test/index.html @@ -14,6 +14,7 @@ + diff --git a/test/index.js b/test/index.js index 5f3cbe47d..83637097e 100644 --- a/test/index.js +++ b/test/index.js @@ -13,4 +13,5 @@ import './helpers/namespace'; import './core'; import './number'; import './modules'; +import './extended'; import './chainable'; diff --git a/webpack.config.js b/webpack.config.js index 005cc520c..76ff11d95 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,7 +3,7 @@ const path = require('path'); const VERSION = require('./package.json').version; module.exports = { - mode: 'none', + mode: 'development', devtool: 'cheap-module-eval-source-map', output: { filename: 'sugar.js' From 5e4afde12bf935d358d642c52e7646623643f5d2 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 15 Dec 2018 04:03:22 +0900 Subject: [PATCH 003/191] more tests, core work --- .eslintignore | 7 + .eslintrc | 32 +++ .eslintrc.json | 14 -- src/array/index.js | 0 src/core/NamespaceStore.js | 29 +++ src/core/index.js | 277 ++++++++++++++------------ src/es5.js | 1 - src/index.js | 13 +- src/number/random.js | 1 - src/number/sin.js | 1 - src/number/util/mathAliases.js | 31 ++- src/number/util/numberAliases.js | 2 +- src/number/util/roundWithPrecision.js | 1 - src/object/index.js | 0 src/polyfills.js | 6 +- src/string/index.js | 0 src/util/toOrdinal.js | 13 +- test/.eslintrc | 46 +++++ test/.eslintrc.json | 10 - test/chainable.js | 20 +- test/core.js | 10 +- test/extended.js | 143 ++++++++++--- test/helpers/module.js | 28 +-- test/helpers/suite.js | 5 +- test/index.js | 6 +- test/modules.js | 23 ++- test/number.js | 2 +- 27 files changed, 467 insertions(+), 254 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc delete mode 100644 .eslintrc.json create mode 100644 src/array/index.js create mode 100644 src/core/NamespaceStore.js delete mode 100644 src/es5.js create mode 100644 src/object/index.js create mode 100644 src/string/index.js create mode 100644 test/.eslintrc delete mode 100644 test/.eslintrc.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..846b5d86e --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +test/tests +test/suite +test/rhino +test/node +test/browser +dist +lib diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..e55b1ba37 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,32 @@ +{ + "extends": "eslint:recommended", + "env": { + "node": true, + "browser": true + }, + "rules": { + "semi": ["error"], + "new-cap": ["error"], + "new-parens": ["error"], + "keyword-spacing": ["error"], + "no-multiple-empty-lines": ["error"], + "object-shorthand": ["error", "consistent"], + "block-scoped-var": ["error"], + "operator-linebreak": ["error", "before"], + "space-before-function-paren": ["error", "never"], + "quotes": ["error", "single", "avoid-escape"], + "space-before-blocks": ["error", "always"], + "object-curly-newline": ["error", { + "consistent": true + }], + "padded-blocks": ["error", { + "classes": "always" + }], + "indent": ["error", 2, { + "SwitchCase": 1 + }], + }, + "parserOptions": { + "sourceType": "module" + } +} diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 42d88e15e..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "eslint:recommended", - "env": { - "es6": true, - "node": true, - "browser": true - }, - "rules": { - "semi": 2 - }, - "parserOptions": { - "sourceType": "module" - } -} diff --git a/src/array/index.js b/src/array/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/core/NamespaceStore.js b/src/core/NamespaceStore.js new file mode 100644 index 000000000..f45b7db11 --- /dev/null +++ b/src/core/NamespaceStore.js @@ -0,0 +1,29 @@ + +export default class NamespaceStore { + + constructor() { + this.static = {}; + this.instance = {}; + } + + has(name, isInstance) { + return this.getStore(isInstance).hasOwnProperty(name); + } + + get(name, isInstance) { + return this.getStore(isInstance)[name]; + } + + set(name, val, isInstance) { + this.getStore(isInstance)[name] = val; + } + + remove(name, isInstance) { + delete this.getStore(isInstance)[name]; + } + + getStore(isInstance) { + return isInstance ? this.instance : this.static; + } + +} diff --git a/src/core/index.js b/src/core/index.js index 28f6ce38e..3b789fa99 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,3 +1,6 @@ + +import NamespaceStore from './NamespaceStore'; + const SUGAR = 'Sugar'; // TODO: test browserify @@ -6,16 +9,23 @@ const SUGAR = 'Sugar'; // TODO: test QML const IS_BROWSER = typeof window !== 'undefined'; -const hasOwnProperty = Object.prototype.hasOwnProperty; const globalContext = getGlobalContext(); -function hasOwn(obj, prop) { - return !!obj && hasOwnProperty.call(obj, prop); +const nativeDescriptors = new NamespaceStore(); +const instanceMethods = new NamespaceStore(); + +const ERROR_METHOD_DEFINED = 'Method already defined'; +const ERROR_NATIVE_UNKNOWN = 'Native class does not exist'; + +export const VERSION = 'edge'; + +function hasOwnProperty(obj, prop) { + return !!obj && Object.prototype.hasOwnProperty.call(obj, prop); } function forEachProperty(obj, fn) { - for(let key in obj) { - if (!hasOwn(obj, key)) continue; + for (let key in obj) { + if (!hasOwnProperty(obj, key)) continue; if (fn.call(obj, key, obj[key], obj) === false) break; } } @@ -23,9 +33,9 @@ function forEachProperty(obj, fn) { function getGlobalContext() { // Get global context by keyword here to avoid issues with libraries // that can potentially alter this script's context object. - return testGlobalContext(typeof global !== 'undefined' && global) || - testGlobalContext(typeof window !== 'undefined' && window) || - testGlobalContext(typeof self !== 'undefined' && self); + return testGlobalContext(typeof global !== 'undefined' && global) + || testGlobalContext(typeof window !== 'undefined' && window) + || testGlobalContext(typeof self !== 'undefined' && self); } function testGlobalContext(obj) { @@ -48,22 +58,23 @@ function nativeMethodProhibitedOnChainable(methodName) { // on Object.prototype causes QML to segfault, so pre-emptively excluding // it. Note we're intentionally allowing toString through to allow // it to be wrapped as a chainable. - return methodName === 'constructor' || - methodName === 'valueOf' || - methodName === '__proto__'; + return methodName === 'constructor' + || methodName === 'valueOf' + || methodName === '__proto__'; } -function mapNativeToChainable(namespace, name) { +function mapNativeToChainable(Namespace, name) { const proto = globalContext[name].prototype; Object.getOwnPropertyNames(proto).forEach(methodName => { + var fn; // TODO: not toString?? if (nativeMethodProhibitedOnChainable(methodName)) { return; } try { - var fn = proto[methodName]; + fn = proto[methodName]; if (typeof fn !== 'function') { // Bail on anything not a function. return; @@ -73,7 +84,7 @@ function mapNativeToChainable(namespace, name) { // will throw errors when accessed. return; } - return namespace.prototype[methodName] = wrapChainableResult(fn); + return Namespace.prototype[methodName] = wrapChainableResult(fn); }); } @@ -90,181 +101,189 @@ function wrapChainableResult(fn) { // Objects may not have prototypes. const ctor = result.constructor; const name = ctor ? ctor.name : 'Object'; - let namespace = Sugar[name]; - if (!namespace && (!ctor || ctor === globalContext[name])) { - namespace = createNamespace(name); + let Namespace = Sugar[name]; + if (!Namespace && (!ctor || ctor === globalContext[name])) { + Namespace = createNamespace(name); } - return namespace ? new namespace(result) : result; - } -} - -function createExport() { - const obj = { - VERSION: VERSION, - extend: extend, - toString: toString, - createNamespace: createNamespace + return Namespace ? new Namespace(result) : result; }; +} +function exportGlobal(obj) { if (IS_BROWSER) { try { // Reuse already defined Sugar global object. globalContext[SUGAR] = globalContext[SUGAR] || obj; - } catch(e) { - console.error(e); + } catch (e) { // Contexts such as QML have a read-only global context. } } - - return obj; } -function methodIsIncluded(methodName, opt) { - return !opt.methods || opt.methods.includes(methodName); -} +class SugarNamespace { -function methodIsExcluded(methodName, opt) { - return opt.exclude && opt.exclude.includes(methodName); -} + constructor(raw) { + this.raw = raw; + } + + valueOf() { + return this.raw; + } -function methodCanBeExtended(methodName, opt) { - return !opt || (methodIsIncluded(methodName, opt) && !methodIsExcluded(methodName, opt)); } -function collectExtendOptions(args) { - if (args.length) { - if (typeof args[0] == 'string') { - return { - methods: args - }; - } else { - return args[0]; - } +export function extend(opt) { + try { + forEachNamespace((Namespace, name) => { + if (namespaceIsAllowed(Namespace, opt)) { + extendNamespace(Namespace, name, opt); + } + }); + } catch (e) { + restore(); + throw e; } } -class SugarNamespace { - - constructor(raw) { - this.raw = raw; - } - - valueOf() { - return this.raw; - } +export function restore() { + forEachNamespace(restoreNamespace); } +function namespaceIsAllowed(Namespace, opt) { + // TODO: me! + return true; +} -export function extend(...args) { +function forEachNamespace(fn) { forEachProperty(Sugar, (key, val) => { if (val.prototype instanceof SugarNamespace) { - extendNamespace(val, key, args); + fn(val, key); } }); } -export function extendNamespace(namespace, name, args) { - const native = globalContext[name]; - const opt = collectExtendOptions(args); - - forEachProperty(namespace, (methodName, fn) => { - if (methodCanBeExtended(methodName, opt)) { - const instanceFn = getInstanceMethod(namespace, methodName); - if (instanceFn && canExtendNativePrototype(native)) { - extendNative(native.prototype, methodName, instanceFn); - } else { - extendNative(native, methodName, fn); - } +function extendNamespace(Namespace, name, opt) { + try { + if (Array.isArray(opt)) { + opt = { + include: opt + }; } - }); + forEachNamespaceMethod(Namespace, name, (native, methodName, fn, isInstance) => { + if (methodAllowedByArgs(methodName, opt)) { + extendNative(native, methodName, fn, isInstance); + } + }); + } catch (e) { + restoreNamespace(Namespace, name); + throw e; + } } -function canExtendNativePrototype(native) { - return native !== Object; +function restoreNamespace(Namespace, name) { + forEachNamespaceMethod(Namespace, name, restoreNative); } -function extendNative(target, methodName, fn) { - // Built-in methods MUST be configurable, writable, and non-enumerable. - Object.defineProperty(target, methodName, { - writable: true, - configurable: true, - value: fn +function forEachNamespaceMethod(Namespace, name, fn) { + const native = globalContext[name]; + forEachProperty(Namespace, (methodName, staticFn) => { + const instanceFn = instanceMethods.get(methodName, true); + if (instanceFn) { + fn(native.prototype, methodName, instanceFn, true); + } else { + fn(native, methodName, staticFn, false); + } }); } -const methodsById = {}; +function extendNative(native, methodName, fn, isInstance) { + if (canExtendNative(native)) { + if (hasOwnProperty(native, methodName)) { + const descriptor = Object.getOwnPropertyDescriptor(native, methodName); + nativeDescriptors.set(methodName, descriptor, isInstance); + } + // Built-in methods MUST be configurable, writable, and non-enumerable. + Object.defineProperty(native, methodName, { + writable: true, + configurable: true, + value: fn + }); + } +} -function getInstanceMethod(namespace, methodName) { - return methodsById[getMethodId(namespace, methodName)]; +function restoreNative(native, methodName, fn, isInstance) { + if (native[methodName] === fn) { + if (nativeDescriptors.has(methodName, isInstance)) { + const descriptor = nativeDescriptors.get(methodName, isInstance); + Object.defineProperty(native, methodName, descriptor); + nativeDescriptors.remove(methodName, isInstance); + } else { + delete native[methodName]; + } + } } -function storeInstanceMethod(namespace, methodName, fn) { - methodsById[getMethodId(namespace, methodName)] = fn; +function methodIsIncluded(methodName, opt) { + return !opt.methods || opt.methods.includes(methodName); +} + +function methodIsExcluded(methodName, opt) { + return opt.exclude && opt.exclude.includes(methodName); } -function clearInstanceMethod(namespace, methodName) { - delete methodsById[getMethodId(namespace, methodName)]; +function methodAllowedByArgs(methodName, opt) { + return !opt || (methodIsIncluded(methodName, opt) && !methodIsExcluded(methodName, opt)); } -function getMethodId(namespace, methodName) { - // Only need to store instance methods. - return namespace.toString() + '#' + methodName; +function canExtendNative(native) { + return native !== Object.prototype; } -function assertMethodDoesNotExist(namespace, methodName) { - if (namespace[methodName]) { +function assertMethodDoesNotExist(Namespace, methodName) { + if (Namespace[methodName]) { throw new Error(ERROR_METHOD_DEFINED); } } -function defineStatic(namespace, methodName, staticFn) { - assertMethodDoesNotExist(namespace, methodName); +function defineStatic(Namespace, methodName, staticFn) { + assertMethodDoesNotExist(Namespace, methodName); // Clear an instance method that previously exists. // Sugar will error when redefining methods, so this // is mostly for the test suite. - clearInstanceMethod(namespace, methodName); - namespace[methodName] = staticFn; + instanceMethods.remove(methodName, true); + Namespace[methodName] = staticFn; } -function defineInstance(namespace, methodName, staticFn) { - assertMethodDoesNotExist(namespace, methodName); - const instanceFn = wrapStaticMethodAsInstance(namespace, staticFn); - storeInstanceMethod(namespace, methodName, instanceFn); - namespace.prototype[methodName] = wrapChainableResult(instanceFn); - namespace[methodName] = staticFn; +function defineInstance(Namespace, methodName, staticFn) { + assertMethodDoesNotExist(Namespace, methodName); + const instanceFn = wrapStaticMethodAsInstance(Namespace, staticFn); + instanceMethods.set(methodName, instanceFn, true); + Namespace.prototype[methodName] = wrapChainableResult(instanceFn); + Namespace[methodName] = staticFn; } -function wrapStaticMethodAsInstance(namespace, fn) { +function wrapStaticMethodAsInstance(Namespace, fn) { return function(...args) { args.unshift(this); - return fn.apply(namespace, args); - } + return fn.apply(Namespace, args); + }; } -function defineWithArgs(namespace, defineMethod, args) { - if (typeof args[0] === 'object') { - forEachProperty(args[0], (methodName, fn) => { - defineMethod(namespace, methodName, fn); - }) - } else { - return defineMethod(namespace, args[0], args[1]); +function defineWithArgs(Namespace, defineMethod, args) { + if (typeof args[0] !== 'object') { + return defineMethod(Namespace, args[0], args[1]); } + forEachProperty(args[0], (methodName, fn) => { + defineMethod(Namespace, methodName, fn); + }); } -function defineAliases(namespace, defineMethod, str, fn) { +function defineAliases(Namespace, defineMethod, str, fn) { str.split(' ').forEach(methodName => { - defineMethod(namespace, methodName, fn(methodName)); + defineMethod(Namespace, methodName, fn(methodName)); }); } -const ERROR_METHOD_DEFINED = 'Method already defined'; -const ERROR_NATIVE_UNKNOWN = 'Native class does not exist'; - -const INSTANCE = 0x1; -const STATIC = 0x2; - -export const VERSION = 'edge'; - export function createNamespace(name) { if (!globalContext[name]) { @@ -277,8 +296,8 @@ export function createNamespace(name) { class SugarChainable extends SugarNamespace { - static extend(...args) { - extendNamespace(SugarChainable, name, args); + static extend(opt) { + extendNamespace(SugarChainable, name, opt); } static defineStatic(...args) { @@ -308,5 +327,13 @@ export function createNamespace(name) { return Sugar[name] = SugarChainable; } -const Sugar = createExport(); +const Sugar = { + VERSION, + extend, + restore, + toString, + createNamespace +}; + +exportGlobal(Sugar); export default Sugar; diff --git a/src/es5.js b/src/es5.js deleted file mode 100644 index c7c823054..000000000 --- a/src/es5.js +++ /dev/null @@ -1 +0,0 @@ -require('@babel/polyfill'); diff --git a/src/index.js b/src/index.js index f4756cc36..30f544930 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,12 @@ -import './number'; +export { default as Number } from './number'; +export { default as String } from './string'; +export { default as Object } from './object'; +export { default as Array } from './array'; -export { default } from './core'; +export { + VERSION, + extend, + restore, + createNamespace, + default, +} from './core'; diff --git a/src/number/random.js b/src/number/random.js index 15ec12364..3327a2bac 100644 --- a/src/number/random.js +++ b/src/number/random.js @@ -1,5 +1,4 @@ import { defineStatic } from './namespace'; -import trunc from './util/trunc'; export default defineStatic('random', function(n1, n2) { if (arguments.length == 0) { diff --git a/src/number/sin.js b/src/number/sin.js index 1c3576ea5..b3b9ed730 100644 --- a/src/number/sin.js +++ b/src/number/sin.js @@ -1,2 +1 @@ export { sin as default } from './util/mathAliases'; - diff --git a/src/number/util/mathAliases.js b/src/number/util/mathAliases.js index 18f174d6f..1a98849cc 100644 --- a/src/number/util/mathAliases.js +++ b/src/number/util/mathAliases.js @@ -1,14 +1,25 @@ import SugarNumber, { defineInstanceAlias } from '../namespace'; defineInstanceAlias('abs pow sin asin cos acos tan atan atan2 exp sqrt', function(name) { - return function(n, arg) { - // Note that .valueOf() here is only required due to a - // very strange bug in iOS7 that only occurs occasionally - // in which Math.abs() called on non-primitive numbers - // returns a completely different number (Issue #400) - return Math[name](n.valueOf(), arg); - }; - } -); + return function(n, arg) { + // Note that .valueOf() here is only required due to a + // very strange bug in iOS7 that only occurs occasionally + // in which Math.abs() called on non-primitive numbers + // returns a completely different number (Issue #400) + return Math[name](n.valueOf(), arg); + }; +}); -export const { abs, pow, sin, asin, cos, acos, tan, atan, atan2, exp, sqrt } = SugarNumber; +export const { + abs, + pow, + sin, + asin, + cos, + acos, + tan, + atan, + atan2, + exp, + sqrt +} = SugarNumber; diff --git a/src/number/util/numberAliases.js b/src/number/util/numberAliases.js index fefabedd2..241351834 100644 --- a/src/number/util/numberAliases.js +++ b/src/number/util/numberAliases.js @@ -1,7 +1,7 @@ import SugarNumber, { defineInstanceAlias } from '../namespace'; defineInstanceAlias('isNaN isFinite isInteger isSafeInteger', function(name) { - return function(n, place) { + return function(n) { return Number[name](n); }; }); diff --git a/src/number/util/roundWithPrecision.js b/src/number/util/roundWithPrecision.js index 4668204b2..5b5d4cafb 100644 --- a/src/number/util/roundWithPrecision.js +++ b/src/number/util/roundWithPrecision.js @@ -6,4 +6,3 @@ export default function(val, place, fn = Math.round) { } return fn(val * mult) / mult; } - diff --git a/src/object/index.js b/src/object/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/polyfills.js b/src/polyfills.js index 6e50cada0..c2e5e8c52 100644 --- a/src/polyfills.js +++ b/src/polyfills.js @@ -1,6 +1,6 @@ // TODO: These are better included using webpack.config.js // But that doesn't seem to work with Babel at the moment. -import 'core-js/modules/es6.number.is-safe-integer' -import 'core-js/modules/es6.number.is-finite' -import 'core-js/modules/es6.number.is-nan' +import 'core-js/modules/es6.number.is-safe-integer'; +import 'core-js/modules/es6.number.is-finite'; +import 'core-js/modules/es6.number.is-nan'; diff --git a/src/string/index.js b/src/string/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/util/toOrdinal.js b/src/util/toOrdinal.js index ae3b0cdb4..cef969a2f 100644 --- a/src/util/toOrdinal.js +++ b/src/util/toOrdinal.js @@ -2,13 +2,12 @@ function getSuffix(n) { if (n >= 11 && n <= 13) { return 'th'; - } else { - switch(Math.abs(n) % 10) { - case 1: return 'st'; - case 2: return 'nd'; - case 3: return 'rd'; - default: return 'th'; - } + } + switch (Math.abs(n) % 10) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + default: return 'th'; } } diff --git a/test/.eslintrc b/test/.eslintrc new file mode 100644 index 000000000..b675ef13a --- /dev/null +++ b/test/.eslintrc @@ -0,0 +1,46 @@ +{ + "globals": { + "it": true, + "fit": true, + "xit": true, + "arg": true, + "add": true, + "mult": true, + "Sugar": true, + "method": true, + "xmethod": true, + "fmethod": true, + "namespace": true, + "xnamespace": true, + "fnamespace": true, + "describe": true, + "xdescribe": true, + "fdescribe": true, + "afterAll": true, + "afterEach": true, + "afterFalse": true, + "beforeAll": true, + "beforeEach": true, + "assertNaN": true, + "assertNull": true, + "assertTrue": true, + "assertFalse": true, + "assertError": true, + "assertEqual": true, + "assertOneOf": true, + "assertMatch": true, + "assertNoError": true, + "assertUndefined": true, + "assertInstanceOf": true, + "assertMatchingNamedExports": true, + "ensureNamespaceNotInitialized": true + }, + "rules": { + "comma-dangle": ["error"], + "no-global-assign": [ + "error", { + "exceptions": ["Number"] + } + ] + } +} diff --git a/test/.eslintrc.json b/test/.eslintrc.json deleted file mode 100644 index 0fe422d1d..000000000 --- a/test/.eslintrc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "globals": { - "method": true, - "namespace": true, - "assertEqual": true, - "describe": true, - "assertNamedExports": true, - "it": true - } -} diff --git a/test/chainable.js b/test/chainable.js index d7354d512..91474d38e 100644 --- a/test/chainable.js +++ b/test/chainable.js @@ -1,6 +1,6 @@ 'use strict'; -describe('Chainable', function () { +describe('Chainable', function() { Sugar.createNamespace('Number'); Sugar.createNamespace('String'); @@ -113,14 +113,14 @@ describe('Chainable', function () { it('should not initialize namespace for custom classes', function() { function Foo() {} - new Sugar.Number(1).arg(new Foo); + new Sugar.Number(1).arg(new Foo()); assertTrue(!Sugar.Foo); }); it('should not initialize namespace for custom classes with same name as built-ins', function() { ensureNamespaceNotInitialized('Array', function() { function Array() {} - new Sugar.Number(1).arg(new Array); + new Sugar.Number(1).arg(new Array()); assertTrue(!Sugar.Array); }); }); @@ -158,10 +158,13 @@ describe('Chainable', function () { var zero = new Sugar.Number(0); var two = new Sugar.Number(2); + var a = new Sugar.String('a'); it('should coerce double equals', function() { assertTrue(two == 2); assertTrue(2 == two); + assertTrue(a == 'a'); + assertTrue('a' == a); }); it('should coerce comparison operators', function() { @@ -206,7 +209,6 @@ describe('Chainable', function () { }); it('should coerce string concatenation operator', function() { - var a = new Sugar.String('a'); assertEqual(a + 'b', 'ab'); assertEqual('b' + a, 'ba'); }); @@ -232,8 +234,14 @@ describe('Chainable', function () { }); it('should be equivalent to calling prototype.toString', function() { - assertEqual(new Sugar.Object(null).toString().raw, Object.prototype.toString.call(null)); - assertEqual(new Sugar.Object(undefined).toString().raw, Object.prototype.toString.call(undefined)); + assertEqual( + new Sugar.Object(null).toString().raw, + Object.prototype.toString.call(null) + ); + assertEqual( + new Sugar.Object(undefined).toString().raw, + Object.prototype.toString.call(undefined) + ); }); }); diff --git a/test/core.js b/test/core.js index 2cd3e9c28..8714c89c9 100644 --- a/test/core.js +++ b/test/core.js @@ -1,8 +1,8 @@ 'use strict'; -describe('Core', function () { +describe('Core', function() { - describe('Global', function () { + describe('Global', function() { it('should have a toString', function() { assertEqual(Sugar.toString(), 'Sugar'); @@ -14,7 +14,7 @@ describe('Core', function () { }); - describe('Namespace', function () { + describe('Namespace', function() { it('should have a toString', function() { assertEqual(Sugar.Number.toString(), 'SugarNumber'); @@ -45,13 +45,13 @@ describe('Core', function () { }); - describe('Defining', function () { + describe('Defining', function() { function alias(name) { var add = Number(name.charAt(3)); return function(n) { return n + add; - } + }; } it('should be able to define static methods', function() { diff --git a/test/extended.js b/test/extended.js index 39825fbff..ea505e74d 100644 --- a/test/extended.js +++ b/test/extended.js @@ -1,55 +1,44 @@ 'use strict'; -describe('Extended', function () { +describe('Extended', function() { Sugar.createNamespace('Number'); Sugar.createNamespace('String'); Sugar.createNamespace('Object'); - describe('Static methods', function() { + beforeEach(function() { + Sugar.Number.defineStatic('addStatic', add); + Sugar.Object.defineStatic('argStatic', arg); + Sugar.Number.defineInstance('add', add); + Sugar.String.defineInstance('add', add); + Sugar.Object.defineInstance('arg', arg); + }); - beforeEach(function() { - Sugar.Number.defineStatic('add', add); - Sugar.Object.defineStatic('arg', arg); - }); + afterEach(function() { + Sugar.restore(); + delete Sugar.Number.addStatic; + delete Sugar.Object.argStatic; + delete Sugar.Number.add; + delete Sugar.String.add; + delete Sugar.Object.arg; + }); - afterEach(function() { - // TODO: method for this? - delete Sugar.Number.add; - delete Sugar.Object.arg; - delete Number.add; - delete Object.arg; - }); + describe('Static methods', function() { it('should extend static Number methods', function() { Sugar.extend(); - assertInstanceOf(Number.add, Function); + assertInstanceOf(Number.addStatic, Function); }); it('should extend static Object methods', function() { Sugar.extend(); - assertInstanceOf(Object.arg, Function); + assertInstanceOf(Object.argStatic, Function); }); }); describe('Instance methods', function() { - beforeEach(function() { - Sugar.Number.defineInstance('add', add); - Sugar.String.defineInstance('add', add); - Sugar.Object.defineInstance('arg', arg); - }); - - afterEach(function() { - // TODO: method for this? - delete Sugar.Number.add; - delete Sugar.String.add; - delete Sugar.Object.arg; - delete Number.prototype.add; - delete String.prototype.add; - }); - describe('Basic', function() { it('should extend all namespaces', function() { @@ -79,8 +68,9 @@ describe('Extended', function () { it('should allow extended methods to be writable', function() { Sugar.extend(); assertNoError(function() { - Number.prototype.add = null; + Number.prototype.add = 1; }); + delete Number.prototype.add; }); }); @@ -89,7 +79,10 @@ describe('Extended', function () { it('should allow array as shortcut for methods param', function() { // TODO: decide syntax - Sugar.Number.extend('add', 'mult'); + Sugar.Number.extend([ + 'add', + 'mult' + ]); assertEqual((5).add(5), 10); assertEqual((5).mult(5), 25); }); @@ -139,6 +132,92 @@ describe('Extended', function () { }); + describe('Util', function() { + + it('should be able to restore all namespaces', function() { + Sugar.extend(); + assertInstanceOf(Number.prototype.add, Function); + assertInstanceOf(String.prototype.add, Function); + Sugar.restore(); + assertUndefined(Number.prototype.add); + assertUndefined(String.prototype.add); + }); + + it('should restore to previous state', function() { + Number.prototype.add = 3; + Sugar.extend(); + assertInstanceOf(Number.prototype.add, Function); + Sugar.restore(); + assertEqual(Number.prototype.add, 3); + delete Number.prototype.add; + }); + + it('should not shadow native values when restoring', function() { + Sugar.extend(); + Sugar.restore(); + assertFalse(Object.prototype.hasOwnProperty.call(Number.prototype, 'add')); + }); + + }); + + describe('Errors', function() { + + var number; + var FakeNumber; + + beforeEach(function() { + FakeNumber = { + prototype: {} + }; + Object.defineProperty(FakeNumber.prototype, 'add', { + configurable: false, + writable: true, + value: 1 + }); + // Non-configurable properties cannot be restored once + // set so need to hijack the global space to test this, + // then restore the real string later. + number = Number; + Number = FakeNumber; + }); + + afterEach(function() { + Number = number; + FakeNumber = null; + }); + + it('should throw an error when extending a non-writable property', function() { + assertError(function() { + Sugar.extend(); + }); + }); + + it('should roll back extend operation on error', function() { + try { + Sugar.extend(); + } catch (e) { + assertUndefined(Number.addStatic); + assertUndefined(Object.argStatic); + assertUndefined(String.prototype.add); + assertEqual(Number.prototype.add, 1); + } + }); + + it('should roll back individual namespaces on error', function() { + try { + Sugar.Object.extend(); + Sugar.String.extend(); + Sugar.Number.extend(); + } catch (e) { + assertInstanceOf(Object.argStatic, Function); + assertInstanceOf(String.prototype.add, Function); + assertUndefined(Number.addStatic); + assertEqual(Number.prototype.add, 1); + } + }); + + }); + // TODO: except vs exclude? // TODO: defineAlias vs defineSimilar??? // TODO: how to handle enhanced methods? flags?? defineMathMethods? diff --git a/test/helpers/module.js b/test/helpers/module.js index 0df34ab23..9f6c41771 100644 --- a/test/helpers/module.js +++ b/test/helpers/module.js @@ -1,29 +1,23 @@ -getModuleNamedExports = function(module) { +function getModuleNamedExports(module) { return Object.keys(module).filter(function(name) { return name !== 'default'; }); } -getNamespaceMethodNames = function(namespace) { - return Object.keys(namespace); -} - -assertNamedExports = function(module) { - var namespace = module.default; - var methodNames = getModuleNamedExports(module).concat(getNamespaceMethodNames(namespace)); +assertMatchingNamedExports = function(module) { + var allNames = getModuleNamedExports(module).concat(Object.keys(module.default)); var asserted = {}; - methodNames.forEach(function(methodName) { - if (asserted[methodName]) { + allNames.forEach(function(name) { + if (asserted[name]) { return; } - asserted[methodName] = true; + asserted[name] = true; - var exportExists = typeof module[methodName] === 'function'; - var methodExists = typeof namespace[methodName] === 'function'; + var exportExists = Object.prototype.hasOwnProperty.call(module, name); + var propertyExists = module.default.hasOwnProperty(name); - var msg = 'method ' + methodName + ' should be a named export and namespace method'; - assertTrue(exportExists && methodExists, msg); + var msg = name + ' should be a named export and property'; + assertTrue(exportExists && propertyExists, msg); }); -} - +}; diff --git a/test/helpers/suite.js b/test/helpers/suite.js index 552a4608e..2dd255a0f 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -1,4 +1,3 @@ - (function() { var currentNamespace; @@ -14,7 +13,7 @@ }); suite(); }); - } + }; } function withTest(testFn) { @@ -22,7 +21,7 @@ testFn(name, function() { test(currentNamespace[name]); }); - } + }; } namespace = withSuite(describe); diff --git a/test/index.js b/test/index.js index 83637097e..fbc765abd 100644 --- a/test/index.js +++ b/test/index.js @@ -1,8 +1,5 @@ import Sugar from '../src'; -// Export Sugar to global for tests. -global.Sugar = Sugar; - // Helpers import './helpers/suite'; import './helpers/module'; @@ -15,3 +12,6 @@ import './number'; import './modules'; import './extended'; import './chainable'; + +// Export Sugar to global for tests. +global.Sugar = Sugar; diff --git a/test/modules.js b/test/modules.js index d421c817f..4eda80cc2 100644 --- a/test/modules.js +++ b/test/modules.js @@ -1,19 +1,20 @@ -'use strict'; +import * as Sugar from '../src'; +import * as Number from '../src/number'; +import abs from '../src/number/abs'; -import * as NumberImport from '../src/number'; +describe('Modules', function() { -import absStandalone from '../src/number/abs'; -import roundStandalone from '../src/number/round'; - -describe('Modules', function () { + it('should have exports for main entry point', function() { + assertMatchingNamedExports(Sugar); + }); - it('should have matching named exports', function() { - assertNamedExports(NumberImport); + it('should have exports for namespace entry points', function() { + // TODO: all other namespaces! + assertMatchingNamedExports(Number); }); - it('should have standalone exports', function() { - assertEqual(absStandalone(-5), 5); - assertEqual(roundStandalone(5.25, 1), 5.3); + it('should have standlone exports', function() { + assertEqual(abs(-5), 5); }); }); diff --git a/test/number.js b/test/number.js index 1f025647e..ec80ca7d4 100644 --- a/test/number.js +++ b/test/number.js @@ -1,6 +1,6 @@ 'use strict'; -namespace('Number', function () { +namespace('Number', function() { /* TODO: what about these? From aaadaf39a6b36b7117b910a8c0fb276eeb0791d4 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 15 Dec 2018 04:22:21 +0900 Subject: [PATCH 004/191] cleanup for random --- src/number/random.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/number/random.js b/src/number/random.js index 3327a2bac..5083be48c 100644 --- a/src/number/random.js +++ b/src/number/random.js @@ -1,13 +1,6 @@ import { defineStatic } from './namespace'; -export default defineStatic('random', function(n1, n2) { - if (arguments.length == 0) { - n1 = 0; - n2 = 1; - } else if (arguments.length == 1) { - n2 = n1; - n1 = 0; - } +export default defineStatic('random', function(n1 = 1, n2 = 0) { const min = Math.min(n1, n2); const max = Math.max(n1, n2) + 1; return Math.floor((Math.random() * (max - min)) + min); From 6880ca08eb927b80f7e29ccd7fa55662194aa107 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 15 Dec 2018 20:47:58 +0900 Subject: [PATCH 005/191] more --- .eslintrc | 2 +- CHANGELOG.md | 1 + package.json | 2 +- src/core/NamespaceStore.js | 27 ++-- src/core/index.js | 190 ++++++++++++++------------ test/core.js | 4 - test/extended.js | 266 +++++++++++++++++++++++-------------- 7 files changed, 286 insertions(+), 206 deletions(-) diff --git a/.eslintrc b/.eslintrc index e55b1ba37..d2a999897 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,7 +9,7 @@ "new-cap": ["error"], "new-parens": ["error"], "keyword-spacing": ["error"], - "no-multiple-empty-lines": ["error"], + "no-multiple-empty-lines": [2, {"max": 3, "maxBOF": 0}], "object-shorthand": ["error", "consistent"], "block-scoped-var": ["error"], "operator-linebreak": ["error", "before"], diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d4a453a0..9b0588df2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ v3.0.0 TODO: +- DOCUMENT CHANGES TO EXTEND API - String#padStart/String#padEnd? - String#trimStart/String#trimEnd? - Object.values / Object.entries? diff --git a/package.json b/package.json index 7272959d0..02b07e99e 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.17", + "ready-test": "^1.0.18", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", diff --git a/src/core/NamespaceStore.js b/src/core/NamespaceStore.js index f45b7db11..627b8f51d 100644 --- a/src/core/NamespaceStore.js +++ b/src/core/NamespaceStore.js @@ -2,28 +2,31 @@ export default class NamespaceStore { constructor() { - this.static = {}; - this.instance = {}; + this.store = {}; } - has(name, isInstance) { - return this.getStore(isInstance).hasOwnProperty(name); + has(name, member, isInstance) { + const key = this.getKey(name, member, isInstance); + return this.store.hasOwnProperty(key); } - get(name, isInstance) { - return this.getStore(isInstance)[name]; + get(name, member, isInstance) { + const key = this.getKey(name, member, isInstance); + return this.store[key]; } - set(name, val, isInstance) { - this.getStore(isInstance)[name] = val; + set(name, member, val, isInstance) { + const key = this.getKey(name, member, isInstance); + this.store[key] = val; } - remove(name, isInstance) { - delete this.getStore(isInstance)[name]; + remove(name, member, isInstance) { + const key = this.getKey(name, member, isInstance); + delete this.store[key]; } - getStore(isInstance) { - return isInstance ? this.instance : this.static; + getKey(name, member, isInstance) { + return name + (isInstance ? '#' : '.') + member; } } diff --git a/src/core/index.js b/src/core/index.js index 3b789fa99..37bb636aa 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,4 +1,3 @@ - import NamespaceStore from './NamespaceStore'; const SUGAR = 'Sugar'; @@ -14,8 +13,9 @@ const globalContext = getGlobalContext(); const nativeDescriptors = new NamespaceStore(); const instanceMethods = new NamespaceStore(); -const ERROR_METHOD_DEFINED = 'Method already defined'; -const ERROR_NATIVE_UNKNOWN = 'Native class does not exist'; +const ERROR_METHOD_DEFINED = 'Method already defined'; +const ERROR_NATIVE_UNKNOWN = 'Native class does not exist'; +const ERROR_EXTEND_CONFLICT = 'Method cannot be both included and excluded'; export const VERSION = 'edge'; @@ -30,6 +30,10 @@ function forEachProperty(obj, fn) { } } +function arrayIncludes(arr, el) { + return arr.includes ? arr.includes(el) : arr.indexOf(el) !== -1; +} + function getGlobalContext() { // Get global context by keyword here to avoid issues with libraries // that can potentially alter this script's context object. @@ -63,9 +67,9 @@ function nativeMethodProhibitedOnChainable(methodName) { || methodName === '__proto__'; } -function mapNativeToChainable(Namespace, name) { +function mapNativeToChainable(globalName, SugarChainable) { - const proto = globalContext[name].prototype; + const proto = globalContext[globalName].prototype; Object.getOwnPropertyNames(proto).forEach(methodName => { var fn; @@ -84,7 +88,7 @@ function mapNativeToChainable(Namespace, name) { // will throw errors when accessed. return; } - return Namespace.prototype[methodName] = wrapChainableResult(fn); + return SugarChainable.prototype[methodName] = wrapChainableResult(fn); }); } @@ -100,12 +104,12 @@ function wrapChainableResult(fn) { } // Objects may not have prototypes. const ctor = result.constructor; - const name = ctor ? ctor.name : 'Object'; - let Namespace = Sugar[name]; - if (!Namespace && (!ctor || ctor === globalContext[name])) { - Namespace = createNamespace(name); + const globalName = ctor ? ctor.name : 'Object'; + let SugarChainable = Sugar[globalName]; + if (!SugarChainable && (!ctor || ctor === globalContext[globalName])) { + SugarChainable = createNamespace(globalName); } - return Namespace ? new Namespace(result) : result; + return SugarChainable ? new SugarChainable(result) : result; }; } @@ -120,7 +124,7 @@ function exportGlobal(obj) { } } -class SugarNamespace { +class SugarChainableBase { constructor(raw) { this.raw = raw; @@ -134,9 +138,10 @@ class SugarNamespace { export function extend(opt) { try { - forEachNamespace((Namespace, name) => { - if (namespaceIsAllowed(Namespace, opt)) { - extendNamespace(Namespace, name, opt); + opt = collectExtendOptions(opt); + forEachNamespace(globalName => { + if (methodAllowedByArgs(globalName, opt)) { + extendNamespace(globalName); } }); } catch (e) { @@ -149,45 +154,42 @@ export function restore() { forEachNamespace(restoreNamespace); } -function namespaceIsAllowed(Namespace, opt) { - // TODO: me! - return true; -} - function forEachNamespace(fn) { forEachProperty(Sugar, (key, val) => { - if (val.prototype instanceof SugarNamespace) { - fn(val, key); + if (val.prototype instanceof SugarChainableBase) { + fn(key); } }); } -function extendNamespace(Namespace, name, opt) { +function collectExtendOptions(opt) { + return Array.isArray(opt) ? { include: opt } : opt; +} + +function extendNamespace(globalName, opt) { try { - if (Array.isArray(opt)) { - opt = { - include: opt - }; - } - forEachNamespaceMethod(Namespace, name, (native, methodName, fn, isInstance) => { + opt = collectExtendOptions(opt); + forEachNamespaceMethod(globalName, (native, methodName, fn, isInstance) => { if (methodAllowedByArgs(methodName, opt)) { - extendNative(native, methodName, fn, isInstance); + extendNative(native, globalName, methodName, fn, isInstance); } }); } catch (e) { - restoreNamespace(Namespace, name); + restoreNamespace(globalName); throw e; } } -function restoreNamespace(Namespace, name) { - forEachNamespaceMethod(Namespace, name, restoreNative); +function restoreNamespace(globalName) { + forEachNamespaceMethod(globalName, (native, methodName, fn, isInstance) => { + restoreNative(native, globalName, methodName, fn, isInstance); + }); } -function forEachNamespaceMethod(Namespace, name, fn) { - const native = globalContext[name]; - forEachProperty(Namespace, (methodName, staticFn) => { - const instanceFn = instanceMethods.get(methodName, true); +function forEachNamespaceMethod(globalName, fn) { + const native = globalContext[globalName]; + forEachProperty(Sugar[globalName], (methodName, staticFn) => { + const instanceFn = instanceMethods.get(globalName, methodName, true); if (instanceFn) { fn(native.prototype, methodName, instanceFn, true); } else { @@ -196,135 +198,149 @@ function forEachNamespaceMethod(Namespace, name, fn) { }); } -function extendNative(native, methodName, fn, isInstance) { +function extendNative(native, globalName, methodName, fn, isInstance) { if (canExtendNative(native)) { if (hasOwnProperty(native, methodName)) { const descriptor = Object.getOwnPropertyDescriptor(native, methodName); - nativeDescriptors.set(methodName, descriptor, isInstance); + nativeDescriptors.set(globalName, methodName, descriptor, isInstance); + } + try { + // Built-in methods MUST be configurable, writable, and non-enumerable. + Object.defineProperty(native, methodName, { + writable: true, + configurable: true, + value: fn + }); + } catch (e) { + // The extend operation may fail if a non-configurable property + // is set on the native. + nativeDescriptors.remove(globalName, methodName, isInstance); + throw e; } - // Built-in methods MUST be configurable, writable, and non-enumerable. - Object.defineProperty(native, methodName, { - writable: true, - configurable: true, - value: fn - }); } } -function restoreNative(native, methodName, fn, isInstance) { +function restoreNative(native, globalName, methodName, fn, isInstance) { if (native[methodName] === fn) { - if (nativeDescriptors.has(methodName, isInstance)) { - const descriptor = nativeDescriptors.get(methodName, isInstance); + if (nativeDescriptors.has(globalName, methodName, isInstance)) { + const descriptor = nativeDescriptors.get(globalName, methodName, isInstance); Object.defineProperty(native, methodName, descriptor); - nativeDescriptors.remove(methodName, isInstance); + nativeDescriptors.remove(globalName, methodName, isInstance); } else { delete native[methodName]; } } } +// TODO: rename me to be more generic! function methodIsIncluded(methodName, opt) { - return !opt.methods || opt.methods.includes(methodName); + return opt.include && arrayIncludes(opt.include, methodName); } function methodIsExcluded(methodName, opt) { - return opt.exclude && opt.exclude.includes(methodName); + return opt.exclude && arrayIncludes(opt.exclude, methodName); } function methodAllowedByArgs(methodName, opt) { - return !opt || (methodIsIncluded(methodName, opt) && !methodIsExcluded(methodName, opt)); + if (!opt) { + return true; + } + const included = methodIsIncluded(methodName, opt); + const excluded = methodIsExcluded(methodName, opt); + if (included && excluded) { + throw new Error(ERROR_EXTEND_CONFLICT); + } + return included || (!opt.include && !excluded); } function canExtendNative(native) { return native !== Object.prototype; } -function assertMethodDoesNotExist(Namespace, methodName) { - if (Namespace[methodName]) { +function assertMethodDoesNotExist(SugarChainable, methodName) { + if (SugarChainable[methodName]) { throw new Error(ERROR_METHOD_DEFINED); } } -function defineStatic(Namespace, methodName, staticFn) { - assertMethodDoesNotExist(Namespace, methodName); +function defineStatic(globalName, methodName, staticFn) { + const SugarChainable = Sugar[globalName]; + assertMethodDoesNotExist(SugarChainable, methodName); // Clear an instance method that previously exists. // Sugar will error when redefining methods, so this // is mostly for the test suite. - instanceMethods.remove(methodName, true); - Namespace[methodName] = staticFn; + instanceMethods.remove(globalName, methodName, true); + SugarChainable[methodName] = staticFn; } -function defineInstance(Namespace, methodName, staticFn) { - assertMethodDoesNotExist(Namespace, methodName); - const instanceFn = wrapStaticMethodAsInstance(Namespace, staticFn); - instanceMethods.set(methodName, instanceFn, true); - Namespace.prototype[methodName] = wrapChainableResult(instanceFn); - Namespace[methodName] = staticFn; +function defineInstance(globalName, methodName, staticFn) { + const SugarChainable = Sugar[globalName]; + assertMethodDoesNotExist(SugarChainable, methodName); + const instanceFn = wrapStaticMethodAsInstance(SugarChainable, staticFn); + instanceMethods.set(globalName, methodName, instanceFn, true); + SugarChainable.prototype[methodName] = wrapChainableResult(instanceFn); + SugarChainable[methodName] = staticFn; } -function wrapStaticMethodAsInstance(Namespace, fn) { +function wrapStaticMethodAsInstance(SugarChainable, fn) { return function(...args) { args.unshift(this); - return fn.apply(Namespace, args); + return fn.apply(SugarChainable, args); }; } -function defineWithArgs(Namespace, defineMethod, args) { +function defineWithArgs(globalName, defineMethod, args) { if (typeof args[0] !== 'object') { - return defineMethod(Namespace, args[0], args[1]); + return defineMethod(globalName, args[0], args[1]); } forEachProperty(args[0], (methodName, fn) => { - defineMethod(Namespace, methodName, fn); + defineMethod(globalName, methodName, fn); }); } -function defineAliases(Namespace, defineMethod, str, fn) { +function defineAliases(globalName, defineMethod, str, fn) { str.split(' ').forEach(methodName => { - defineMethod(Namespace, methodName, fn(methodName)); + defineMethod(globalName, methodName, fn(methodName)); }); } -export function createNamespace(name) { +export function createNamespace(globalName) { - if (!globalContext[name]) { + if (!globalContext[globalName]) { throw new Error(ERROR_NATIVE_UNKNOWN); } - if (Sugar[name]) { - return Sugar[name]; + if (Sugar[globalName]) { + return Sugar[globalName]; } - class SugarChainable extends SugarNamespace { + class SugarChainable extends SugarChainableBase { static extend(opt) { - extendNamespace(SugarChainable, name, opt); + extendNamespace(globalName, opt); } static defineStatic(...args) { - return defineWithArgs(SugarChainable, defineStatic, args); + return defineWithArgs(globalName, defineStatic, args); } static defineInstance(...args) { - return defineWithArgs(SugarChainable, defineInstance, args); + return defineWithArgs(globalName, defineInstance, args); } static defineStaticAlias(str, fn) { - return defineAliases(SugarChainable, defineStatic, str, fn); + return defineAliases(globalName, defineStatic, str, fn); } static defineInstanceAlias(str, fn) { - return defineAliases(SugarChainable, defineInstance, str, fn); - } - - static toString() { - return SUGAR + name; + return defineAliases(globalName, defineInstance, str, fn); } } - mapNativeToChainable(SugarChainable, name); + mapNativeToChainable(globalName, SugarChainable); - return Sugar[name] = SugarChainable; + return Sugar[globalName] = SugarChainable; } const Sugar = { diff --git a/test/core.js b/test/core.js index 8714c89c9..820e7a923 100644 --- a/test/core.js +++ b/test/core.js @@ -16,10 +16,6 @@ describe('Core', function() { describe('Namespace', function() { - it('should have a toString', function() { - assertEqual(Sugar.Number.toString(), 'SugarNumber'); - }); - it('should be able to create a new namespace', function() { ensureNamespaceNotInitialized('Array', function() { var namespace = Sugar.createNamespace('Array'); diff --git a/test/extended.js b/test/extended.js index ea505e74d..13f3293f1 100644 --- a/test/extended.js +++ b/test/extended.js @@ -10,6 +10,7 @@ describe('Extended', function() { Sugar.Number.defineStatic('addStatic', add); Sugar.Object.defineStatic('argStatic', arg); Sugar.Number.defineInstance('add', add); + Sugar.Number.defineInstance('mult', mult); Sugar.String.defineInstance('add', add); Sugar.Object.defineInstance('arg', arg); }); @@ -19,6 +20,7 @@ describe('Extended', function() { delete Sugar.Number.addStatic; delete Sugar.Object.argStatic; delete Sugar.Number.add; + delete Sugar.Number.mult; delete Sugar.String.add; delete Sugar.Object.arg; }); @@ -27,12 +29,12 @@ describe('Extended', function() { it('should extend static Number methods', function() { Sugar.extend(); - assertInstanceOf(Number.addStatic, Function); + assertEqual(Number.addStatic(1, 2), 3); }); it('should extend static Object methods', function() { Sugar.extend(); - assertInstanceOf(Object.argStatic, Function); + assertEqual(Object.argStatic(1, 2), 2); }); }); @@ -58,14 +60,14 @@ describe('Extended', function() { assertUndefined(Object.prototype.arg); }); - it('should allow extended methods to be configurable', function() { + it('should define methods as configurable', function() { Sugar.extend(); assertNoError(function() { delete Number.prototype.add; }); }); - it('should allow extended methods to be writable', function() { + it('should define methods as writable', function() { Sugar.extend(); assertNoError(function() { Number.prototype.add = 1; @@ -75,29 +77,67 @@ describe('Extended', function() { }); - xdescribe('Options', function() { + }); + + describe('Options', function() { + + describe('Global', function() { + + it('should extend specific namespaces by name', function() { + Sugar.extend({ + include: ['Number'] + }); + assertEqual((5).add(5), 10); + assertEqual((5).mult(5), 25); + assertUndefined(''.add); + assertUndefined(''.add); + }); - it('should allow array as shortcut for methods param', function() { - // TODO: decide syntax - Sugar.Number.extend([ - 'add', - 'mult' - ]); + it('should accept array as shortcut for include', function() { + Sugar.extend(['Number']); assertEqual((5).add(5), 10); assertEqual((5).mult(5), 25); + assertUndefined(''.add); + assertUndefined(''.add); + }); + + it('should exclude specific namespaces by name', function() { + Sugar.extend({ + exclude: ['Number'] + }); + assertUndefined((5).add); + assertUndefined((5).mult); + assertEqual('a'.add('b'), 'ab'); + }); + + it('should throw an error when includes are inconsistent', function() { + assertError(function() { + Sugar.extend({ + include: ['Number'], + exclude: ['Number'] + }); + }); }); - it('should allow methods param', function() { - // TODO: decide syntax + }); + + describe('Namespace', function() { + + it('should extend specific methods by name', function() { Sugar.Number.extend({ - methods: ['add'] + include: ['add'] }); assertEqual((5).add(5), 10); assertUndefined((5).mult); }); - it('should allow exclude param', function() { - // TODO: decide syntax + it('should accept array as shortcut for include', function() { + Sugar.Number.extend(['add']); + assertEqual((5).add(5), 10); + assertUndefined((5).mult); + }); + + it('should exclude specific methods by name', function() { Sugar.Number.extend({ exclude: ['add'] }); @@ -105,36 +145,39 @@ describe('Extended', function() { assertEqual((5).mult(5), 25); }); - it('should allow extending by namespace ??', function() { - Sugar.extend({ - namespaces: [String, Number], - exclude: [String, Number] + it('should throw an error when includes are inconsistent', function() { + assertError(function() { + Sugar.Number.extend({ + include: ['add'], + exclude: ['add'] + }); }); }); }); - xdescribe('Enhancing', function() { + }); - it('should allow overwrite param', function() { - // TODO: work this out - Sugar.Number.defineInstance('every', stringCheck, function() { - }); + xdescribe('Enhancing', function() { - Sugar.Number.extend({ - overwrite: false - }); - assertUndefined((5).add); - assertEqual((5).mult(5), 25); + it('should allow overwrite param', function() { + // TODO: work this out + Sugar.Number.defineInstance('every', stringCheck, function() { }); + Sugar.Number.extend({ + overwrite: false + }); + assertUndefined((5).add); + assertEqual((5).mult(5), 25); }); }); - describe('Util', function() { - it('should be able to restore all namespaces', function() { + describe('Restore', function() { + + it('should restore all namespaces', function() { Sugar.extend(); assertInstanceOf(Number.prototype.add, Function); assertInstanceOf(String.prototype.add, Function); @@ -149,9 +192,20 @@ describe('Extended', function() { assertInstanceOf(Number.prototype.add, Function); Sugar.restore(); assertEqual(Number.prototype.add, 3); + assertUndefined(String.prototype.add); delete Number.prototype.add; }); + it('should not restore other namespaces', function() { + String.prototype.add = 3; + Sugar.extend(); + assertInstanceOf(String.prototype.add, Function); + Sugar.restore(); + assertUndefined(Number.prototype.add); + assertEqual(String.prototype.add, 3); + delete String.prototype.add; + }); + it('should not shadow native values when restoring', function() { Sugar.extend(); Sugar.restore(); @@ -160,100 +214,110 @@ describe('Extended', function() { }); - describe('Errors', function() { + describe('Existing global state', function() { - var number; + var RealNumber; var FakeNumber; beforeEach(function() { - FakeNumber = { - prototype: {} - }; - Object.defineProperty(FakeNumber.prototype, 'add', { - configurable: false, - writable: true, - value: 1 - }); // Non-configurable properties cannot be restored once // set so need to hijack the global space to test this, - // then restore the real string later. - number = Number; + // then restore the built-in later. + FakeNumber = function Number() {}; + RealNumber = Number; Number = FakeNumber; }); afterEach(function() { - Number = number; + // The order is important here as we don't want to allow + // the suite to restore methods defined on FakeNumber back + // onto the built-in. + Sugar.restore(); + Number = RealNumber; FakeNumber = null; }); - it('should throw an error when extending a non-writable property', function() { - assertError(function() { - Sugar.extend(); + describe('Extendable', function() { + + beforeEach(function() { + Object.defineProperty(FakeNumber.prototype, 'add', { + configurable: true, + writable: true, + value: 1 + }); }); - }); - it('should roll back extend operation on error', function() { - try { + it('should extend a fake global object', function() { + // Global hijacking like in Sinon only works on non-primitive + // objects like Date that are created via the global object, + // as primitives still inherit from their now hidden built-in + // prototypes. Simulating this by using the "new" keyword. + FakeNumber.prototype.valueOf = function() { + return 5; + } Sugar.extend(); - } catch (e) { - assertUndefined(Number.addStatic); - assertUndefined(Object.argStatic); - assertUndefined(String.prototype.add); - assertEqual(Number.prototype.add, 1); - } - }); + assertEqual(new Number().add(5), 10); + }); - it('should roll back individual namespaces on error', function() { - try { - Sugar.Object.extend(); - Sugar.String.extend(); - Sugar.Number.extend(); - } catch (e) { - assertInstanceOf(Object.argStatic, Function); - assertInstanceOf(String.prototype.add, Function); - assertUndefined(Number.addStatic); - assertEqual(Number.prototype.add, 1); - } }); - }); + describe('Not extendable', function() { - // TODO: except vs exclude? - // TODO: defineAlias vs defineSimilar??? - // TODO: how to handle enhanced methods? flags?? defineMathMethods? - // TODO: Sugar.Array.extend({ enhanceArray: false }); - // TODO: document API changes in changelog! + beforeEach(function() { + Object.defineProperty(FakeNumber.prototype, 'add', { + configurable: false, + writable: true, + value: 1 + }); + }); - /* - it('should accept methods param', function() { - Sugar.Number.extend({ - methods: ['add'] - }); - }); + it('should throw an error when extending a non-writable property', function() { + assertError(function() { + Sugar.extend(); + }); + }); - it('should accept exclude param', function() { - Sugar.Number.extend({ - exclude: ['add'] - }); - }); + it('should roll back extend operation on error', function() { + try { + Sugar.extend(); + } catch (e) { + assertUndefined(Number.addStatic); + assertUndefined(Object.argStatic); + assertUndefined(String.prototype.add); + assertEqual(Number.prototype.add, 1); + } + }); - it('should not extend instance methods', function() { - Sugar.Object.extend(); - }); + it('should roll back individual namespaces on error', function() { + try { + Sugar.Object.extend(); + Sugar.String.extend(); + Sugar.Number.extend(); + } catch (e) { + assertInstanceOf(Object.argStatic, Function); + assertInstanceOf(String.prototype.add, Function); + assertUndefined(Number.addStatic); + assertEqual(Number.prototype.add, 1); + } + }); + + it('should not roll back properties that it failed to set', function() { + try { + Sugar.extend(); + } catch (e) { + Number = function Number() {}; + Sugar.extend(); + Sugar.restore(); + assertUndefined(Number.prototype.add); + } + }); + + }); - // MORE - it('should extend after global hijacking', function() { - var nativeDate = Date; - function FakeDate() {} - Sugar.Date.defineStatic('foo', function() { return 'foo!'; }); - // Hijacking the global Date object. Sinon does this to allow time mocking - // in tests, so need to support this here. - Date = FakeDate; - Sugar.Date.extend(); - equal(Date.foo(), 'foo!', 'hijacked global is now the target'); - Date = nativeDate; }); - */ + // TODO: how to handle enhanced methods? flags?? defineMathMethods? + // TODO: Sugar.Array.extend({ enhanceArray: false }); + // TODO: document API changes in changelog! }); From 1f9c499eb1b6e887f61b881834c1fd7bbe920833 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 16 Dec 2018 01:14:52 +0900 Subject: [PATCH 006/191] Handling of enhanced methods --- .eslintrc | 2 +- package.json | 2 +- src/core/index.js | 55 ++++++++++++++++------- test/core.js | 9 +++- test/extended.js | 112 +++++++++++++++++++++++++++++++++++++--------- 5 files changed, 139 insertions(+), 41 deletions(-) diff --git a/.eslintrc b/.eslintrc index d2a999897..135658601 100644 --- a/.eslintrc +++ b/.eslintrc @@ -9,7 +9,7 @@ "new-cap": ["error"], "new-parens": ["error"], "keyword-spacing": ["error"], - "no-multiple-empty-lines": [2, {"max": 3, "maxBOF": 0}], + "no-multiple-empty-lines": [2, {"max": 3, "maxBOF": 1}], "object-shorthand": ["error", "consistent"], "block-scoped-var": ["error"], "operator-linebreak": ["error", "before"], diff --git a/package.json b/package.json index 02b07e99e..3d563c0d8 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.18", + "ready-test": "^1.0.20", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", diff --git a/src/core/index.js b/src/core/index.js index 37bb636aa..2cfb2144f 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -14,8 +14,8 @@ const nativeDescriptors = new NamespaceStore(); const instanceMethods = new NamespaceStore(); const ERROR_METHOD_DEFINED = 'Method already defined'; -const ERROR_NATIVE_UNKNOWN = 'Native class does not exist'; -const ERROR_EXTEND_CONFLICT = 'Method cannot be both included and excluded'; +const ERROR_NATIVE_UNKNOWN = 'Built-in class does not exist'; +const ERROR_EXTEND_CONFLICT = 'Extend options cannot have both include and exclude'; export const VERSION = 'edge'; @@ -140,8 +140,10 @@ export function extend(opt) { try { opt = collectExtendOptions(opt); forEachNamespace(globalName => { - if (methodAllowedByArgs(globalName, opt)) { - extendNamespace(globalName); + if (namespaceIsAllowed(globalName, opt)) { + extendNamespace(globalName, { + existing: opt && opt.existing + }); } }); } catch (e) { @@ -170,7 +172,7 @@ function extendNamespace(globalName, opt) { try { opt = collectExtendOptions(opt); forEachNamespaceMethod(globalName, (native, methodName, fn, isInstance) => { - if (methodAllowedByArgs(methodName, opt)) { + if (methodIsAllowed(methodName, native, opt)) { extendNative(native, globalName, methodName, fn, isInstance); } }); @@ -232,25 +234,44 @@ function restoreNative(native, globalName, methodName, fn, isInstance) { } } -// TODO: rename me to be more generic! -function methodIsIncluded(methodName, opt) { - return opt.include && arrayIncludes(opt.include, methodName); +function extendOptionsInclude(name, opt) { + return opt && opt.include && arrayIncludes(opt.include, name); } -function methodIsExcluded(methodName, opt) { - return opt.exclude && arrayIncludes(opt.exclude, methodName); +function extendOptionsExclude(name, opt) { + return opt && opt.exclude && arrayIncludes(opt.exclude, name); } -function methodAllowedByArgs(methodName, opt) { - if (!opt) { - return true; +function extendOptionsDisallowExisting(opt) { + return opt && opt.existing === false; +} + +function namespaceIsAllowed(globalName, opt) { + return extendIsAllowed(globalName, opt); +} + +function methodIsAllowed(methodName, native, opt) { + if (isDisallowedEnhancement(methodName, native, opt)) { + return false; } - const included = methodIsIncluded(methodName, opt); - const excluded = methodIsExcluded(methodName, opt); + return extendIsAllowed(methodName, opt); +} + +function isDisallowedEnhancement(methodName, native, opt) { + if (extendOptionsDisallowExisting(opt)) { + return hasOwnProperty(native, methodName); + } + return false; +} + +function extendIsAllowed(name, opt) { + const included = extendOptionsInclude(name, opt); + const excluded = extendOptionsExclude(name, opt); if (included && excluded) { throw new Error(ERROR_EXTEND_CONFLICT); } - return included || (!opt.include && !excluded); + const isImplicitlyIncluded = !opt || !opt.include; + return included || (isImplicitlyIncluded && !excluded); } function canExtendNative(native) { @@ -299,7 +320,7 @@ function defineWithArgs(globalName, defineMethod, args) { } function defineAliases(globalName, defineMethod, str, fn) { - str.split(' ').forEach(methodName => { + str.split(/[ ,]/).forEach(methodName => { defineMethod(globalName, methodName, fn(methodName)); }); } diff --git a/test/core.js b/test/core.js index 820e7a923..89ba1d9e9 100644 --- a/test/core.js +++ b/test/core.js @@ -75,7 +75,6 @@ describe('Core', function() { }); it('should be able to define static aliases', function() { - // TODO: maybe this should be a comma?? Sugar.Number.defineStaticAlias('add1 add2', alias); assertEqual(Sugar.Number.add1(1), 2); assertEqual(Sugar.Number.add2(1), 3); @@ -91,6 +90,14 @@ describe('Core', function() { delete Sugar.Number.add2; }); + it('should be able to define aliases with a comma as well', function() { + Sugar.Number.defineInstanceAlias('add1,add2', alias); + assertEqual(Sugar.Number.add1(1), 2); + assertEqual(Sugar.Number.add2(1), 3); + delete Sugar.Number.add1; + delete Sugar.Number.add2; + }); + }); }); diff --git a/test/extended.js b/test/extended.js index 13f3293f1..82d7af40b 100644 --- a/test/extended.js +++ b/test/extended.js @@ -158,23 +158,6 @@ describe('Extended', function() { }); - xdescribe('Enhancing', function() { - - it('should allow overwrite param', function() { - // TODO: work this out - Sugar.Number.defineInstance('every', stringCheck, function() { - }); - - Sugar.Number.extend({ - overwrite: false - }); - assertUndefined((5).add); - assertEqual((5).mult(5), 25); - }); - - }); - - describe('Restore', function() { it('should restore all namespaces', function() { @@ -254,7 +237,7 @@ describe('Extended', function() { // prototypes. Simulating this by using the "new" keyword. FakeNumber.prototype.valueOf = function() { return 5; - } + }; Sugar.extend(); assertEqual(new Number().add(5), 10); }); @@ -316,8 +299,95 @@ describe('Extended', function() { }); - // TODO: how to handle enhanced methods? flags?? defineMathMethods? - // TODO: Sugar.Array.extend({ enhanceArray: false }); - // TODO: document API changes in changelog! + describe('Enhanced methods', function() { + + describe('Static', function() { + + beforeEach(function() { + var nativeFromCharCode = String.fromCharCode; + Sugar.String.defineStatic('fromCharCode', function(num) { + if (num >= 97 && num <= 122) { + num -= 32; + } + return nativeFromCharCode(num); + }); + }); + + afterEach(function() { + Sugar.restore(); + delete Sugar.String.fromCharCode; + }); + + it('should allow enhanced methods via global', function() { + Sugar.extend(); + assertEqual(String.fromCharCode(97), 'A'); + }); + + it('should allow enhanced methods via namespace', function() { + Sugar.String.extend(); + assertEqual(String.fromCharCode(97), 'A'); + }); + + it('should exclude enhanced methods via global', function() { + Sugar.extend({ + existing: false + }); + assertEqual(String.fromCharCode(97), 'a'); + }); + + it('should exclude enhanced methods via namespace', function() { + Sugar.String.extend({ + existing: false + }); + assertEqual(String.fromCharCode(97), 'a'); + }); + + }); + + describe('Instance', function() { + + beforeEach(function() { + var nativeToFixed = Number.prototype.toFixed; + Sugar.Number.defineInstance('toFixed', function(num, digits, sep) { + var str = nativeToFixed.call(num, digits); + if (sep) { + str = str.replace(/\./, sep); + } + return str; + }); + }); + + afterEach(function() { + Sugar.restore(); + delete Sugar.Number.toFixed; + }); + + it('should allow enhanced methods via global', function() { + Sugar.extend(); + assertEqual((5).toFixed(2, ','), '5,00'); + }); + + it('should allow enhanced methods via namespace', function() { + Sugar.Number.extend(); + assertEqual((5).toFixed(2, ','), '5,00'); + }); + + it('should exclude enhanced methods via global', function() { + Sugar.extend({ + existing: false + }); + assertEqual((5).toFixed(2, ','), '5.00'); + }); + + it('should exclude enhanced methods via namespace', function() { + Sugar.extend({ + existing: false + }); + assertEqual((5).toFixed(2, ','), '5.00'); + }); + + }); + + }); }); From 78edd639618e11aa2c0bae7b653c725ff4800f02 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 16 Dec 2018 03:04:14 +0900 Subject: [PATCH 007/191] refactored utils to own modules --- src/core/SugarChainableBase.js | 12 + src/core/extendUtils.js | 43 ++++ src/core/globalContext.js | 17 ++ src/core/index.js | 406 ++++++++++++++------------------- src/core/utils.js | 15 ++ test/core.js | 4 - 6 files changed, 255 insertions(+), 242 deletions(-) create mode 100644 src/core/SugarChainableBase.js create mode 100644 src/core/extendUtils.js create mode 100644 src/core/globalContext.js create mode 100644 src/core/utils.js diff --git a/src/core/SugarChainableBase.js b/src/core/SugarChainableBase.js new file mode 100644 index 000000000..e00b2abcf --- /dev/null +++ b/src/core/SugarChainableBase.js @@ -0,0 +1,12 @@ + +export default class ChainableBase { + + constructor(raw) { + this.raw = raw; + } + + valueOf() { + return this.raw; + } + +} diff --git a/src/core/extendUtils.js b/src/core/extendUtils.js new file mode 100644 index 000000000..de6094f3c --- /dev/null +++ b/src/core/extendUtils.js @@ -0,0 +1,43 @@ +import NamespaceStore from './NamespaceStore'; +import { hasOwnProperty } from './utils'; + +const nativeDescriptors = new NamespaceStore(); + +export function extendNative(native, globalName, methodName, fn, isInstance) { + if (canExtendNative(native)) { + if (hasOwnProperty(native, methodName)) { + const descriptor = Object.getOwnPropertyDescriptor(native, methodName); + nativeDescriptors.set(globalName, methodName, descriptor, isInstance); + } + try { + // Built-in methods MUST be configurable, writable, and non-enumerable. + Object.defineProperty(native, methodName, { + writable: true, + configurable: true, + value: fn + }); + } catch (e) { + // The extend operation may fail if a non-configurable property + // is set on the native. + nativeDescriptors.remove(globalName, methodName, isInstance); + throw e; + } + } +} + +export function restoreNative(native, globalName, methodName, fn, isInstance) { + if (native[methodName] === fn) { + if (nativeDescriptors.has(globalName, methodName, isInstance)) { + const descriptor = nativeDescriptors.get(globalName, methodName, isInstance); + Object.defineProperty(native, methodName, descriptor); + nativeDescriptors.remove(globalName, methodName, isInstance); + } else { + delete native[methodName]; + } + } +} + +function canExtendNative(native) { + return native !== Object.prototype; +} + diff --git a/src/core/globalContext.js b/src/core/globalContext.js new file mode 100644 index 000000000..67246b539 --- /dev/null +++ b/src/core/globalContext.js @@ -0,0 +1,17 @@ + +function getGlobalContext() { + // Get global context by keyword here to avoid issues with libraries + // that can potentially alter this script's context object. + return testGlobalContext(typeof global !== 'undefined' && global) + || testGlobalContext(typeof window !== 'undefined' && window) + || testGlobalContext(typeof self !== 'undefined' && self); +} + +function testGlobalContext(obj) { + // Note that Rhino uses a different "global" keyword so perform an + // extra check here to ensure that it's actually the global object. + // TODO: test this! + return obj && obj.Object === Object ? obj : null; +} + +export default getGlobalContext(); diff --git a/src/core/index.js b/src/core/index.js index 2cfb2144f..57333f7ff 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,146 +1,121 @@ import NamespaceStore from './NamespaceStore'; +import SugarChainableBase from './SugarChainableBase'; -const SUGAR = 'Sugar'; - -// TODO: test browserify -// TODO: test broccoli -// TODO: test rhino -// TODO: test QML -const IS_BROWSER = typeof window !== 'undefined'; +import globalContext from './globalContext'; +import { extendNative, restoreNative } from './extendUtils'; +import { hasOwnProperty, forEachProperty, arrayIncludes } from './utils'; -const globalContext = getGlobalContext(); -const nativeDescriptors = new NamespaceStore(); -const instanceMethods = new NamespaceStore(); +// --- Constants +const SUGAR = 'Sugar'; const ERROR_METHOD_DEFINED = 'Method already defined'; const ERROR_NATIVE_UNKNOWN = 'Built-in class does not exist'; const ERROR_EXTEND_CONFLICT = 'Extend options cannot have both include and exclude'; - export const VERSION = 'edge'; -function hasOwnProperty(obj, prop) { - return !!obj && Object.prototype.hasOwnProperty.call(obj, prop); -} - -function forEachProperty(obj, fn) { - for (let key in obj) { - if (!hasOwnProperty(obj, key)) continue; - if (fn.call(obj, key, obj[key], obj) === false) break; - } -} - -function arrayIncludes(arr, el) { - return arr.includes ? arr.includes(el) : arr.indexOf(el) !== -1; -} -function getGlobalContext() { - // Get global context by keyword here to avoid issues with libraries - // that can potentially alter this script's context object. - return testGlobalContext(typeof global !== 'undefined' && global) - || testGlobalContext(typeof window !== 'undefined' && window) - || testGlobalContext(typeof self !== 'undefined' && self); -} +// --- Setup -function testGlobalContext(obj) { - // Note that Rhino uses a different "global" keyword so perform an - // extra check here to ensure that it's actually the global object. - // TODO: test this! - return obj && obj.Object === Object ? obj : null; -} +const instanceMethods = new NamespaceStore(); -function toString() { - return SUGAR; -} -// TODO: rinse arrow functions -// TODO: need to export anything? +export function createNamespace(globalName) { -function nativeMethodProhibitedOnChainable(methodName) { - // Sugar chainables have their own constructors as well as "valueOf" - // methods, so exclude them here. The __proto__ argument should be - // trapped by the function check, however simply accessing this property - // on Object.prototype causes QML to segfault, so pre-emptively excluding - // it. Note we're intentionally allowing toString through to allow - // it to be wrapped as a chainable. - return methodName === 'constructor' - || methodName === 'valueOf' - || methodName === '__proto__'; -} + if (!globalContext[globalName]) { + throw new Error(ERROR_NATIVE_UNKNOWN); + } -function mapNativeToChainable(globalName, SugarChainable) { + if (Sugar[globalName]) { + return Sugar[globalName]; + } - const proto = globalContext[globalName].prototype; + class SugarChainable extends SugarChainableBase { - Object.getOwnPropertyNames(proto).forEach(methodName => { - var fn; - // TODO: not toString?? - if (nativeMethodProhibitedOnChainable(methodName)) { - return; - } - try { - fn = proto[methodName]; - if (typeof fn !== 'function') { - // Bail on anything not a function. - return; - } - } catch (e) { - // Function.prototype has properties that - // will throw errors when accessed. - return; + static extend(opt) { + extendNamespace(globalName, opt); } - return SugarChainable.prototype[methodName] = wrapChainableResult(fn); - }); -} -function canWrapChainable(obj) { - return obj != null && obj !== true && obj !== false; -} + static defineStatic(...args) { + return defineWithArgs(globalName, defineStatic, args); + } -function wrapChainableResult(fn) { - return function() { - const result = fn.apply(this.raw, arguments); - if (!canWrapChainable(result)) { - return result; + static defineInstance(...args) { + return defineWithArgs(globalName, defineInstance, args); } - // Objects may not have prototypes. - const ctor = result.constructor; - const globalName = ctor ? ctor.name : 'Object'; - let SugarChainable = Sugar[globalName]; - if (!SugarChainable && (!ctor || ctor === globalContext[globalName])) { - SugarChainable = createNamespace(globalName); + + static defineStaticAlias(str, fn) { + return defineAliases(globalName, defineStatic, str, fn); } - return SugarChainable ? new SugarChainable(result) : result; - }; -} -function exportGlobal(obj) { - if (IS_BROWSER) { - try { - // Reuse already defined Sugar global object. - globalContext[SUGAR] = globalContext[SUGAR] || obj; - } catch (e) { - // Contexts such as QML have a read-only global context. + static defineInstanceAlias(str, fn) { + return defineAliases(globalName, defineInstance, str, fn); } + } + + mapNativeToChainable(globalName, SugarChainable); + + return Sugar[globalName] = SugarChainable; } -class SugarChainableBase { - constructor(raw) { - this.raw = raw; +// --- Defining methods + +function defineWithArgs(globalName, defineMethod, args) { + if (typeof args[0] !== 'object') { + return defineMethod(globalName, args[0], args[1]); } + forEachProperty(args[0], (methodName, fn) => { + defineMethod(globalName, methodName, fn); + }); +} - valueOf() { - return this.raw; +function defineAliases(globalName, defineMethod, str, fn) { + str.split(/[ ,]/).forEach(methodName => { + defineMethod(globalName, methodName, fn(methodName)); + }); +} + +function defineStatic(globalName, methodName, staticFn) { + const SugarChainable = Sugar[globalName]; + assertMethodDoesNotExist(SugarChainable, methodName); + // Clear an instance method that previously exists. + // Sugar will error when redefining methods, so this + // is mostly for the test suite. + instanceMethods.remove(globalName, methodName, true); + SugarChainable[methodName] = staticFn; +} + +function defineInstance(globalName, methodName, staticFn) { + const SugarChainable = Sugar[globalName]; + assertMethodDoesNotExist(SugarChainable, methodName); + const instanceFn = wrapStaticMethodAsInstance(SugarChainable, staticFn); + instanceMethods.set(globalName, methodName, instanceFn, true); + SugarChainable.prototype[methodName] = wrapReturnWithChainable(instanceFn); + SugarChainable[methodName] = staticFn; +} + +function assertMethodDoesNotExist(SugarChainable, methodName) { + if (SugarChainable[methodName]) { + throw new Error(ERROR_METHOD_DEFINED); } +} +function wrapStaticMethodAsInstance(SugarChainable, fn) { + return function(...args) { + args.unshift(this); + return fn.apply(SugarChainable, args); + }; } + +// --- Extending + export function extend(opt) { try { opt = collectExtendOptions(opt); forEachNamespace(globalName => { - if (namespaceIsAllowed(globalName, opt)) { + if (extendIsAllowed(globalName, opt)) { extendNamespace(globalName, { existing: opt && opt.existing }); @@ -168,11 +143,32 @@ function collectExtendOptions(opt) { return Array.isArray(opt) ? { include: opt } : opt; } +function extendIsAllowed(name, opt) { + const included = extendOptionsInclude(name, opt); + const excluded = extendOptionsExclude(name, opt); + if (included && excluded) { + throw new Error(ERROR_EXTEND_CONFLICT); + } + const isImplicitlyIncluded = !opt || !opt.include; + return included || (isImplicitlyIncluded && !excluded); +} + +function extendOptionsInclude(name, opt) { + return opt && opt.include && arrayIncludes(opt.include, name); +} + +function extendOptionsExclude(name, opt) { + return opt && opt.exclude && arrayIncludes(opt.exclude, name); +} + + +// --- Extending via namespace + function extendNamespace(globalName, opt) { try { opt = collectExtendOptions(opt); forEachNamespaceMethod(globalName, (native, methodName, fn, isInstance) => { - if (methodIsAllowed(methodName, native, opt)) { + if (canExtendMethod(methodName, native, opt)) { extendNative(native, globalName, methodName, fn, isInstance); } }); @@ -200,57 +196,7 @@ function forEachNamespaceMethod(globalName, fn) { }); } -function extendNative(native, globalName, methodName, fn, isInstance) { - if (canExtendNative(native)) { - if (hasOwnProperty(native, methodName)) { - const descriptor = Object.getOwnPropertyDescriptor(native, methodName); - nativeDescriptors.set(globalName, methodName, descriptor, isInstance); - } - try { - // Built-in methods MUST be configurable, writable, and non-enumerable. - Object.defineProperty(native, methodName, { - writable: true, - configurable: true, - value: fn - }); - } catch (e) { - // The extend operation may fail if a non-configurable property - // is set on the native. - nativeDescriptors.remove(globalName, methodName, isInstance); - throw e; - } - } -} - -function restoreNative(native, globalName, methodName, fn, isInstance) { - if (native[methodName] === fn) { - if (nativeDescriptors.has(globalName, methodName, isInstance)) { - const descriptor = nativeDescriptors.get(globalName, methodName, isInstance); - Object.defineProperty(native, methodName, descriptor); - nativeDescriptors.remove(globalName, methodName, isInstance); - } else { - delete native[methodName]; - } - } -} - -function extendOptionsInclude(name, opt) { - return opt && opt.include && arrayIncludes(opt.include, name); -} - -function extendOptionsExclude(name, opt) { - return opt && opt.exclude && arrayIncludes(opt.exclude, name); -} - -function extendOptionsDisallowExisting(opt) { - return opt && opt.existing === false; -} - -function namespaceIsAllowed(globalName, opt) { - return extendIsAllowed(globalName, opt); -} - -function methodIsAllowed(methodName, native, opt) { +function canExtendMethod(methodName, native, opt) { if (isDisallowedEnhancement(methodName, native, opt)) { return false; } @@ -264,113 +210,97 @@ function isDisallowedEnhancement(methodName, native, opt) { return false; } -function extendIsAllowed(name, opt) { - const included = extendOptionsInclude(name, opt); - const excluded = extendOptionsExclude(name, opt); - if (included && excluded) { - throw new Error(ERROR_EXTEND_CONFLICT); - } - const isImplicitlyIncluded = !opt || !opt.include; - return included || (isImplicitlyIncluded && !excluded); -} - -function canExtendNative(native) { - return native !== Object.prototype; -} - -function assertMethodDoesNotExist(SugarChainable, methodName) { - if (SugarChainable[methodName]) { - throw new Error(ERROR_METHOD_DEFINED); - } +function extendOptionsDisallowExisting(opt) { + return opt && opt.existing === false; } -function defineStatic(globalName, methodName, staticFn) { - const SugarChainable = Sugar[globalName]; - assertMethodDoesNotExist(SugarChainable, methodName); - // Clear an instance method that previously exists. - // Sugar will error when redefining methods, so this - // is mostly for the test suite. - instanceMethods.remove(globalName, methodName, true); - SugarChainable[methodName] = staticFn; -} -function defineInstance(globalName, methodName, staticFn) { - const SugarChainable = Sugar[globalName]; - assertMethodDoesNotExist(SugarChainable, methodName); - const instanceFn = wrapStaticMethodAsInstance(SugarChainable, staticFn); - instanceMethods.set(globalName, methodName, instanceFn, true); - SugarChainable.prototype[methodName] = wrapChainableResult(instanceFn); - SugarChainable[methodName] = staticFn; -} +// --- Chainables -function wrapStaticMethodAsInstance(SugarChainable, fn) { - return function(...args) { - args.unshift(this); - return fn.apply(SugarChainable, args); +function wrapReturnWithChainable(fn) { + return function() { + const result = fn.apply(this.raw, arguments); + if (!canWrapChainable(result)) { + return result; + } + // Objects may not have prototypes. + const ctor = result.constructor; + const globalName = ctor ? ctor.name : 'Object'; + let SugarChainable = Sugar[globalName]; + if (!SugarChainable && (!ctor || ctor === globalContext[globalName])) { + SugarChainable = createNamespace(globalName); + } + return SugarChainable ? new SugarChainable(result) : result; }; } -function defineWithArgs(globalName, defineMethod, args) { - if (typeof args[0] !== 'object') { - return defineMethod(globalName, args[0], args[1]); - } - forEachProperty(args[0], (methodName, fn) => { - defineMethod(globalName, methodName, fn); - }); -} - -function defineAliases(globalName, defineMethod, str, fn) { - str.split(/[ ,]/).forEach(methodName => { - defineMethod(globalName, methodName, fn(methodName)); - }); +function canWrapChainable(obj) { + return obj != null && obj !== true && obj !== false; } -export function createNamespace(globalName) { - - if (!globalContext[globalName]) { - throw new Error(ERROR_NATIVE_UNKNOWN); - } - - if (Sugar[globalName]) { - return Sugar[globalName]; - } +function mapNativeToChainable(globalName, SugarChainable) { - class SugarChainable extends SugarChainableBase { + const proto = globalContext[globalName].prototype; - static extend(opt) { - extendNamespace(globalName, opt); + Object.getOwnPropertyNames(proto).forEach(methodName => { + var fn; + if (nativeMethodProhibitedOnChainable(methodName)) { + return; } - - static defineStatic(...args) { - return defineWithArgs(globalName, defineStatic, args); + try { + fn = proto[methodName]; + if (typeof fn !== 'function') { + // Bail on anything not a function. + return; + } + } catch (e) { + // Function.prototype has properties that + // will throw errors when accessed. + return; } + return SugarChainable.prototype[methodName] = wrapReturnWithChainable(fn); + }); +} - static defineInstance(...args) { - return defineWithArgs(globalName, defineInstance, args); - } +function nativeMethodProhibitedOnChainable(methodName) { + // Sugar chainables have their own constructors as well as "valueOf" + // methods, so exclude them here. The __proto__ argument should be + // trapped by the function check, however simply accessing this property + // on Object.prototype causes QML to segfault, so pre-emptively excluding + // it. Note we're intentionally allowing toString through to allow + // it to be wrapped as a chainable. + return methodName === 'constructor' + || methodName === 'valueOf' + || methodName === '__proto__'; +} - static defineStaticAlias(str, fn) { - return defineAliases(globalName, defineStatic, str, fn); - } - static defineInstanceAlias(str, fn) { - return defineAliases(globalName, defineInstance, str, fn); - } +// --- Misc +function exportToBrowser(obj) { + // TODO: test browserify + // TODO: test broccoli + // TODO: test rhino + // TODO: test QML + if (typeof window !== 'undefined') { + try { + // Reuse already defined Sugar global object. + globalContext[SUGAR] = globalContext[SUGAR] || obj; + } catch (e) { + // Contexts such as QML have a read-only global context. + } } +} - mapNativeToChainable(globalName, SugarChainable); - return Sugar[globalName] = SugarChainable; -} +// --- Default exports const Sugar = { VERSION, extend, restore, - toString, createNamespace }; -exportGlobal(Sugar); +exportToBrowser(Sugar); export default Sugar; diff --git a/src/core/utils.js b/src/core/utils.js new file mode 100644 index 000000000..42d8b6cbd --- /dev/null +++ b/src/core/utils.js @@ -0,0 +1,15 @@ + +export function hasOwnProperty(obj, prop) { + return !!obj && Object.prototype.hasOwnProperty.call(obj, prop); +} + +export function forEachProperty(obj, fn) { + for (let key in obj) { + if (!hasOwnProperty(obj, key)) continue; + if (fn.call(obj, key, obj[key], obj) === false) break; + } +} + +export function arrayIncludes(arr, el) { + return arr.includes ? arr.includes(el) : arr.indexOf(el) !== -1; +} diff --git a/test/core.js b/test/core.js index 89ba1d9e9..ca025d31e 100644 --- a/test/core.js +++ b/test/core.js @@ -4,10 +4,6 @@ describe('Core', function() { describe('Global', function() { - it('should have a toString', function() { - assertEqual(Sugar.toString(), 'Sugar'); - }); - it('should have a version', function() { assertMatch(Sugar.VERSION, /^(\d+\.\d+\.\d+|edge)$/); }); From f23a7790c543ff6f7700e87d838ec6ac363bd05d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 17 Dec 2018 01:53:26 +0900 Subject: [PATCH 008/191] Refactored Number#times --- CHANGELOG.md | 2 ++ src/number/index.js | 2 ++ src/number/times.js | 12 +++++++++ src/polyfills.js | 1 + test/number.js | 63 ++++++++++++++++++++++++++++----------------- webpack.config.js | 4 +-- 6 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 src/number/times.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b0588df2..f99836e7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ v3.0.0 - Renamed `Number#chr` to `Number#toChar`. - Renamed `Number#ordinalize` to `Number#toOrdinal`. - Removed `Number#toNumber`. +- `Number#times` now collects all return values including undefined. +- `Number#times` now errors on any input that is not a positive finite integer. - Cannot instantiate chainable without new keyword anymore (ES6). - `Sugar()` alias is no longer supported. Use `Sugar.extend()` instead. - Removed `String#includes` with RegExp support. diff --git a/src/number/index.js b/src/number/index.js index a67707c83..e538efa9d 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -23,6 +23,7 @@ import './round'; import './sin'; import './sqrt'; import './tan'; +import './times'; import './toChar'; import './toOrdinal'; @@ -50,6 +51,7 @@ export const { sin, sqrt, tan, + times, toChar, toOrdinal } = SugarNumber; diff --git a/src/number/times.js b/src/number/times.js new file mode 100644 index 000000000..268544278 --- /dev/null +++ b/src/number/times.js @@ -0,0 +1,12 @@ +import { defineInstance } from './namespace'; + +export default defineInstance('times', function(n, fn) { + if (n <= 0 || !Number.isFinite(n) || !Number.isInteger(n)) { + throw new RangeError('Number must be a positive, finite integer'); + } + const arr = []; + for(let i = 0; i < n; i++) { + arr.push(fn(i, n)); + } + return arr; +}); diff --git a/src/polyfills.js b/src/polyfills.js index c2e5e8c52..6cd66f3af 100644 --- a/src/polyfills.js +++ b/src/polyfills.js @@ -2,5 +2,6 @@ // TODO: These are better included using webpack.config.js // But that doesn't seem to work with Babel at the moment. import 'core-js/modules/es6.number.is-safe-integer'; +import 'core-js/modules/es6.number.is-integer'; import 'core-js/modules/es6.number.is-finite'; import 'core-js/modules/es6.number.is-nan'; diff --git a/test/number.js b/test/number.js index ec80ca7d4..ce5b36f18 100644 --- a/test/number.js +++ b/test/number.js @@ -271,32 +271,49 @@ namespace('Number', function() { assertEqual(isNaN(-Infinity), false); }); - /* + method('times', function(times) { + + function assertTimesRan(n, actual) { + var count = 0; + times(n, function() { + count++; + }); + assertEqual(count, actual); + } + + function assertInvalidInput(n) { + assertError(function() { + times(n, function() {}); + }, RangeError); + } + + assertTimesRan(1, 1); + assertTimesRan(5, 5); + assertTimesRan(10, 10); + + assertInvalidInput(-1); + assertInvalidInput(1.5); + assertInvalidInput(NaN); + assertInvalidInput(null); + assertInvalidInput(undefined); + assertInvalidInput(Infinity); + assertInvalidInput(-Infinity); + + assertArrayEqual(times(3, function(i) { + return Math.pow(2, i); + }), [1,2,4]); + + assertArrayEqual(times(1, function(i, n) { + return n; + }), [1]); + + assertError(function() { + times(1); + }, TypeError); - method('times', function() { - var count = 0; - var callback = function(first) { - equal(first, count, 'first parameter is the index'); - count++; - return count; - }; - var result = run(5, 'times', [callback]); - equal(result, [1,2,3,4,5], 'result should be the collected return values'); - equal(count, 5, 'iterated 5 times'); - - var fn = function() {}; - var result = run(3, 'times', [fn]); - equal(result, undefined, 'Returning undefined should return nothing'); - - var fn = function(i) { - return i || undefined; - }; - var result = run(3, 'times', [fn]); - equal(result, [1, 2], 'Mixed return values only collects non-undefined'); - - raisesError(function() { run(5, 'times', []); }, 'no callback raises error', TypeError); }); + /* method('format', function() { diff --git a/webpack.config.js b/webpack.config.js index 76ff11d95..f329b3b9a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,8 +10,8 @@ module.exports = { }, entry: { sugar: [ - './src', - './src/polyfills' + './src/polyfills', + './src' ] }, module: { From 7873202a1105f2256926cda79ca740e1c2dfaf93 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 21 Dec 2018 02:26:34 +0900 Subject: [PATCH 009/191] Number#abbr and other refactor --- .eslintignore | 1 + .eslintrc | 10 +- CHANGELOG.md | 5 + package.json | 5 +- src/.eslintrc.json | 4 - src/core/extendUtils.js | 1 - src/core/index.js | 6 +- src/number/abbr.js | 143 +++++ src/number/abs.js | 10 +- src/number/acos.js | 1 - src/number/asin.js | 1 - src/number/atan.js | 1 - src/number/atan2.js | 1 - src/number/ceil.js | 4 +- src/number/cos.js | 1 - src/number/exp.js | 3 +- src/number/floor.js | 4 +- src/number/format.js | 3 + src/number/index.js | 26 +- src/number/isFinite.js | 3 +- src/number/isInteger.js | 3 +- src/number/isNaN.js | 3 +- src/number/isSafeInteger.js | 3 +- src/number/log.js | 6 +- src/number/pad.js | 3 + src/number/pow.js | 3 +- src/number/round.js | 4 +- src/number/sin.js | 1 - src/number/sqrt.js | 3 +- src/number/tan.js | 1 - src/number/times.js | 7 +- src/number/toHex.js | 6 + src/number/trunc.js | 3 + src/number/util/clamp.js | 3 + src/number/util/formatNumber.js | 10 + src/number/util/math.js | 17 + src/number/util/mathAliases.js | 25 - src/number/util/numberAliases.js | 9 - src/number/util/pad.js | 7 + src/number/util/replaceInteger.js | 28 + src/number/util/roundWithPrecision.js | 8 - src/number/util/roundingAliases.js | 11 - src/number/util/trunc.js | 3 - src/polyfills.js | 1 + src/util/assertions.js | 43 ++ src/util/toOrdinal.js | 5 +- src/util/typeChecks.js | 7 + test/.eslintrc | 4 +- test/helpers/intl.js | 22 + test/index.html | 1 + test/index.js | 7 +- test/number.js | 862 ++++++++------------------ 52 files changed, 636 insertions(+), 716 deletions(-) delete mode 100644 src/.eslintrc.json create mode 100644 src/number/abbr.js delete mode 100644 src/number/acos.js delete mode 100644 src/number/asin.js delete mode 100644 src/number/atan.js delete mode 100644 src/number/atan2.js delete mode 100644 src/number/cos.js create mode 100644 src/number/format.js create mode 100644 src/number/pad.js delete mode 100644 src/number/sin.js delete mode 100644 src/number/tan.js create mode 100644 src/number/toHex.js create mode 100644 src/number/trunc.js create mode 100644 src/number/util/clamp.js create mode 100644 src/number/util/formatNumber.js create mode 100644 src/number/util/math.js delete mode 100644 src/number/util/mathAliases.js delete mode 100644 src/number/util/numberAliases.js create mode 100644 src/number/util/pad.js create mode 100644 src/number/util/replaceInteger.js delete mode 100644 src/number/util/roundWithPrecision.js delete mode 100644 src/number/util/roundingAliases.js delete mode 100644 src/number/util/trunc.js create mode 100644 src/util/assertions.js create mode 100644 src/util/typeChecks.js create mode 100644 test/helpers/intl.js diff --git a/.eslintignore b/.eslintignore index 846b5d86e..c07a79c88 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,3 +5,4 @@ test/node test/browser dist lib +gulpfile.js diff --git a/.eslintrc b/.eslintrc index 135658601..48aba3449 100644 --- a/.eslintrc +++ b/.eslintrc @@ -8,14 +8,21 @@ "semi": ["error"], "new-cap": ["error"], "new-parens": ["error"], + "no-unused-vars": ["error", { + args: "after-used" + }], "keyword-spacing": ["error"], - "no-multiple-empty-lines": [2, {"max": 3, "maxBOF": 1}], "object-shorthand": ["error", "consistent"], "block-scoped-var": ["error"], "operator-linebreak": ["error", "before"], "space-before-function-paren": ["error", "never"], "quotes": ["error", "single", "avoid-escape"], "space-before-blocks": ["error", "always"], + "no-multiple-empty-lines": [2, { + "max": 3, + "maxBOF": 1, + "maxEOF": 0 + }], "object-curly-newline": ["error", { "consistent": true }], @@ -27,6 +34,7 @@ }], }, "parserOptions": { + "ecmaVersion": 2019, "sourceType": "module" } } diff --git a/CHANGELOG.md b/CHANGELOG.md index f99836e7e..84b1ca018 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ v3.0.0 - Removed `String#includes` with RegExp support. - Removed ability to extend Object.prototype - Removed support for bower. +- `Number#format` no longer supports thousands or decimal separtors. Use Intl for this. +- `String#padLeft` and `String#padRight` were removed in favor of native `String#padStart` and `String#padEnd`. +- Renamed `Number#hex` to `Number#toHex`. +- Removed `base` param of `Number#pad` in favor of `Number#toHex`. +- Removed trigonometric aliases sin, cos, etc in favor of native Math. TODO: diff --git a/package.json b/package.json index 3d563c0d8..f38d69dec 100644 --- a/package.json +++ b/package.json @@ -55,10 +55,11 @@ "gulp-file": "^0.3.0", "gulp-util": "^3.0.6", "istanbul": "^0.4.5", + "jsdoc": "^3.5.5", "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.20", + "ready-test": "^1.0.22", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", @@ -71,8 +72,10 @@ "@babel/cli": "^7.2.0", "@babel/runtime": "^7.2.0", "@babel/runtime-corejs2": "^7.2.0", + "babel-eslint": "^10.0.1", "babel-plugin-add-module-exports": "^1.0.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "depcheck": "^0.6.11", "lodash": "^4.17.11", "remove-defineproperty-webpack-plugin": "0.0.3" } diff --git a/src/.eslintrc.json b/src/.eslintrc.json deleted file mode 100644 index d8f7e1a22..000000000 --- a/src/.eslintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "globals": { - } -} diff --git a/src/core/extendUtils.js b/src/core/extendUtils.js index de6094f3c..128b67be9 100644 --- a/src/core/extendUtils.js +++ b/src/core/extendUtils.js @@ -40,4 +40,3 @@ export function restoreNative(native, globalName, methodName, fn, isInstance) { function canExtendNative(native) { return native !== Object.prototype; } - diff --git a/src/core/index.js b/src/core/index.js index 57333f7ff..044ea4d64 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -84,6 +84,7 @@ function defineStatic(globalName, methodName, staticFn) { // is mostly for the test suite. instanceMethods.remove(globalName, methodName, true); SugarChainable[methodName] = staticFn; + return staticFn; } function defineInstance(globalName, methodName, staticFn) { @@ -93,6 +94,7 @@ function defineInstance(globalName, methodName, staticFn) { instanceMethods.set(globalName, methodName, instanceFn, true); SugarChainable.prototype[methodName] = wrapReturnWithChainable(instanceFn); SugarChainable[methodName] = staticFn; + return staticFn; } function assertMethodDoesNotExist(SugarChainable, methodName) { @@ -253,7 +255,7 @@ function mapNativeToChainable(globalName, SugarChainable) { // Bail on anything not a function. return; } - } catch (e) { + } catch { // Function.prototype has properties that // will throw errors when accessed. return; @@ -286,7 +288,7 @@ function exportToBrowser(obj) { try { // Reuse already defined Sugar global object. globalContext[SUGAR] = globalContext[SUGAR] || obj; - } catch (e) { + } catch { // Contexts such as QML have a read-only global context. } } diff --git a/src/number/abbr.js b/src/number/abbr.js new file mode 100644 index 000000000..1b60d472f --- /dev/null +++ b/src/number/abbr.js @@ -0,0 +1,143 @@ +import { defineInstance } from './namespace'; +import { assertFinite } from '../util/assertions'; +import { trunc, round } from './util/math'; +import { isNumber } from '../util/typeChecks'; +import formatNumber from './util/formatNumber'; +import clamp from './util/clamp'; + +const ALIAS_METRIC = 'si'; +const ALIAS_BASIC = 'basic'; +const ALIAS_MEMORY = 'memory'; +const ALIAS_BINARY = 'binary'; +const ALIAS_INTEGER = 'integer'; + +const INTEGER_UNITS = 'tbmk|'; +const BASIC_UNITS = 'k|mμn'; +const MEMORY_UNITS = 'EPTGMK|'; +const METRIC_UNITS = 'YZEPTGMk|mμnpfazy'; + +const SAFE_PRECISION = 10; + +/** + * Returns an abbreviated form of the number. + * + * @param {string} n - The number. + * + * @param {string} [precision] - When passed, will truncate + * the number to the given precision. If null, the precision will + * be 0 unless the number is between -1 and 1. A negative number + * may also be passed. + * + * @param {string} [units="integer"] - A string representing the + * units to be used. + * + * @param {Intl.NumberFormat} [formatter] - If an Intl number + * formatter is passed, it will be used instead of the default + * formatter. For more see [NumberFormat]{@link https://mdn.io/NumberFormat}. + * + * @returns {string} + * + * @throws {TypeError} Will be thrown if the input number is + * not finite. This includes null, undefined, NaN, and Infinity. + * + * @example + * + * abbr(1000); // "1k" + * abbr(1000000); // "1m" + * abbr(1234, 1); // "1.2k" + * abbr(1234, 2); // "1.23k" + * abbr(.15); // "0.15" + * abbr(.15, 2, 'basic'); // "150m" + * abbr(1234, 2, null, deFormatter); // "1,23k" + * + */ +function abbr(n, precision, units, formatter) { + + assertFinite(n); + + const isBinary = units === ALIAS_BINARY; + + units = getUnitAlias(units); + + const mid = units.indexOf('|'); + const offset = Math.floor(getExponent(n, isBinary) / 3); + + const index = clamp(mid - offset, 0, units.length - 1); + let unit = units.charAt(index); + + if (unit === '|') { + unit = ''; + } else { + n = getNumberInUnit(n, index - mid, isBinary); + } + + n = getTruncated(n, precision); + + if (n === 0) { + return '0'; + } + + return getFormatted(n, formatter) + unit; +} + +function getUnitAlias(units) { + switch (units) { + case ALIAS_BASIC: return BASIC_UNITS; + case ALIAS_MEMORY: return MEMORY_UNITS; + case ALIAS_BINARY: return MEMORY_UNITS; + case ALIAS_METRIC: return METRIC_UNITS; + case ALIAS_INTEGER: return INTEGER_UNITS; + } + return units || INTEGER_UNITS; +} + +function getExponent(n, isBinary) { + if (n === 0) { + return 0; + } + n = Math.abs(n); + let exp; + if (isBinary) { + exp = Math.log2(n) / 10 * 3; + } else { + exp = Math.log10(n); + } + return Math.floor(getSafe(exp)); +} + +function getNumberInUnit(n, offset, isBinary) { + if (isBinary) { + n *= Math.pow(2, 10 * offset); + } else { + n *= Math.pow(10, offset * 3); + } + return getSafe(n); +} + +function getTruncated(n, precision) { + if (!isNumber(precision) && n > -1 && n < 1) { + // If the number is small and no precision + // is specified, then let it through. + return n; + } + if (precision < 0) { + // Prevent negative precisions from returning 0. + precision = Math.max(precision, -getExponent(n)); + } + return trunc(n, precision || 0); +} + +function getFormatted(n, formatter) { + if (formatter) { + return formatter.format(n); + } + return formatNumber(n); +} + +function getSafe(n) { + // Catching issues with both unsafe numbers and inexact + // Math.logN implementations by rounding up front. + return round(n, SAFE_PRECISION); +} + +export default defineInstance('abbr', abbr); diff --git a/src/number/abs.js b/src/number/abs.js index f439efe3f..4a4bec9c8 100644 --- a/src/number/abs.js +++ b/src/number/abs.js @@ -1 +1,9 @@ -export { abs as default } from './util/mathAliases'; +import { defineInstance } from './namespace'; + +export default defineInstance('abs', function(n) { + // Note that .valueOf() here is only required due to a + // very strange bug in iOS7 that only occurs occasionally + // in which Math.abs() called on non-primitive numbers + // returns a completely different number (Issue #400) + return Math.abs(n.valueOf()); +}); diff --git a/src/number/acos.js b/src/number/acos.js deleted file mode 100644 index b7d434d70..000000000 --- a/src/number/acos.js +++ /dev/null @@ -1 +0,0 @@ -export { acos as default } from './util/mathAliases'; diff --git a/src/number/asin.js b/src/number/asin.js deleted file mode 100644 index 05cb4b97b..000000000 --- a/src/number/asin.js +++ /dev/null @@ -1 +0,0 @@ -export { asin as default } from './util/mathAliases'; diff --git a/src/number/atan.js b/src/number/atan.js deleted file mode 100644 index e7aef10d9..000000000 --- a/src/number/atan.js +++ /dev/null @@ -1 +0,0 @@ -export { atan as default } from './util/mathAliases'; diff --git a/src/number/atan2.js b/src/number/atan2.js deleted file mode 100644 index 8e7e9695d..000000000 --- a/src/number/atan2.js +++ /dev/null @@ -1 +0,0 @@ -export { atan2 as default } from './util/mathAliases'; diff --git a/src/number/ceil.js b/src/number/ceil.js index d5f5dc884..ae73f8bd4 100644 --- a/src/number/ceil.js +++ b/src/number/ceil.js @@ -1 +1,3 @@ -export { ceil as default } from './util/roundingAliases'; +import { defineInstance } from './namespace'; +import { ceil } from './util/math'; +export default defineInstance('ceil', ceil); diff --git a/src/number/cos.js b/src/number/cos.js deleted file mode 100644 index 1f2c77d06..000000000 --- a/src/number/cos.js +++ /dev/null @@ -1 +0,0 @@ -export { cos as default } from './util/mathAliases'; diff --git a/src/number/exp.js b/src/number/exp.js index b50fa05a1..afe2f91bb 100644 --- a/src/number/exp.js +++ b/src/number/exp.js @@ -1 +1,2 @@ -export { exp as default } from './util/mathAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('exp', Math.exp); diff --git a/src/number/floor.js b/src/number/floor.js index befc75297..f1c98415e 100644 --- a/src/number/floor.js +++ b/src/number/floor.js @@ -1 +1,3 @@ -export { floor as default } from './util/roundingAliases'; +import { defineInstance } from './namespace'; +import { floor } from './util/math'; +export default defineInstance('floor', floor); diff --git a/src/number/format.js b/src/number/format.js new file mode 100644 index 000000000..ef2f170aa --- /dev/null +++ b/src/number/format.js @@ -0,0 +1,3 @@ +import { defineInstance } from './namespace'; +import formatNumber from './util/formatNumber'; +export default defineInstance('format', formatNumber); diff --git a/src/number/index.js b/src/number/index.js index e538efa9d..564b2423c 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -1,14 +1,11 @@ import SugarNumber from './namespace'; +import './abbr'; import './abs'; -import './acos'; -import './asin'; -import './atan'; -import './atan2'; import './ceil'; -import './cos'; import './exp'; import './floor'; +import './format'; import './isEven'; import './isFinite'; import './isInteger'; @@ -17,26 +14,24 @@ import './isNaN'; import './isOdd'; import './isSafeInteger'; import './log'; +import './pad'; import './pow'; import './random'; import './round'; -import './sin'; import './sqrt'; -import './tan'; import './times'; import './toChar'; +import './toHex'; import './toOrdinal'; +import './trunc'; export const { + abbr, abs, - acos, - asin, - atan, - atan2, ceil, - cos, exp, floor, + format, isEven, isFinite, isInteger, @@ -45,15 +40,16 @@ export const { isOdd, isSafeInteger, log, + pad, pow, random, round, - sin, sqrt, - tan, times, toChar, - toOrdinal + toHex, + toOrdinal, + trunc } = SugarNumber; export default SugarNumber; diff --git a/src/number/isFinite.js b/src/number/isFinite.js index 50e7929de..249c3cc07 100644 --- a/src/number/isFinite.js +++ b/src/number/isFinite.js @@ -1 +1,2 @@ -export { isFinite as default } from './util/numberAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('isFinite', Number.isFinite); diff --git a/src/number/isInteger.js b/src/number/isInteger.js index 2a22e6a03..0fc14de7c 100644 --- a/src/number/isInteger.js +++ b/src/number/isInteger.js @@ -1 +1,2 @@ -export { isInteger as default } from './util/numberAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('isInteger', Number.isInteger); diff --git a/src/number/isNaN.js b/src/number/isNaN.js index b05e9475d..07ffeb200 100644 --- a/src/number/isNaN.js +++ b/src/number/isNaN.js @@ -1 +1,2 @@ -export { isNaN as default } from './util/numberAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('isNaN', Number.isNaN); diff --git a/src/number/isSafeInteger.js b/src/number/isSafeInteger.js index 3bc72357d..91b40232f 100644 --- a/src/number/isSafeInteger.js +++ b/src/number/isSafeInteger.js @@ -1 +1,2 @@ -export { isSafeInteger as default } from './util/numberAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('isSafeInteger', Number.isSafeInteger); diff --git a/src/number/log.js b/src/number/log.js index 8c19e8cf9..c7f3c1628 100644 --- a/src/number/log.js +++ b/src/number/log.js @@ -1,5 +1,9 @@ import { defineInstance } from './namespace'; export default defineInstance('log', function(n, base) { - return Math.log(n) / (base ? Math.log(base) : 1); + let log = Math.log(n); + if (base) { + log /= Math.log(base); + } + return log; }); diff --git a/src/number/pad.js b/src/number/pad.js new file mode 100644 index 000000000..e1e1a6f32 --- /dev/null +++ b/src/number/pad.js @@ -0,0 +1,3 @@ +import { defineInstance } from './namespace'; +import pad from './util/pad'; +export default defineInstance('pad', pad); diff --git a/src/number/pow.js b/src/number/pow.js index ca45ed099..1471020f5 100644 --- a/src/number/pow.js +++ b/src/number/pow.js @@ -1 +1,2 @@ -export { pow as default } from './util/mathAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('pow', Math.pow); diff --git a/src/number/round.js b/src/number/round.js index 9d33d1217..8982e40c7 100644 --- a/src/number/round.js +++ b/src/number/round.js @@ -1 +1,3 @@ -export { round as default } from './util/roundingAliases'; +import { defineInstance } from './namespace'; +import { round } from './util/math'; +export default defineInstance('round', round); diff --git a/src/number/sin.js b/src/number/sin.js deleted file mode 100644 index b3b9ed730..000000000 --- a/src/number/sin.js +++ /dev/null @@ -1 +0,0 @@ -export { sin as default } from './util/mathAliases'; diff --git a/src/number/sqrt.js b/src/number/sqrt.js index 5265c365c..b826a8a72 100644 --- a/src/number/sqrt.js +++ b/src/number/sqrt.js @@ -1 +1,2 @@ -export { sqrt as default } from './util/mathAliases'; +import { defineInstance } from './namespace'; +export default defineInstance('sqrt', Math.sqrt); diff --git a/src/number/tan.js b/src/number/tan.js deleted file mode 100644 index dedc85f4b..000000000 --- a/src/number/tan.js +++ /dev/null @@ -1 +0,0 @@ -export { tan as default } from './util/mathAliases'; diff --git a/src/number/times.js b/src/number/times.js index 268544278..43535db7b 100644 --- a/src/number/times.js +++ b/src/number/times.js @@ -1,11 +1,10 @@ import { defineInstance } from './namespace'; +import { assertPositiveInteger } from '../util/assertions'; export default defineInstance('times', function(n, fn) { - if (n <= 0 || !Number.isFinite(n) || !Number.isInteger(n)) { - throw new RangeError('Number must be a positive, finite integer'); - } + assertPositiveInteger(n); const arr = []; - for(let i = 0; i < n; i++) { + for (let i = 0; i < n; i++) { arr.push(fn(i, n)); } return arr; diff --git a/src/number/toHex.js b/src/number/toHex.js new file mode 100644 index 000000000..cbb3e82cb --- /dev/null +++ b/src/number/toHex.js @@ -0,0 +1,6 @@ +import { defineInstance } from './namespace'; +import pad from './util/pad'; + +export default defineInstance('toHex', function(n, digits) { + return pad(n, digits, null, false, 16); +}); diff --git a/src/number/trunc.js b/src/number/trunc.js new file mode 100644 index 000000000..18bc58dc8 --- /dev/null +++ b/src/number/trunc.js @@ -0,0 +1,3 @@ +import { defineInstance } from './namespace'; +import { trunc } from './util/math'; +export default defineInstance('trunc', trunc); diff --git a/src/number/util/clamp.js b/src/number/util/clamp.js new file mode 100644 index 000000000..d3ba0c6dc --- /dev/null +++ b/src/number/util/clamp.js @@ -0,0 +1,3 @@ +export default function(n, min, max) { + return Math.min(max, Math.max(min, n)); +} diff --git a/src/number/util/formatNumber.js b/src/number/util/formatNumber.js new file mode 100644 index 000000000..895f1477f --- /dev/null +++ b/src/number/util/formatNumber.js @@ -0,0 +1,10 @@ +import replaceInteger from './replaceInteger'; + +export default function formatNumber(n, precision, forceSign) { + return replaceInteger(n, precision, forceSign, 10, str => { + for (let i = str.length - 3; i > 0; i -= 3) { + str = str.slice(0, i) + ',' + str.slice(i); + } + return str; + }); +} diff --git a/src/number/util/math.js b/src/number/util/math.js new file mode 100644 index 000000000..16f108dc4 --- /dev/null +++ b/src/number/util/math.js @@ -0,0 +1,17 @@ +function alias(fn) { + return function(n, place) { + if (!place) { + return fn(n); + } + let mult = Math.pow(10, Math.abs(place)); + if (place < 0) { + mult = 1 / mult; + } + return fn(n * mult) / mult; + }; +} + +export const trunc = alias(Math.trunc); +export const round = alias(Math.round); +export const floor = alias(Math.floor); +export const ceil = alias(Math.ceil); diff --git a/src/number/util/mathAliases.js b/src/number/util/mathAliases.js deleted file mode 100644 index 1a98849cc..000000000 --- a/src/number/util/mathAliases.js +++ /dev/null @@ -1,25 +0,0 @@ -import SugarNumber, { defineInstanceAlias } from '../namespace'; - -defineInstanceAlias('abs pow sin asin cos acos tan atan atan2 exp sqrt', function(name) { - return function(n, arg) { - // Note that .valueOf() here is only required due to a - // very strange bug in iOS7 that only occurs occasionally - // in which Math.abs() called on non-primitive numbers - // returns a completely different number (Issue #400) - return Math[name](n.valueOf(), arg); - }; -}); - -export const { - abs, - pow, - sin, - asin, - cos, - acos, - tan, - atan, - atan2, - exp, - sqrt -} = SugarNumber; diff --git a/src/number/util/numberAliases.js b/src/number/util/numberAliases.js deleted file mode 100644 index 241351834..000000000 --- a/src/number/util/numberAliases.js +++ /dev/null @@ -1,9 +0,0 @@ -import SugarNumber, { defineInstanceAlias } from '../namespace'; - -defineInstanceAlias('isNaN isFinite isInteger isSafeInteger', function(name) { - return function(n) { - return Number[name](n); - }; -}); - -export const { isNaN, isFinite, isInteger, isSafeInteger } = SugarNumber; diff --git a/src/number/util/pad.js b/src/number/util/pad.js new file mode 100644 index 000000000..16b4def78 --- /dev/null +++ b/src/number/util/pad.js @@ -0,0 +1,7 @@ +import replaceInteger from './replaceInteger'; + +export default function(n, digits, precision, forceSign, base) { + return replaceInteger(n, precision, forceSign, base, str => { + return str.padStart(digits, '0'); + }); +} diff --git a/src/number/util/replaceInteger.js b/src/number/util/replaceInteger.js new file mode 100644 index 000000000..b9073368a --- /dev/null +++ b/src/number/util/replaceInteger.js @@ -0,0 +1,28 @@ +import { assertDecimal } from '../../util/assertions'; +import { isNumber } from '../../util/typeChecks'; +import { round } from './math'; + +function toAbsString(n, precision, base) { + const abs = Math.abs(n); + if (precision < 0) { + return round(abs, precision).toString(base); + } else if (isNumber(precision)) { + return abs.toFixed(precision); + } + return abs.toString(base); +} + +export default function(n, precision, forceSign, base, fn) { + n = +n; + assertDecimal(n); + + let sign = ''; + let [integer, decimal] = toAbsString(n, precision, base).split('.'); + integer = fn(integer); + if (n < 0) { + sign = '-'; + } else if (forceSign) { + sign = '+'; + } + return sign + integer + (decimal ? '.' + decimal : ''); +} diff --git a/src/number/util/roundWithPrecision.js b/src/number/util/roundWithPrecision.js deleted file mode 100644 index 5b5d4cafb..000000000 --- a/src/number/util/roundWithPrecision.js +++ /dev/null @@ -1,8 +0,0 @@ - -export default function(val, place, fn = Math.round) { - let mult = Math.pow(10, Math.abs(place || 0)); - if (place < 0) { - mult = 1 / mult; - } - return fn(val * mult) / mult; -} diff --git a/src/number/util/roundingAliases.js b/src/number/util/roundingAliases.js deleted file mode 100644 index 9ec6f9eb6..000000000 --- a/src/number/util/roundingAliases.js +++ /dev/null @@ -1,11 +0,0 @@ -import SugarNumber, { defineInstanceAlias } from '../namespace'; -import roundWithPrecision from './roundWithPrecision'; - -defineInstanceAlias('round floor ceil', function(name) { - const fn = Math[name]; - return function(n, place) { - return place ? roundWithPrecision(n, place, fn) : fn(n); - }; -}); - -export const { round, floor, ceil } = SugarNumber; diff --git a/src/number/util/trunc.js b/src/number/util/trunc.js deleted file mode 100644 index 1959658a6..000000000 --- a/src/number/util/trunc.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function(n) { - return n | 0; -} diff --git a/src/polyfills.js b/src/polyfills.js index 6cd66f3af..6518c86a2 100644 --- a/src/polyfills.js +++ b/src/polyfills.js @@ -5,3 +5,4 @@ import 'core-js/modules/es6.number.is-safe-integer'; import 'core-js/modules/es6.number.is-integer'; import 'core-js/modules/es6.number.is-finite'; import 'core-js/modules/es6.number.is-nan'; +import 'core-js/modules/es7.string.pad-start'; diff --git a/src/util/assertions.js b/src/util/assertions.js new file mode 100644 index 000000000..f98e2f802 --- /dev/null +++ b/src/util/assertions.js @@ -0,0 +1,43 @@ + +const MIN = 1e-6; +const MAX = 1e21; + +function usesScientificNotation(n) { + if (n === 0) { + return false; + } + const abs = Math.abs(n); + return abs >= MAX || abs <= MIN; +} + +function isFinite(n) { + return Number.isFinite(n); +} + +function isInteger(n) { + return Number.isInteger(n); +} + +export function assertFinite(n) { + if (!isFinite(n)) { + throw new TypeError(n + ' is not a finite number'); + } +} + +export function assertInteger(n) { + if (!isInteger(n)) { + throw new TypeError(n + ' is not an integer'); + } +} + +export function assertPositiveInteger(n) { + if (!isInteger(n) || n <= 0) { + throw new TypeError(n + ' is not a positive integer'); + } +} + +export function assertDecimal(n) { + if (!isFinite(n) || usesScientificNotation(n)) { + throw new TypeError(n + ' cannot be represented as a decimal'); + } +} diff --git a/src/util/toOrdinal.js b/src/util/toOrdinal.js index cef969a2f..a0632ce57 100644 --- a/src/util/toOrdinal.js +++ b/src/util/toOrdinal.js @@ -1,3 +1,4 @@ +import { assertInteger } from './assertions'; function getSuffix(n) { if (n >= 11 && n <= 13) { @@ -12,8 +13,6 @@ function getSuffix(n) { } export default function(n) { - if (!n || !isFinite(n)) { - throw new RangeError('Invalid number'); - } + assertInteger(n); return n + getSuffix(n); } diff --git a/src/util/typeChecks.js b/src/util/typeChecks.js new file mode 100644 index 000000000..1cdc1890a --- /dev/null +++ b/src/util/typeChecks.js @@ -0,0 +1,7 @@ +export function isNumber(obj) { + return typeof obj === 'number'; +} + +export function isString(obj) { + return typeof obj === 'string'; +} diff --git a/test/.eslintrc b/test/.eslintrc index b675ef13a..004578b60 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -31,9 +31,11 @@ "assertMatch": true, "assertNoError": true, "assertUndefined": true, + "assertArrayEqual": true, "assertInstanceOf": true, + "withNumberFormatter": true, "assertMatchingNamedExports": true, - "ensureNamespaceNotInitialized": true + "ensureNamespaceNotInitialized": true, }, "rules": { "comma-dangle": ["error"], diff --git a/test/helpers/intl.js b/test/helpers/intl.js new file mode 100644 index 000000000..cab59d215 --- /dev/null +++ b/test/helpers/intl.js @@ -0,0 +1,22 @@ +(function() { + + const INTL_SUPPORT = checkFullIntlSupport(); + + function checkFullIntlSupport() { + try { + var f = new Intl.NumberFormat('de-DE'); + return f.format(0.1) === '0,1'; + } catch (e) { + return false; + } + } + + withNumberFormatter = function(locale, fn) { + if (!INTL_SUPPORT) { + return; + } + var formatter = new Intl.NumberFormat(locale); + fn(formatter); + }; + +})(); diff --git a/test/index.html b/test/index.html index fefb9fb2f..f37633e3d 100644 --- a/test/index.html +++ b/test/index.html @@ -12,6 +12,7 @@ + diff --git a/test/index.js b/test/index.js index fbc765abd..aaf8c71f0 100644 --- a/test/index.js +++ b/test/index.js @@ -1,10 +1,11 @@ import Sugar from '../src'; // Helpers -import './helpers/suite'; -import './helpers/module'; -import './helpers/methods'; import './helpers/namespace'; +import './helpers/methods'; +import './helpers/module'; +import './helpers/suite'; +import './helpers/intl'; // Tests import './core'; diff --git a/test/number.js b/test/number.js index ce5b36f18..a10fc945c 100644 --- a/test/number.js +++ b/test/number.js @@ -35,6 +35,8 @@ namespace('Number', function() { assertEqual(round(322855.241, -6), 0); assertEqual(round(722855.241, -6), 1000000); assertEqual(round(722855.241, -8), 0); + assertEqual(round(1e-21, 1), 0); + assertEqual(round(1e-21, -1), 0); }); method('ceil', function(ceil) { @@ -70,6 +72,17 @@ namespace('Number', function() { assertEqual(floor(4417.1318, [-3]), 4000); }); + method('trunc', function(trunc) { + assertEqual(trunc(5), 5); + assertEqual(trunc(5.25), 5); + assertEqual(trunc(NaN), NaN); + assertEqual(trunc(Infinity), Infinity); + assertEqual(trunc(5.25, 1), 5.2); + assertEqual(trunc(5.25, 2), 5.25); + assertEqual(trunc(-5.25, 1), -5.2); + assertEqual(trunc(-5.25, 2), -5.25); + }); + method('abs', function(abs) { assertEqual(abs(-5), 5); assertEqual(abs(5), 5); @@ -93,48 +106,6 @@ namespace('Number', function() { assertEqual(log(Math.E), 1); }); - method('sin', function(sin) { - assertEqual(sin(0), 0); - assertEqual(sin(Math.PI), 0); - assertEqual(sin(Math.PI / 2), 1); - assertEqual(sin(Math.PI / 4), Math.sqrt(2) / 2); - assertEqual(sin(Math.PI / 6), 0.5); - }); - - method('cos', function(cos) { - assertEqual(cos(0), 1); - assertEqual(cos(Math.PI), -1); - assertEqual(cos(Math.PI / 2), 0); - assertEqual(cos(Math.PI / 4), Math.sqrt(2) / 2); - assertEqual(cos(Math.PI / 6), Math.sqrt(3) / 2); - }); - - method('tan', function(tan) { - assertEqual(tan(0), 0); - assertEqual(tan(Math.PI), 0); - assertEqual(tan(Math.PI / 4), 1); - }); - - method('asin', function(asin) { - assertEqual(asin(0), 0); - assertEqual(asin(1), Math.PI / 2); - }); - - method('acos', function(acos) { - assertEqual(acos(1), 0); - assertEqual(acos(0), Math.PI / 2); - }); - - method('atan', function(atan) { - assertEqual(atan(0), 0); - assertEqual(atan(1), Math.PI / 4); - }); - - method('atan2', function(atan2) { - assertEqual(atan2(0, 0), 0); - assertEqual(atan2(1, 1), Math.PI / 4); - }); - method('exp', function(exp) { assertEqual(exp(0), 1); assertEqual(exp(1), Math.exp(1)); @@ -193,6 +164,7 @@ namespace('Number', function() { method('toOrdinal', function(toOrdinal) { + assertEqual(toOrdinal(0), '0th'); assertEqual(toOrdinal(1), '1st'); assertEqual(toOrdinal(2), '2nd'); assertEqual(toOrdinal(3), '3rd'); @@ -221,15 +193,15 @@ namespace('Number', function() { assertEqual(toOrdinal(104), '104th'); assertEqual(toOrdinal(105), '105th'); + assertEqual(toOrdinal(-0), '0th'); assertEqual(toOrdinal(-1), '-1st'); assertEqual(toOrdinal(-2), '-2nd'); assertEqual(toOrdinal(-3), '-3rd'); assertEqual(toOrdinal(-4), '-4th'); assertEqual(toOrdinal(-5), '-5th'); - assertError(toOrdinal.bind(null, 0)); - assertError(toOrdinal.bind(null, -0)); assertError(toOrdinal.bind(null, NaN)); + assertError(toOrdinal.bind(null, 5.55)); assertError(toOrdinal.bind(null, null)); assertError(toOrdinal.bind(null, undefined)); assertError(toOrdinal.bind(null, Infinity)); @@ -284,7 +256,7 @@ namespace('Number', function() { function assertInvalidInput(n) { assertError(function() { times(n, function() {}); - }, RangeError); + }, TypeError); } assertTimesRan(1, 1); @@ -313,586 +285,264 @@ namespace('Number', function() { }); - /* + method('format', function(format) { - method('format', function() { - - test(100, '100'); - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1,000'); - test(10000, '10,000'); - test(100000, '100,000'); - test(1000000, '1,000,000'); - test(1000000.01, '1,000,000.01'); - test(-100, '-100'); - test(-1, '-1'); - test(-1000, '-1,000'); - test(-1000000.01, '-1,000,000.01'); - test(0.52, '0.52'); - test(9999999.99, '9,999,999.99'); - - // These discrepancies are due to floating point variable limitations. - equal(run(100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '100,046,546,510,000'); - equal(run(-100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '-100,046,546,510,000'); - - Sugar.Number.setOption('thousands', ' '); - Sugar.Number.setOption('decimal', ','); - test(1000, [null, ' '], '1 000', 'with space'); - test(1532587, [null, ' '], '1 532 587', 'larget with space'); - test(1532587.5752, [null, ' ', ','], '1 532 587,5752', 'larger number with decimal'); - - Sugar.Number.setOption('thousands', '.'); - Sugar.Number.setOption('decimal', ','); - test(9999999.99, [null, '.',','], '9.999.999,99', 'Euro style!'); - - Sugar.Number.setOption('thousands', ''); - Sugar.Number.setOption('decimal', '.'); - test(9999999.99, [null, ''], '9999999.99', 'empty string'); - - Sugar.Number.setOption('thousands', ''); - Sugar.Number.setOption('decimal', ''); - test(9999999.99, [null, '', ''], '999999999', 'no punctuation'); - - Sugar.Number.setOption('thousands', null); - Sugar.Number.setOption('decimal', null); - test(9999999.99, [null, '', ''], '9,999,999.99', 'null returns to defaults'); + assertEqual(format(1), '1'); + assertEqual(format(10), '10'); + assertEqual(format(100), '100'); + assertEqual(format(1000), '1,000'); + assertEqual(format(1000000), '1,000,000'); + assertEqual(format(1000000000), '1,000,000,000'); - withArgs([2], function() { - test(1, '1.00'); - test(10, '10.00'); - test(100, '100.00'); - test(1000, '1,000.00'); - test(10000, '10,000.00'); - test(100000, '100,000.00'); - test(1000000, '1,000,000.00'); - - test(-1, '-1.00'); - test(-10, '-10.00'); - test(-100, '-100.00'); - test(-1000, '-1,000.00'); - test(-10000, '-10,000.00'); - test(-100000, '-100,000.00'); - test(-1000000, '-1,000,000.00'); - - test(2.435, '2.44'); - }); - - withArgs([4], function() { - test(1, '1.0000'); - test(10, '10.0000'); - test(100, '100.0000'); - test(1000, '1,000.0000'); - test(10000, '10,000.0000'); - test(100000, '100,000.0000'); - test(1000000, '1,000,000.0000'); - test(-1, '-1.0000'); - test(-10, '-10.0000'); - test(-100, '-100.0000'); - test(-1000, '-1,000.0000'); - test(-10000, '-10,000.0000'); - test(-100000, '-100,000.0000'); - test(-1000000, '-1,000,000.0000'); - }); - - test(553599.435, [2], '553,599.44', 'to 2 places'); - test(553599.435, [1], '553,599.4', 'to 1 place'); - test(553599.435, [0], '553,599', 'to 0 places'); - test(553599.435, [-1], '553,600', 'to -1 places'); - test(553599.435, [-2], '553,600', 'to -2 places'); - test(553599.435, [-3], '554,000', 'to -3 places'); - test(553599.435, [-4], '550,000', 'to -4 places'); - test(553599.435, [-5], '600,000', 'to -5 places'); - - // Testing object form - Sugar.Number.setOption({ - thousands: 'y' - }); - test(1000, [null, ' '], '1y000', 'y as separator'); - Sugar.Number.setOption({ - thousands: null - }); - - }); + assertEqual(format(-1), '-1'); + assertEqual(format(-10), '-10'); + assertEqual(format(-100), '-100'); + assertEqual(format(-1000), '-1,000'); + assertEqual(format(-1000000), '-1,000,000'); + assertEqual(format(-1000000000), '-1,000,000,000'); - method('pad', function() { - test(1, [0], '1', '1 no padding'); - test(1, [1], '1', '1 padded to 1 place'); - test(1, [2], '01', '1 padded to 2 places'); - test(1, [3], '001', '1 padded to 3 places'); - test(1, [4], '0001', '1 padded to 4 places'); - test(547, [0], '547', '547 no padding'); - test(547, [1], '547', '547 padded to 1 place'); - test(547, [2], '547', '547 padded to 2 places'); - test(547, [3], '547', '547 padded to 3 places'); - test(547, [4], '0547', '547 padded to 4 places'); - test(0, [0], '0', '0 no padding'); - test(0, [1], '0', '0 padded to 1 place'); - test(0, [2], '00', '0 padded to 2 places'); - test(0, [3], '000', '0 padded to 3 places'); - test(0, [4], '0000', '0 padded to 4 places'); - test(-1, [1], '-1', '-1 padded to 1 places'); - test(-1, [2], '-01', '-1 padded to 2 places'); - test(-1, [3], '-001', '-1 padded to 3 places'); - test(-1, [4], '-0001', '-1 padded to 4 places'); - test(1, [1, true], '+1', '1 padded to 1 places and sign'); - test(1, [2, true], '+01', '1 padded to 2 places and sign'); - test(1, [3, true], '+001', '1 padded to 3 places and sign'); - test(1, [4, true], '+0001', '1 padded to 4 places and sign'); - test(0, [1, true], '+0', '0 padded to 1 place and sign'); - test(547.528, [4], '0547.528', 'does not take decimal places into account'); - - test(255, [4, false, 16], '00ff', 'handles hex'); - test(2, [4, false, 2], '0010', 'handles binary'); - }); + assertEqual(format( 6666.66), '6,666.66'); + assertEqual(format(-6666.66), '-6,666.66'); - method('hex', function() { - test(0, '0'); - test(10, 'a'); - test(255, 'ff'); - test(0.5, '0.8'); - test(2.5, '2.8'); - test(2553423, '26f64f'); + assertEqual(format( 6666.66, 1), '6,666.7'); + assertEqual(format(-6666.66, 1), '-6,666.7'); - withArgs([2], function() { - test(0, '00'); - test(10, '0a'); - test(255, 'ff'); - test(0.5, '00.8'); - test(2.5, '02.8'); - }); + assertEqual(format( 1000, 2), '1,000.00'); + assertEqual(format(-1000, 2), '-1,000.00'); - withArgs([4], function() { - test(0, '0000'); - test(10, '000a'); - test(255, '00ff'); - test(0.5, '0000.8'); - test(2.5, '0002.8'); - }); - }); + assertEqual(format( 6666.66, -1), '6,670'); + assertEqual(format(-6666.66, -1), '-6,670'); - method('abbr', function() { - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1k'); - test(10000, '10k'); - test(100000, '100k'); - test(1000000, '1m'); - test(10000000, '10m'); - test(100000000, '100m'); - test(1000000000, '1b'); - test(10000000000, '10b'); - test(100000000000, '100b'); - test(1000000000000, '1t'); - test(1000000000000000000, '1,000,000t'); - - test(1, '1'); - test(12, '12'); - test(124, '124'); - test(1249, '1k'); - test(1749, '2k'); - test(12495, '12k'); - test(17495, '17k'); - test(124958, '125k'); - test(174958, '175k'); - test(1249584, '1m'); - test(1749584, '2m'); - - withArgs([1], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2k', 'decimal 1 place | 1,249'); - test(1749, '1.7k', 'decimal 1 place | 1,749'); - test(12495, '12.5k', 'decimal 1 place | 12,495'); - test(17495, '17.5k', 'decimal 1 place | 17,495'); - test(124958, '125k', 'decimal 1 place | 124,958'); - test(174958, '175k', 'decimal 1 place | 174,958'); - test(1249584, '1.2m', 'decimal 1 place | 1,249,584'); - test(1749584, '1.7m', 'decimal 1 place | 1,749,584'); - }); + assertEqual(format( 1e6), '1,000,000'); + assertEqual(format(-1e6), '-1,000,000'); - withArgs([2], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25k', 'decimal 2 places | 1,249'); - test(1749, '1.75k', 'decimal 2 places | 1,749'); - test(12495, '12.5k', 'decimal 2 places | 12,495'); - test(17495, '17.5k', 'decimal 2 places | 17,495'); - test(124958, '124.96k', 'decimal 2 places | 124,958'); - test(174958, '174.96k', 'decimal 2 places | 174,958'); - test(1249584, '1.25m', 'decimal 2 places | 1,249,584'); - test(1749584, '1.75m', 'decimal 2 places | 1,749,584'); - }); + assertEqual(format( 1e6, 2), '1,000,000.00'); + assertEqual(format(-1e6, 2), '-1,000,000.00'); - withArgs([3], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249k', 'decimal 3 places | 1,249'); - test(1749, '1.749k', 'decimal 3 places | 1,749'); - test(12495, '12.495k', 'decimal 3 places | 12,495'); - test(17495, '17.495k', 'decimal 3 places | 17,495'); - test(124958, '124.958k', 'decimal 3 places | 124,958'); - test(174958, '174.958k', 'decimal 3 places | 174,958'); - test(1249584, '1.25m', 'decimal 3 places | 1,249,584'); - test(1749584, '1.75m', 'decimal 3 places | 1,749,584'); + assertEqual(format( 0), '0'); + assertEqual(format(-0), '0'); - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(1749584, '1,75m', 'should respect global decimal marker'); - Sugar.Number.setOption('decimal', null); - }); + assertEqual(format( 0, 2), '0.00'); + assertEqual(format(-0, 2), '0.00'); - withArgs([-1], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0k', 'decimal -1 places | 1,249'); - test(1749, '0k', 'decimal -1 places | 1,749'); - test(12495, '10k', 'decimal -1 places | 12,495'); - test(17495, '20k', 'decimal -1 places | 17,495'); - test(124958, '120k', 'decimal -1 places | 124,958'); - test(174958, '170k', 'decimal -1 places | 174,958'); - test(1249584, '0m', 'decimal -1 places | 1,249,584'); - test(1749584, '0m', 'decimal -1 places | 1,749,584'); - }); + assertEqual(format('1000'), '1,000'); - test(0.1, '0', '0.1'); - test(0.01, '0', '0.01'); - test(0.001, '0', '0.001'); - test(0.0001, '0', '0.00001'); - test(0.00001, '0', '0.000001'); - test(0.000001, '0', '0.0000001'); - test(0.0000001, '0', '0.00000001'); - test(0.00000001, '0', '0.000000001'); - - test(1.1, '1', '1.1'); - test(1.01, '1', '1.01'); - test(1.001, '1', '1.001'); - test(1.0001, '1', '1.00001'); - test(1.00001, '1', '1.000001'); - test(1.000001, '1', '1.0000001'); - test(1.0000001, '1', '1.00000001'); - test(1.00000001, '1', '1.000000001'); - - test(1000.004, '1k', '1000.004'); - test(10000.004, '10k', '10,000.004'); - test(100000.004, '100k', '100,000.004'); - test(1000000.004, '1m', '1,000,000.004'); + assertError(function() { format(NaN); }); + assertError(function() { format(1e21); }); + assertError(function() { format(1e-6); }); + assertError(function() { format(Infinity); }); - withArgs([2], function() { - test(1000.004, '1k', '2 places | 1000.004'); - test(10000.004, '10k', '2 places | 10,000.004'); - test(100000.004, '100k', '2 places | 100,000.004'); - test(1000000.004, '1m', '2 places | 1,000,000.004'); - }); }); - method('metric', function() { - - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1k'); - test(10000, '10k'); - test(100000, '100k'); - test(1000000, '1,000k'); - test(10000000, '10,000k'); - test(100000000, '100,000k'); - test(1000000000, '1,000,000k'); - test(10000000000, '10,000,000k'); - test(100000000000, '100,000,000k'); - test(1000000000000, '1,000,000,000k'); - test(10000000000000, '10,000,000,000k'); - test(100000000000000, '100,000,000,000k'); - test(1000000000000000, '1,000,000,000,000k'); - test(10000000000000000, '10,000,000,000,000k'); - test(100000000000000000, '100,000,000,000,000k'); - - test(1, '1', 'decimal | 1'); - test(12, '12', 'decimal | 12'); - test(124, '124', 'decimal | 124'); - test(1249, '1k', 'decimal | 1,249'); - test(1749, '2k', 'decimal | 1,749'); - test(12495, '12k', 'decimal | 12,495'); - test(17495, '17k', 'decimal | 17,495'); - test(124958, '125k', 'decimal | 124,958'); - test(174958, '175k', 'decimal | 174,958'); - test(1249584, '1,250k', 'decimal | 1,249,584'); - test(1749584, '1,750k', 'decimal | 1,749,584'); - test(1249584000, '1,249,584k', 'decimal | 1,249,584,000'); - test(1749584000, '1,749,584k', 'decimal | 1,749,584,000'); - - test(0.1000000000000, '100m', 'fractional | 0.1'); - test(0.0100000000000, '10m', 'fractional | 0.01'); - test(0.0010000000000, '1m', 'fractional | 0.001'); - test(0.0001000000000, '100μ', 'fractional | 0.0001'); - test(0.0000100000000, '10μ', 'fractional | 0.00001'); - test(0.0000010000000, '1μ', 'fractional | 0.000001'); - test(0.0000001000000, '100n', 'fractional | 0.0000001'); - test(0.0000000100000, '10n', 'fractional | 0.00000001'); - test(0.0000000010000, '1n', 'fractional | 0.000000001'); - test(0.0000000001000, '0.1n', 'fractional | 0.0000000001'); - test(0.0000000000100, '0.01n', 'fractional | 0.00000000001'); - test(0.0000000000010, '0.001n', 'fractional | 0.000000000001'); - test(0.0000000000001, '0.0001n', 'fractional | 0.0000000000001'); - - test(0.1111111111111, '111m', 'fractional | 0 places | 0.1111111111111'); - test(0.0111111111111, '11m', 'fractional | 0 places | 0.0111111111111'); - test(0.0011111111111, '1m', 'fractional | 0 places | 0.0011111111111'); - test(0.0001111111111, '111μ', 'fractional | 0 places | 0.0001111111111'); - test(0.0000111111111, '11μ', 'fractional | 0 places | 0.0000111111111'); - test(0.0000011111111, '1μ', 'fractional | 0 places | 0.0000011111111'); - test(0.0000001111111, '111n', 'fractional | 0 places | 0.0000001111111'); - test(0.0000000111111, '11n', 'fractional | 0 places | 0.0000000111111'); - test(0.0000000011111, '1n', 'fractional | 0 places | 0.0000000011111'); - test(0.0000000001111, '0.1n', 'fractional | 0 places | 0.0000000001111'); - test(0.0000000000111, '0.01n', 'fractional | 0 places | 0.0000000000111'); - test(0.0000000000011, '0.001n', 'fractional | 0 places | 0.0000000000011'); - test(0.0000000000001, '0.0001n', 'fractional | 0 places | 0.0000000000001'); - - test(0.000000000000000001, '1e-9n', 'fractional | 0 places | 0.0000000000001'); - - test(1.1111111111111, '1', 'fractional | 0 places | 1.1111111111111'); - test(1.0111111111111, '1', 'fractional | 0 places | 1.0111111111111'); - test(1.0011111111111, '1', 'fractional | 0 places | 1.0011111111111'); - test(1.0001111111111, '1', 'fractional | 0 places | 1.0001111111111'); - test(1.0000111111111, '1', 'fractional | 0 places | 1.0000111111111'); - test(1.0000011111111, '1', 'fractional | 0 places | 1.0000011111111'); - test(1.0000001111111, '1', 'fractional | 0 places | 1.0000001111111'); - test(1.0000000111111, '1', 'fractional | 0 places | 1.0000000111111'); - test(1.0000000011111, '1', 'fractional | 0 places | 1.0000000011111'); - test(1.0000000001111, '1', 'fractional | 0 places | 1.0000000001111'); - test(1.0000000000111, '1', 'fractional | 0 places | 1.0000000000111'); - test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); - - test(1.1000000000001, '1', 'fractional | 0 places | 1.1000000000001'); - test(1.0100000000001, '1', 'fractional | 0 places | 1.0100000000001'); - test(1.0010000000001, '1', 'fractional | 0 places | 1.0010000000001'); - test(1.0001000000001, '1', 'fractional | 0 places | 1.0001000000001'); - test(1.0000100000001, '1', 'fractional | 0 places | 1.0000100000001'); - test(1.0000010000001, '1', 'fractional | 0 places | 1.0000010000001'); - test(1.0000001000001, '1', 'fractional | 0 places | 1.0000001000001'); - test(1.0000000100001, '1', 'fractional | 0 places | 1.0000000100001'); - test(1.0000000010001, '1', 'fractional | 0 places | 1.0000000010001'); - test(1.0000000001001, '1', 'fractional | 0 places | 1.0000000001001'); - test(1.0000000000101, '1', 'fractional | 0 places | 1.0000000000101'); - test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); - - withArgs([0, 'all'], function() { - test(10000000, '10M'); - test(100000000, '100M'); - test(1000000000, '1G'); - test(10000000000, '10G'); - test(100000000000, '100G'); - test(1000000000000, '1T'); - test(10000000000000, '10T'); - test(100000000000000, '100T'); - test(1000000000000000, '1P'); - test(10000000000000000, '10P'); - test(100000000000000000, '100P'); - - test(1, '1', 'decimal | 1'); - test(12, '12', 'decimal | 12'); - test(124, '124', 'decimal | 124'); - test(1249, '1K', 'decimal | 1,249'); - test(1749, '2K', 'decimal | 1,749'); - test(12495, '12K', 'decimal | 12,495'); - test(17495, '17K', 'decimal | 17,495'); - test(124958, '125K', 'decimal | 124,958'); - test(174958, '175K', 'decimal | 174,958'); - test(1249584, '1M', 'decimal | 1,249,584'); - test(1749584, '2M', 'decimal | 1,749,584'); - test(1249584000, '1G', 'decimal | 1,249,584,000'); - test(1749584000, '2G', 'decimal | 1,749,584,000'); + method('pad', function(pad) { + + assertEqual(pad(1), '1'); + assertEqual(pad(1, 0), '1'); + assertEqual(pad(1, 1), '1'); + assertEqual(pad(1, 2), '01'); + assertEqual(pad(1, 3), '001'); + + assertEqual(pad(-1), '-1'); + assertEqual(pad(-1, 0), '-1'); + assertEqual(pad(-1, 1), '-1'); + assertEqual(pad(-1, 2), '-01'); + + assertEqual(pad( 1, 2, 0, true), '+01'); + assertEqual(pad(-1, 2, 0, true), '-01'); + + assertEqual(pad(5.25, 4), '0005.25'); + assertEqual(pad(5.25, 4, 0), '0005'); + assertEqual(pad(5.25, 4, 1), '0005.3'); + assertEqual(pad(5, 4, 2, true), '+0005.00'); + assertEqual(pad(5, 4, null, true), '+0005'); + + assertError(function() { pad(NaN); }); + assertError(function() { pad(1e21); }); + assertError(function() { pad(1e-6); }); + assertError(function() { pad(Infinity); }); + + }); + + method('toHex', function(toHex) { + + assertEqual(toHex(0), '0'); + assertEqual(toHex(0, 2), '00'); + + assertEqual(toHex(255), 'ff'); + assertEqual(toHex(255, 4), '00ff'); + + assertEqual(toHex(255.5, 4), '00ff.8'); + + assertError(function() { toHex(NaN); }); + assertError(function() { toHex(1e21); }); + assertError(function() { toHex(1e-6); }); + assertError(function() { toHex(Infinity); }); + + }); + + method('abbr', function(abbr) { + + // Positive + assertEqual(abbr(0), '0'); + assertEqual(abbr(1), '1'); + assertEqual(abbr(10), '10'); + assertEqual(abbr(100), '100'); + assertEqual(abbr(999), '999'); + assertEqual(abbr(1000), '1k'); + assertEqual(abbr(1999), '1k'); + assertEqual(abbr(10000), '10k'); + assertEqual(abbr(100000), '100k'); + assertEqual(abbr(1000000), '1m'); + assertEqual(abbr(1000000000), '1b'); + assertEqual(abbr(1000000000000), '1t'); + assertEqual(abbr(1000000000000000), '1,000t'); + + // Negative + assertEqual(abbr(-1), '-1'); + assertEqual(abbr(-10), '-10'); + assertEqual(abbr(-100), '-100'); + assertEqual(abbr(-1000), '-1k'); + assertEqual(abbr(-10000), '-10k'); + assertEqual(abbr(-100000), '-100k'); + assertEqual(abbr(-1000000), '-1m'); + assertEqual(abbr(-1000000000), '-1b'); + assertEqual(abbr(-1000000000000), '-1t'); + assertEqual(abbr(-1000000000000000), '-1,000t'); + + // Decimal + assertEqual(abbr(0.1), '0.1'); + assertEqual(abbr(0.01), '0.01'); + assertEqual(abbr(0.001), '0.001'); + assertEqual(abbr(0.0001), '0.0001'); + assertEqual(abbr(1000000.25), '1m'); + + // With Precision + assertEqual(abbr(0, 0), '0'); + assertEqual(abbr(0, -1), '0'); + assertEqual(abbr(1748), '1k'); + assertEqual(abbr(1748, 1), '1.7k'); + assertEqual(abbr(1748, 2), '1.74k'); + assertEqual(abbr(1748, 3), '1.748k'); + assertEqual(abbr(1748, -1), '1k'); + assertEqual(abbr(155555, 0), '155k'); + assertEqual(abbr(155555, -1), '150k'); + assertEqual(abbr(155555, -2), '100k'); + assertEqual(abbr(155555, -3), '100k'); + assertEqual(abbr(-1748), '-1k'); + assertEqual(abbr(-1748, 1), '-1.7k'); + assertEqual(abbr(-1748, 2), '-1.74k'); + assertEqual(abbr(-1748, 3), '-1.748k'); + assertEqual(abbr(-155555, 0), '-155k'); + assertEqual(abbr(-155555, -1), '-150k'); + assertEqual(abbr(-155555, -2), '-100k'); + + // Basic si + assertEqual(abbr(1, 0, 'basic') + 'm', '1m'); + assertEqual(abbr(10, 0, 'basic') + 'm', '10m'); + assertEqual(abbr(100, 0, 'basic') + 'm', '100m'); + assertEqual(abbr(1000, 0, 'basic') + 'm', '1km'); + assertEqual(abbr(10000, 0, 'basic') + 'm', '10km'); + assertEqual(abbr(10000000, 0, 'basic') + 'm', '10,000km'); + + assertEqual(abbr(9, 0, 'basic') + 'm', '9m'); + assertEqual(abbr(99, 0, 'basic') + 'm', '99m'); + assertEqual(abbr(999, 0, 'basic') + 'm', '999m'); + assertEqual(abbr(9999, 0, 'basic') + 'm', '9km'); + assertEqual(abbr(99999, 0, 'basic') + 'm', '99km'); + assertEqual(abbr(99999999, 0, 'basic') + 'm', '99,999km'); + + assertEqual(abbr(.1, 0, 'basic') + 'm', '100mm'); + assertEqual(abbr(.01, 0, 'basic') + 'm', '10mm'); + assertEqual(abbr(.001, 0, 'basic') + 'm', '1mm'); + assertEqual(abbr(.0001, 0, 'basic') + 'm', '100μm'); + assertEqual(abbr(.00001, 0, 'basic') + 'm', '10μm'); + assertEqual(abbr(.000001, 0, 'basic') + 'm', '1μm'); + assertEqual(abbr(.0000001, 0, 'basic') + 'm', '100nm'); + assertEqual(abbr(.00000001, 0, 'basic') + 'm', '10nm'); + assertEqual(abbr(.000000001, 0, 'basic') + 'm', '1nm'); + + assertEqual(abbr(.9, 0, 'basic') + 'm', '900mm'); + assertEqual(abbr(.09, 0, 'basic') + 'm', '90mm'); + assertEqual(abbr(.009, 0, 'basic') + 'm', '9mm'); + assertEqual(abbr(.0009, 0, 'basic') + 'm', '900μm'); + assertEqual(abbr(.00009, 0, 'basic') + 'm', '90μm'); + assertEqual(abbr(.000009, 0, 'basic') + 'm', '9μm'); + assertEqual(abbr(.0000009, 0, 'basic') + 'm', '900nm'); + assertEqual(abbr(.00000009, 0, 'basic') + 'm', '90nm'); + assertEqual(abbr(.000000009, 0, 'basic') + 'm', '9nm'); + + // Full si + assertEqual(abbr(1, 0, 'si'), '1'); + assertEqual(abbr(1000, 0, 'si'), '1k'); + assertEqual(abbr(1000000, 0, 'si'), '1M'); + assertEqual(abbr(1000000000, 0, 'si'), '1G'); + assertEqual(abbr(1000000000000, 0, 'si'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'si'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'si'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'si'), '1Z'); + assertEqual(abbr(1000000000000000000000000, 0, 'si'), '1Y'); + assertEqual(abbr(1000000000000000000000000000, 0, 'si'), '1,000Y'); + + assertEqual(abbr(.001, 0, 'si'), '1m'); + assertEqual(abbr(.000001, 0, 'si'), '1μ'); + assertEqual(abbr(.000000001, 0, 'si'), '1n'); + assertEqual(abbr(.000000000001, 0, 'si'), '1p'); + assertEqual(abbr(.000000000000001, 0, 'si'), '1f'); + assertEqual(abbr(.000000000000000001, 0, 'si'), '1a'); + assertEqual(abbr(.000000000000000000001, 0, 'si'), '1z'); + assertEqual(abbr(.000000000000000000000001, 0, 'si'), '1y'); + assertEqual(abbr(.000000000000000000000000001, 0, 'si'), '0'); + assertEqual(abbr(.000000000000000000000000001, null, 'si'), '0.001y'); + + // Binary + assertEqual(abbr(1, 0, 'binary'), '1'); + assertEqual(abbr(Math.pow(2, 10), 0, 'binary') + 'B', '1KB'); + assertEqual(abbr(Math.pow(2, 20), 0, 'binary') + 'B', '1MB'); + assertEqual(abbr(Math.pow(2, 30), 0, 'binary') + 'B', '1GB'); + assertEqual(abbr(Math.pow(2, 40), 0, 'binary') + 'B', '1TB'); + assertEqual(abbr(Math.pow(2, 50), 0, 'binary') + 'B', '1PB'); + assertEqual(abbr(Math.pow(2, 60), 0, 'binary') + 'B', '1EB'); + assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1,024EB'); + + assertEqual(abbr(Math.pow(2, 10) - Math.pow(2, 0), 0, 'binary') + 'B', '1,023B'); + assertEqual(abbr(Math.pow(2, 20) - Math.pow(2, 10), 0, 'binary') + 'B', '1,023KB'); + assertEqual(abbr(Math.pow(2, 30) - Math.pow(2, 20), 0, 'binary') + 'B', '1,023MB'); + assertEqual(abbr(Math.pow(2, 40) - Math.pow(2, 30), 0, 'binary') + 'B', '1,023GB'); + assertEqual(abbr(Math.pow(2, 50) - Math.pow(2, 40), 0, 'binary') + 'B', '1,023TB'); + assertEqual(abbr(Math.pow(2, 60) - Math.pow(2, 50), 0, 'binary') + 'B', '1,023PB'); + assertEqual(abbr(Math.pow(2, 70) - Math.pow(2, 60), 0, 'binary') + 'B', '1,023EB'); + + // Memory + assertEqual(abbr(1, 0, 'memory'), '1'); + assertEqual(abbr(1000, 0, 'memory'), '1K'); + assertEqual(abbr(1000000, 0, 'memory'), '1M'); + assertEqual(abbr(1000000000, 0, 'memory'), '1G'); + assertEqual(abbr(1000000000000, 0, 'memory'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'memory'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'memory'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'memory'), '1,000E'); + + // Other + assertEqual(abbr(1755, 2, 'integer'), '1.75k'); + assertEqual(abbr(17555, 2, '|'), '17,555'); + assertEqual(abbr(.17555, 2, '|'), '0.17'); + assertEqual(abbr(.17555, null, '|'), '0.17555'); + + // Errors + assertError(function() { abbr(NaN); }); + assertError(function() { abbr(Infinity); }); + assertError(function() { abbr(null); }); + assertError(function() { abbr(undefined); }); + + withNumberFormatter('de-DE', function(formatter) { + assertEqual(abbr(1755, 1, 'integer', formatter), '1,7k'); + assertEqual(abbr(1755, 2, 'integer', formatter), '1,75k'); }); - withArgs([1], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2k', 'decimal 1 place | 1,249'); - test(1749, '1.7k', 'decimal 1 place | 1,749'); - test(12495, '12.5k', 'decimal 1 place | 12,495'); - test(17495, '17.5k', 'decimal 1 place | 17,495'); - test(124958, '125k', 'decimal 1 place | 124,958'); - test(174958, '175k', 'decimal 1 place | 174,958'); - test(1249584, '1,249.6k', 'decimal 1 place | 1,249,584'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(3232, [1], '3,2k', 'should respect global decimal marker'); - Sugar.Number.setOption('decimal', null); - }); - - withArgs([1, 'all'], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2K', 'decimal 1 place | 1,249'); - test(1749, '1.7K', 'decimal 1 place | 1,749'); - test(12495, '12.5K', 'decimal 1 place | 12,495'); - test(17495, '17.5K', 'decimal 1 place | 17,495'); - test(124958, '125K', 'decimal 1 place | 124,958'); - test(174958, '175K', 'decimal 1 place | 174,958'); - test(1249584, '1.2M', 'decimal 1 place | 1,249,584'); - test(1749584, '1.7M', 'decimal 1 place | 1,749,584'); - test(1249584000, '1.2G', 'decimal 1 place | 1,249,584,000'); - test(1749584000, '1.7G', 'decimal 1 place | 1,749,584,000'); - }); - - withArgs([2], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25k', 'decimal 2 places | 1,249'); - test(1749, '1.75k', 'decimal 2 places | 1,749'); - test(12495, '12.5k', 'decimal 2 places | 12,495'); - test(17495, '17.5k', 'decimal 2 places | 17,495'); - test(124958, '124.96k', 'decimal 2 places | 124,958'); - test(174958, '174.96k', 'decimal 2 places | 174,958'); - test(1249584, '1,249.58k', 'decimal 2 places | 1,249,584'); - }); - - withArgs([2, 'all'], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25K', 'decimal 2 places | 1,249'); - test(1749, '1.75K', 'decimal 2 places | 1,749'); - test(12495, '12.5K', 'decimal 2 places | 12,495'); - test(17495, '17.5K', 'decimal 2 places | 17,495'); - test(124958, '124.96K', 'decimal 2 places | 124,958'); - test(174958, '174.96K', 'decimal 2 places | 174,958'); - test(1249584, '1.25M', 'decimal 2 places | 1,249,584'); - test(1749584, '1.75M', 'decimal 2 places | 1,749,584'); - test(1249584000, '1.25G', 'decimal 2 places | 1,249,584,000'); - test(1749584000, '1.75G', 'decimal 2 places | 1,749,584,000'); - }); - - withArgs([3], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249k', 'decimal 3 places | 1,249'); - test(1749, '1.749k', 'decimal 3 places | 1,749'); - test(12495, '12.495k', 'decimal 3 places | 12,495'); - test(17495, '17.495k', 'decimal 3 places | 17,495'); - test(124958, '124.958k', 'decimal 3 places | 124,958'); - test(174958, '174.958k', 'decimal 3 places | 174,958'); - test(1249584, '1,249.584k', 'decimal 3 places | 1,249,584'); - }); - - withArgs([3, 'all'], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249K', 'decimal 3 places | 1,249'); - test(1749, '1.749K', 'decimal 3 places | 1,749'); - test(12495, '12.495K', 'decimal 3 places | 12,495'); - test(17495, '17.495K', 'decimal 3 places | 17,495'); - test(124958, '124.958K', 'decimal 3 places | 124,958'); - test(174958, '174.958K', 'decimal 3 places | 174,958'); - test(1249584, '1.25M', 'decimal 3 places | 1,249,584'); - test(1749584, '1.75M', 'decimal 3 places | 1,749,584'); - test(1249584000, '1.25G', 'decimal 3 places | 1,249,584,000'); - test(1749584000, '1.75G', 'decimal 3 places | 1,749,584,000'); - }); - - withArgs([-1], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0k', 'decimal -1 places | 1,249'); - test(1749, '0k', 'decimal -1 places | 1,749'); - test(12495, '10k', 'decimal -1 places | 12,495'); - test(17495, '20k', 'decimal -1 places | 17,495'); - test(124958, '120k', 'decimal -1 places | 124,958'); - test(174958, '170k', 'decimal -1 places | 174,958'); - test(1249584, '1,250k', 'decimal -1 places | 1,249,584'); - }); - - withArgs([-1, 'all'], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0K', 'decimal -1 places | 1,249'); - test(1749, '0K', 'decimal -1 places | 1,749'); - test(12495, '10K', 'decimal -1 places | 12,495'); - test(17495, '20K', 'decimal -1 places | 17,495'); - test(124958, '120K', 'decimal -1 places | 124,958'); - test(174958, '170K', 'decimal -1 places | 174,958'); - test(1249584, '0M', 'decimal -1 places | 1,249,584'); - test(1749584, '0M', 'decimal -1 places | 1,749,584'); - test(1249584000, '0G', 'decimal -1 places | 1,249,584,000'); - test(1749584000, '0G', 'decimal -1 places | 1,749,584,000'); - }); + }); - withArgs([2], function() { - test(0.1111111111111, '111.11m', 'fractional | 2 places | 0.1111111111111'); - test(0.0111111111111, '11.11m', 'fractional | 2 places | 0.0111111111111'); - test(0.0011111111111, '1.11m', 'fractional | 2 places | 0.0011111111111'); - test(0.0001111111111, '111.11μ', 'fractional | 2 places | 0.0001111111111'); - test(0.0000111111111, '11.11μ', 'fractional | 2 places | 0.0000111111111'); - test(0.0000011111111, '1.11μ', 'fractional | 2 places | 0.0000011111111'); - test(0.0000001111111, '111.11n', 'fractional | 2 places | 0.0000001111111'); - test(0.0000000111111, '11.11n', 'fractional | 2 places | 0.0000000111111'); - test(0.0000000011111, '1.11n', 'fractional | 2 places | 0.0000000011111'); - test(0.0000000001111, '0.1n', 'fractional | 2 places | 0.0000000001111'); - test(0.0000000000111, '0.01n', 'fractional | 2 places | 0.0000000000111'); - test(0.0000000000011, '0.001n', 'fractional | 2 places | 0.0000000000011'); - test(0.0000000000001, '0.0001n', 'fractional | 2 places | 0.0000000000001'); - - test(1.1111111111111, '1.11', 'fractional | 2 places | 1.1111111111111'); - test(1.0111111111111, '1.01', 'fractional | 2 places | 1.0111111111111'); - test(1.0011111111111, '1', 'fractional | 2 places | 1.0011111111111'); - test(1.0001111111111, '1', 'fractional | 2 places | 1.0001111111111'); - test(1.0000111111111, '1', 'fractional | 2 places | 1.0000111111111'); - test(1.0000011111111, '1', 'fractional | 2 places | 1.0000011111111'); - test(1.0000001111111, '1', 'fractional | 2 places | 1.0000001111111'); - test(1.0000000111111, '1', 'fractional | 2 places | 1.0000000111111'); - test(1.0000000011111, '1', 'fractional | 2 places | 1.0000000011111'); - test(1.0000000001111, '1', 'fractional | 2 places | 1.0000000001111'); - test(1.0000000000111, '1', 'fractional | 2 places | 1.0000000000111'); - test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); - - test(1.1000000000001, '1.1', 'fractional | 2 places | 1.1000000000001'); - test(1.0100000000001, '1.01', 'fractional | 2 places | 1.0100000000001'); - test(1.0010000000001, '1', 'fractional | 2 places | 1.0010000000001'); - test(1.0001000000001, '1', 'fractional | 2 places | 1.0001000000001'); - test(1.0000100000001, '1', 'fractional | 2 places | 1.0000100000001'); - test(1.0000010000001, '1', 'fractional | 2 places | 1.0000010000001'); - test(1.0000001000001, '1', 'fractional | 2 places | 1.0000001000001'); - test(1.0000000100001, '1', 'fractional | 2 places | 1.0000000100001'); - test(1.0000000010001, '1', 'fractional | 2 places | 1.0000000010001'); - test(1.0000000001001, '1', 'fractional | 2 places | 1.0000000001001'); - test(1.0000000000101, '1', 'fractional | 2 places | 1.0000000000101'); - test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); - }); + /* - equal(run(0.0001) + 'm', '100μm', '100μm'); - equal(run(0.001) + 'm', '1mm', '1mm'); - equal(run(0.01) + 'm', '10mm', '10mm'); - equal(run(0.1) + 'm', '100mm', '100mm'); - equal(run(1) + 'm', '1m', '1m'); - equal(run(1000) + 'm', '1km', '1km'); - equal(run(1000000) + 'm', '1,000km', '1,000km'); - equal(run(1000000000) + 'm', '1,000,000km', '1,000,000km'); - - withArgs([0, '|'], function() { - equal(run(1000000000) + 'm', '1,000,000,000m', 'limited to meters | 1,000,000,000m'); - equal(run(1000000) + 'm', '1,000,000m', 'limited to meters | 1,000,000m'); - equal(run(1000) + 'm', '1,000m', 'limited to meters | 1,000m'); - equal(run(1) + 'm', '1m', 'limited to meters | 1m'); - }); test(12334.5880, '12k', 'fractional | 0 places | 12334.5880'); test(12334.5880, [3], '12.335k', 'fractional | 3 places | 12334.5880'); From 036706705bb5ef92912222349118846bd38e02f4 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 22 Dec 2018 14:36:36 +0900 Subject: [PATCH 010/191] Handled placeholders in Number#abbr. --- CHANGELOG.md | 1 + src/number/abbr.js | 55 +++++--- test/number.js | 319 ++++++++++----------------------------------- 3 files changed, 112 insertions(+), 263 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84b1ca018..548ab59eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ v3.0.0 - Renamed `Number#hex` to `Number#toHex`. - Removed `base` param of `Number#pad` in favor of `Number#toHex`. - Removed trigonometric aliases sin, cos, etc in favor of native Math. +- Changed `Number#metric` placeholder token from `_` to `-`. TODO: diff --git a/src/number/abbr.js b/src/number/abbr.js index 1b60d472f..690c63e1d 100644 --- a/src/number/abbr.js +++ b/src/number/abbr.js @@ -5,16 +5,26 @@ import { isNumber } from '../util/typeChecks'; import formatNumber from './util/formatNumber'; import clamp from './util/clamp'; -const ALIAS_METRIC = 'si'; -const ALIAS_BASIC = 'basic'; -const ALIAS_MEMORY = 'memory'; -const ALIAS_BINARY = 'binary'; +/** + * @typedef {"integer"|"common"|"metric"|"binary"} UnitAlias + * + * @prop integer - Units suitable for large integers. Equivalent to "tmbk|". + * @prop common - Common si units, as used with "grams", "meters", etc. Equivalent to "k|mμn". + * @prop metric - Full si units. Equivalent to "YZEPTGMk|mμnpfazy". + * @prop binary - Alias for "metric", but considers the number as base 2. + * + */ const ALIAS_INTEGER = 'integer'; +const ALIAS_COMMON = 'common'; +const ALIAS_METRIC = 'metric'; +const ALIAS_BINARY = 'binary'; const INTEGER_UNITS = 'tbmk|'; -const BASIC_UNITS = 'k|mμn'; -const MEMORY_UNITS = 'EPTGMK|'; -const METRIC_UNITS = 'YZEPTGMk|mμnpfazy'; +const COMMON_UNITS = 'k|mμn'; +const METRIC_UNITS = 'YZEPTGMK|mμnpfazy'; + +const UNIT_MID = '|'; +const UNIT_PLACEHOLDER = '-'; const SAFE_PRECISION = 10; @@ -28,8 +38,11 @@ const SAFE_PRECISION = 10; * be 0 unless the number is between -1 and 1. A negative number * may also be passed. * - * @param {string} [units="integer"] - A string representing the - * units to be used. + * @param {string|UnitAlias} [units="integer"] - A string representing the + * units to be used, or an alias to a preset. The "|" token + * represents the midpoint, or zero. The "-" token represents a + * placeholder. If passed, the unit will be skipped and the next + * unit away from zero will be used. * * @param {Intl.NumberFormat} [formatter] - If an Intl number * formatter is passed, it will be used instead of the default @@ -47,7 +60,7 @@ const SAFE_PRECISION = 10; * abbr(1234, 1); // "1.2k" * abbr(1234, 2); // "1.23k" * abbr(.15); // "0.15" - * abbr(.15, 2, 'basic'); // "150m" + * abbr(.15, 2, 'common'); // "150m" * abbr(1234, 2, null, deFormatter); // "1,23k" * */ @@ -62,10 +75,9 @@ function abbr(n, precision, units, formatter) { const mid = units.indexOf('|'); const offset = Math.floor(getExponent(n, isBinary) / 3); - const index = clamp(mid - offset, 0, units.length - 1); - let unit = units.charAt(index); + let [unit, index] = getUnitAndIndex(mid, offset, units); - if (unit === '|') { + if (unit === UNIT_MID) { unit = ''; } else { n = getNumberInUnit(n, index - mid, isBinary); @@ -82,9 +94,8 @@ function abbr(n, precision, units, formatter) { function getUnitAlias(units) { switch (units) { - case ALIAS_BASIC: return BASIC_UNITS; - case ALIAS_MEMORY: return MEMORY_UNITS; - case ALIAS_BINARY: return MEMORY_UNITS; + case ALIAS_COMMON: return COMMON_UNITS; + case ALIAS_BINARY: return METRIC_UNITS; case ALIAS_METRIC: return METRIC_UNITS; case ALIAS_INTEGER: return INTEGER_UNITS; } @@ -114,6 +125,18 @@ function getNumberInUnit(n, offset, isBinary) { return getSafe(n); } +function getUnitAndIndex(mid, offset, units) { + let index = clamp(mid - offset, 0, units.length - 1); + let unit = units.charAt(index); + if (unit !== UNIT_MID) { + while (unit === UNIT_PLACEHOLDER && index >= 0 && index < units.length) { + index += index < mid ? -1 : 1; + unit = units.charAt(index); + } + } + return [unit, index]; +} + function getTruncated(n, precision) { if (!isNumber(precision) && n > -1 && n < 1) { // If the number is small and no precision diff --git a/test/number.js b/test/number.js index a10fc945c..82c88751e 100644 --- a/test/number.js +++ b/test/number.js @@ -2,14 +2,6 @@ namespace('Number', function() { - /* - TODO: what about these? - group('Options', function() { - equal(Sugar.Number.getOption('thousands'), ',', 'Thousands should be comma by default'); - equal(Sugar.Number.getOption('decimal'), '.', 'Decimal should be dot by default'); - }); - */ - method('random', function(random) { assertOneOf(random(), [0,1]); assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); @@ -436,65 +428,65 @@ namespace('Number', function() { assertEqual(abbr(-155555, -1), '-150k'); assertEqual(abbr(-155555, -2), '-100k'); - // Basic si - assertEqual(abbr(1, 0, 'basic') + 'm', '1m'); - assertEqual(abbr(10, 0, 'basic') + 'm', '10m'); - assertEqual(abbr(100, 0, 'basic') + 'm', '100m'); - assertEqual(abbr(1000, 0, 'basic') + 'm', '1km'); - assertEqual(abbr(10000, 0, 'basic') + 'm', '10km'); - assertEqual(abbr(10000000, 0, 'basic') + 'm', '10,000km'); - - assertEqual(abbr(9, 0, 'basic') + 'm', '9m'); - assertEqual(abbr(99, 0, 'basic') + 'm', '99m'); - assertEqual(abbr(999, 0, 'basic') + 'm', '999m'); - assertEqual(abbr(9999, 0, 'basic') + 'm', '9km'); - assertEqual(abbr(99999, 0, 'basic') + 'm', '99km'); - assertEqual(abbr(99999999, 0, 'basic') + 'm', '99,999km'); - - assertEqual(abbr(.1, 0, 'basic') + 'm', '100mm'); - assertEqual(abbr(.01, 0, 'basic') + 'm', '10mm'); - assertEqual(abbr(.001, 0, 'basic') + 'm', '1mm'); - assertEqual(abbr(.0001, 0, 'basic') + 'm', '100μm'); - assertEqual(abbr(.00001, 0, 'basic') + 'm', '10μm'); - assertEqual(abbr(.000001, 0, 'basic') + 'm', '1μm'); - assertEqual(abbr(.0000001, 0, 'basic') + 'm', '100nm'); - assertEqual(abbr(.00000001, 0, 'basic') + 'm', '10nm'); - assertEqual(abbr(.000000001, 0, 'basic') + 'm', '1nm'); - - assertEqual(abbr(.9, 0, 'basic') + 'm', '900mm'); - assertEqual(abbr(.09, 0, 'basic') + 'm', '90mm'); - assertEqual(abbr(.009, 0, 'basic') + 'm', '9mm'); - assertEqual(abbr(.0009, 0, 'basic') + 'm', '900μm'); - assertEqual(abbr(.00009, 0, 'basic') + 'm', '90μm'); - assertEqual(abbr(.000009, 0, 'basic') + 'm', '9μm'); - assertEqual(abbr(.0000009, 0, 'basic') + 'm', '900nm'); - assertEqual(abbr(.00000009, 0, 'basic') + 'm', '90nm'); - assertEqual(abbr(.000000009, 0, 'basic') + 'm', '9nm'); + // Common si + assertEqual(abbr(1, 0, 'common') + 'm', '1m'); + assertEqual(abbr(10, 0, 'common') + 'm', '10m'); + assertEqual(abbr(100, 0, 'common') + 'm', '100m'); + assertEqual(abbr(1000, 0, 'common') + 'm', '1km'); + assertEqual(abbr(10000, 0, 'common') + 'm', '10km'); + assertEqual(abbr(10000000, 0, 'common') + 'm', '10,000km'); + + assertEqual(abbr(9, 0, 'common') + 'm', '9m'); + assertEqual(abbr(99, 0, 'common') + 'm', '99m'); + assertEqual(abbr(999, 0, 'common') + 'm', '999m'); + assertEqual(abbr(9999, 0, 'common') + 'm', '9km'); + assertEqual(abbr(99999, 0, 'common') + 'm', '99km'); + assertEqual(abbr(99999999, 0, 'common') + 'm', '99,999km'); + + assertEqual(abbr(.1, 0, 'common') + 'm', '100mm'); + assertEqual(abbr(.01, 0, 'common') + 'm', '10mm'); + assertEqual(abbr(.001, 0, 'common') + 'm', '1mm'); + assertEqual(abbr(.0001, 0, 'common') + 'm', '100μm'); + assertEqual(abbr(.00001, 0, 'common') + 'm', '10μm'); + assertEqual(abbr(.000001, 0, 'common') + 'm', '1μm'); + assertEqual(abbr(.0000001, 0, 'common') + 'm', '100nm'); + assertEqual(abbr(.00000001, 0, 'common') + 'm', '10nm'); + assertEqual(abbr(.000000001, 0, 'common') + 'm', '1nm'); + + assertEqual(abbr(.9, 0, 'common') + 'm', '900mm'); + assertEqual(abbr(.09, 0, 'common') + 'm', '90mm'); + assertEqual(abbr(.009, 0, 'common') + 'm', '9mm'); + assertEqual(abbr(.0009, 0, 'common') + 'm', '900μm'); + assertEqual(abbr(.00009, 0, 'common') + 'm', '90μm'); + assertEqual(abbr(.000009, 0, 'common') + 'm', '9μm'); + assertEqual(abbr(.0000009, 0, 'common') + 'm', '900nm'); + assertEqual(abbr(.00000009, 0, 'common') + 'm', '90nm'); + assertEqual(abbr(.000000009, 0, 'common') + 'm', '9nm'); // Full si - assertEqual(abbr(1, 0, 'si'), '1'); - assertEqual(abbr(1000, 0, 'si'), '1k'); - assertEqual(abbr(1000000, 0, 'si'), '1M'); - assertEqual(abbr(1000000000, 0, 'si'), '1G'); - assertEqual(abbr(1000000000000, 0, 'si'), '1T'); - assertEqual(abbr(1000000000000000, 0, 'si'), '1P'); - assertEqual(abbr(1000000000000000000, 0, 'si'), '1E'); - assertEqual(abbr(1000000000000000000000, 0, 'si'), '1Z'); - assertEqual(abbr(1000000000000000000000000, 0, 'si'), '1Y'); - assertEqual(abbr(1000000000000000000000000000, 0, 'si'), '1,000Y'); - - assertEqual(abbr(.001, 0, 'si'), '1m'); - assertEqual(abbr(.000001, 0, 'si'), '1μ'); - assertEqual(abbr(.000000001, 0, 'si'), '1n'); - assertEqual(abbr(.000000000001, 0, 'si'), '1p'); - assertEqual(abbr(.000000000000001, 0, 'si'), '1f'); - assertEqual(abbr(.000000000000000001, 0, 'si'), '1a'); - assertEqual(abbr(.000000000000000000001, 0, 'si'), '1z'); - assertEqual(abbr(.000000000000000000000001, 0, 'si'), '1y'); - assertEqual(abbr(.000000000000000000000000001, 0, 'si'), '0'); - assertEqual(abbr(.000000000000000000000000001, null, 'si'), '0.001y'); - - // Binary + assertEqual(abbr(1, 0, 'metric'), '1'); + assertEqual(abbr(1000, 0, 'metric'), '1K'); + assertEqual(abbr(1000000, 0, 'metric'), '1M'); + assertEqual(abbr(1000000000, 0, 'metric'), '1G'); + assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); + assertEqual(abbr(1000000000000000000000000, 0, 'metric'), '1Y'); + assertEqual(abbr(1000000000000000000000000000, 0, 'metric'), '1,000Y'); + + assertEqual(abbr(.001, 0, 'metric'), '1m'); + assertEqual(abbr(.000001, 0, 'metric'), '1μ'); + assertEqual(abbr(.000000001, 0, 'metric'), '1n'); + assertEqual(abbr(.000000000001, 0, 'metric'), '1p'); + assertEqual(abbr(.000000000000001, 0, 'metric'), '1f'); + assertEqual(abbr(.000000000000000001, 0, 'metric'), '1a'); + assertEqual(abbr(.000000000000000000001, 0, 'metric'), '1z'); + assertEqual(abbr(.000000000000000000000001, 0, 'metric'), '1y'); + assertEqual(abbr(.000000000000000000000000001, 0, 'metric'), '0'); + assertEqual(abbr(.000000000000000000000000001, null, 'metric'), '0.001y'); + + // Binary (Base 2) assertEqual(abbr(1, 0, 'binary'), '1'); assertEqual(abbr(Math.pow(2, 10), 0, 'binary') + 'B', '1KB'); assertEqual(abbr(Math.pow(2, 20), 0, 'binary') + 'B', '1MB'); @@ -502,7 +494,7 @@ namespace('Number', function() { assertEqual(abbr(Math.pow(2, 40), 0, 'binary') + 'B', '1TB'); assertEqual(abbr(Math.pow(2, 50), 0, 'binary') + 'B', '1PB'); assertEqual(abbr(Math.pow(2, 60), 0, 'binary') + 'B', '1EB'); - assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1,024EB'); + assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1ZB'); assertEqual(abbr(Math.pow(2, 10) - Math.pow(2, 0), 0, 'binary') + 'B', '1,023B'); assertEqual(abbr(Math.pow(2, 20) - Math.pow(2, 10), 0, 'binary') + 'B', '1,023KB'); @@ -512,21 +504,26 @@ namespace('Number', function() { assertEqual(abbr(Math.pow(2, 60) - Math.pow(2, 50), 0, 'binary') + 'B', '1,023PB'); assertEqual(abbr(Math.pow(2, 70) - Math.pow(2, 60), 0, 'binary') + 'B', '1,023EB'); - // Memory - assertEqual(abbr(1, 0, 'memory'), '1'); - assertEqual(abbr(1000, 0, 'memory'), '1K'); - assertEqual(abbr(1000000, 0, 'memory'), '1M'); - assertEqual(abbr(1000000000, 0, 'memory'), '1G'); - assertEqual(abbr(1000000000000, 0, 'memory'), '1T'); - assertEqual(abbr(1000000000000000, 0, 'memory'), '1P'); - assertEqual(abbr(1000000000000000000, 0, 'memory'), '1E'); - assertEqual(abbr(1000000000000000000000, 0, 'memory'), '1,000E'); + // Memory (Base 10) + assertEqual(abbr(1, 0, 'metric'), '1'); + assertEqual(abbr(1000, 0, 'metric'), '1K'); + assertEqual(abbr(1000000, 0, 'metric'), '1M'); + assertEqual(abbr(1000000000, 0, 'metric'), '1G'); + assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); // Other assertEqual(abbr(1755, 2, 'integer'), '1.75k'); assertEqual(abbr(17555, 2, '|'), '17,555'); assertEqual(abbr(.17555, 2, '|'), '0.17'); assertEqual(abbr(.17555, null, '|'), '0.17555'); + assertEqual(abbr(17555, 0, 'x|y'), '17x'); + assertEqual(abbr(.17555, 0, 'x|y'), '175y'); + assertEqual(abbr(175000, null, 'm-|'), '0.175m'); + assertEqual(abbr(175000000, null, 'bm-|'), '175m'); + assertEqual(abbr(.175, 0, 'x|-μ'), '175,000μ'); // Errors assertError(function() { abbr(NaN); }); @@ -541,176 +538,4 @@ namespace('Number', function() { }); - /* - - - test(12334.5880, '12k', 'fractional | 0 places | 12334.5880'); - test(12334.5880, [3], '12.335k', 'fractional | 3 places | 12334.5880'); - test(.588500, [9], '588.5m', 'fractional | 9 places | .5885'); - test(.580085, [9], '580.085m', 'fractional | 9 places | .580085'); - test(.580085, [7], '580.085m', 'fractional | 7 places | .580085'); - test(.580085, [5], '580.085m', 'fractional | 5 places | .580085'); - test(.580085, [3], '580.085m', 'fractional | 3 places | .580085'); - test(.580085, [1], '580.1m', 'fractional | 1 places | .580085'); - test(12323.424558, [3, '|'], '12,323.425', 'limited and 3 decimals'); - - equal(run(1, 'metric', [0, '']) + 'm', '1m', 'no format uses short'); - equal(run(1000, 'metric', [0, '|']) + 'm', '1,000m', 'simple placeholder limits'); - - equal(run(1, 'metric', [0, 'm']) + 'm', '1,000mm', 'millimeter max'); - equal(run(1, 'metric', [0, 'μ_']) + 'm', '1,000,000μm', 'micrometer max'); - equal(run(1, 'metric', [0, 'n__']) + 'm', '1,000,000,000nm', 'nanometer max'); - equal(run(1, 'metric', [3, '_k']) + 'm', '0.001km', 'kilometer min'); - - equal(run(0.0000001, 'metric', [0, 'nμ_']) + 'm', '100nm', '100nm with micrometer max'); - equal(run(0.0001, 'metric', [0, 'nμ_']) + 'm', '100μm', '100μm with micrometer max'); - - equal(run(1000000, 'metric', [3, '_KG']) + 'W', '1GW', 'minimum can format higher'); - }); - - method('bytes', function() { - - test(1, '1B', 'default | 1B '); - test(10, '10B', 'default | 10B '); - test(100, '100B', 'default | 100B '); - test(1000, '1KB', 'default | 1KB '); - test(10000, '10KB', 'default | 10KB '); - test(100000, '100KB', 'default | 100KB'); - test(1000000, '1MB', 'default | 1MB '); - test(10000000, '10MB', 'default | 10MB '); - test(100000000, '100MB', 'default | 100MB'); - test(1000000000, '1GB', 'default | 1GB '); - test(10000000000, '10GB', 'default | 10GB '); - test(100000000000, '100GB', 'default | 100GB'); - test(1000000000000, '1TB', 'default | 1TB '); - test(10000000000000, '10TB', 'default | 10TB '); - test(100000000000000, '100TB', 'default | 100TB'); - test(1000000000000000, '1PB', 'default | 1PB '); - test(10000000000000000, '10PB', 'default | 10PB '); - test(100000000000000000, '100PB', 'default | 100PB'); - - withArgs([2], function() { - test(1, '1B', '2 places | 1B '); - test(10, '10B', '2 places | 10B '); - test(100, '100B', '2 places | 100B '); - test(1000, '1KB', '2 places | 1KB '); - test(10000, '10KB', '2 places | 10KB '); - test(100000, '100KB', '2 places | 100KB'); - test(1000000, '1MB', '2 places | 1MB '); - test(10000000, '10MB', '2 places | 10MB '); - test(100000000, '100MB', '2 places | 100MB'); - test(1000000000, '1GB', '2 places | 1GB '); - test(10000000000, '10GB', '2 places | 10GB '); - test(100000000000, '100GB', '2 places | 100GB'); - test(1000000000000, '1TB', '2 places | 1TB '); - test(10000000000000, '10TB', '2 places | 10TB '); - test(100000000000000, '100TB', '2 places | 100TB'); - test(1000000000000000, '1PB', '2 places | 1PB '); - test(10000000000000000, '10PB', '2 places | 10PB '); - test(100000000000000000, '100PB', '2 places | 100PB'); - }); - - withArgs([0, true], function() { - test(1, '1B', '0 places | base 2 | 1B '); - test(10, '10B', '0 places | base 2 | 10B '); - test(100, '100B', '0 places | base 2 | 100B '); - test(1000, '1KiB', '0 places | base 2 | 1KiB '); - test(10000, '10KiB', '0 places | base 2 | 10KiB '); - test(100000, '98KiB', '0 places | base 2 | 100KiB'); - test(1000000, '1MiB', '0 places | base 2 | 1MiB '); - test(10000000, '10MiB', '0 places | base 2 | 10MiB '); - test(100000000, '95MiB', '0 places | base 2 | 100MiB'); - test(1000000000, '1GiB', '0 places | base 2 | 1GiB '); - test(10000000000, '9GiB', '0 places | base 2 | 10GiB '); - test(100000000000, '93GiB', '0 places | base 2 | 100GiB'); - test(1000000000000, '1TiB', '0 places | base 2 | 1TiB '); - test(10000000000000, '9TiB', '0 places | base 2 | 10TiB '); - test(100000000000000, '91TiB', '0 places | base 2 | 100TiB'); - test(1000000000000000, '1PiB', '0 places | base 2 | 1PiB '); - test(10000000000000000, '9PiB', '0 places | base 2 | 10PiB '); - test(100000000000000000, '89PiB', '0 places | base 2 | 100PiB'); - }); - - withArgs([2, true], function() { - - test(1, '1B', '2 places | base 2 | 1B '); - test(10, '10B', '2 places | base 2 | 10B '); - test(100, '100B', '2 places | base 2 | 100B '); - test(1000, '0.98KiB', '2 places | base 2 | 1KB '); - test(10000, '9.77KiB', '2 places | base 2 | 10KB '); - test(100000, '97.66KiB', '2 places | base 2 | 100KB'); - test(1000000, '0.95MiB', '2 places | base 2 | 1MB '); - test(10000000, '9.54MiB', '2 places | base 2 | 10MB '); - test(100000000, '95.37MiB', '2 places | base 2 | 100MB'); - test(1000000000, '0.93GiB', '2 places | base 2 | 1GB '); - test(10000000000, '9.31GiB', '2 places | base 2 | 10GB '); - test(100000000000, '93.13GiB', '2 places | base 2 | 100GB'); - test(1000000000000, '0.91TiB', '2 places | base 2 | 1TB '); - test(10000000000000, '9.09TiB', '2 places | base 2 | 10TB '); - test(100000000000000, '90.95TiB', '2 places | base 2 | 100TB'); - test(1000000000000000, '0.89PiB', '2 places | base 2 | 1PB '); - test(10000000000000000, '8.88PiB', '2 places | base 2 | 10PB '); - test(100000000000000000, '88.82PiB', '2 places | base 2 | 100PB'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(1000, '0,98KiB', 'should respect global decimal'); - Sugar.Number.setOption('decimal', null); - - }); - - withArgs([0, true, 'si'], function() { - test(1, '1B', 'base 2 with si units | 1B '); - test(10, '10B', 'base 2 with si units | 10B '); - test(100, '100B', 'base 2 with si units | 100B '); - test(1000, '1KB', 'base 2 with si units | 1KB '); - test(10000, '10KB', 'base 2 with si units | 10KB '); - test(100000, '98KB', 'base 2 with si units | 100KB'); - test(1000000, '1MB', 'base 2 with si units | 1MB '); - test(10000000, '10MB', 'base 2 with si units | 10MB '); - test(100000000, '95MB', 'base 2 with si units | 100MB'); - test(1000000000, '1GB', 'base 2 with si units | 1GB '); - test(10000000000, '9GB', 'base 2 with si units | 10GB '); - test(100000000000, '93GB', 'base 2 with si units | 100GB'); - test(1000000000000, '1TB', 'base 2 with si units | 1TB '); - test(10000000000000, '9TB', 'base 2 with si units | 10TB '); - test(100000000000000, '91TB', 'base 2 with si units | 100TB'); - test(1000000000000000, '1PB', 'base 2 with si units | 1PB '); - test(10000000000000000, '9PB', 'base 2 with si units | 10PB '); - test(100000000000000000, '89PB', 'base 2 with si units | 100PB'); - }); - - withArgs([0, false, 'binary'], function() { - - test(1, '1B', 'base 10 with binary units | 1B '); - test(10, '10B', 'base 10 with binary units | 10B '); - test(100, '100B', 'base 10 with binary units | 100B '); - test(1000, '1KiB', 'base 10 with binary units | 1KiB '); - test(10000, '10KiB', 'base 10 with binary units | 10KiB '); - test(100000, '100KiB', 'base 10 with binary units | 100KiB'); - test(1000000, '1MiB', 'base 10 with binary units | 1MiB '); - test(10000000, '10MiB', 'base 10 with binary units | 10MiB '); - test(100000000, '100MiB', 'base 10 with binary units | 100MiB'); - test(1000000000, '1GiB', 'base 10 with binary units | 1GiB '); - test(10000000000, '10GiB', 'base 10 with binary units | 10GiB '); - test(100000000000, '100GiB', 'base 10 with binary units | 100GiB'); - test(1000000000000, '1TiB', 'base 10 with binary units | 1TiB '); - test(10000000000000, '10TiB', 'base 10 with binary units | 10TiB '); - test(100000000000000, '100TiB', 'base 10 with binary units | 100TiB'); - test(1000000000000000, '1PiB', 'base 10 with binary units | 1PiB '); - test(10000000000000000, '10PiB', 'base 10 with binary units | 10PiB '); - test(100000000000000000, '100PiB', 'base 10 with binary units | 100PiB'); - - }); - - test(1024, [0, true], '1KiB', '1024 bytes is 1KiB'); - test(1048576, [0, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); - test(1024, [2, true], '1KiB', '2 places | 1024 bytes is 1KiB'); - test(1048576, [2, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); - - test(Math.pow(10, 16), [0, true], '9PiB', '10 ^ 16 bytes'); - test(Math.pow(10, 16), [-2, true], '0PiB', '10 ^ 16 bytes | -2 places'); - }); - */ - }); From 3efa0d377ce5086bb4b0cbb12578bf665739834f Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 22 Dec 2018 20:50:18 +0900 Subject: [PATCH 011/191] Added modules tests for plugin and other refactor. --- src/core/index.js | 43 +- src/{number/namespace.js => core/number.js} | 0 src/core/{ => util}/NamespaceStore.js | 0 src/core/{ => util}/SugarChainableBase.js | 0 src/core/{extendUtils.js => util/extend.js} | 2 +- src/core/{ => util}/globalContext.js | 0 src/core/{utils.js => util/helpers.js} | 0 src/number/abbr.js | 8 +- src/number/abs.js | 4 +- src/number/ceil.js | 2 +- src/number/exp.js | 4 +- src/number/floor.js | 2 +- src/number/format.js | 6 +- src/number/index.js | 2 +- src/number/isEven.js | 4 +- src/number/isFinite.js | 4 +- src/number/isInteger.js | 4 +- src/number/isMultipleOf.js | 7 +- src/number/isNaN.js | 4 +- src/number/isOdd.js | 4 +- src/number/isSafeInteger.js | 4 +- src/number/log.js | 4 +- src/number/pad.js | 4 +- src/number/pow.js | 4 +- src/number/random.js | 4 +- src/number/round.js | 2 +- src/number/sqrt.js | 4 +- src/number/times.js | 4 +- src/number/toChar.js | 4 +- src/number/toHex.js | 4 +- src/number/toOrdinal.js | 4 +- src/number/trunc.js | 2 +- .../util/{formatNumber.js => format.js} | 2 +- src/number/util/isMultipleOf.js | 2 +- src/number/util/pad.js | 2 +- src/util/toOrdinal.js | 2 +- src/util/typeChecks.js | 4 + .../{ => OLD}/browser/chained/dev/custom.html | 0 test/{ => OLD}/browser/chained/dev/dist.html | 0 .../browser/chained/dev/sugar-array.html | 0 .../browser/chained/dev/sugar-date.html | 0 .../browser/chained/dev/sugar-enumerable.html | 0 .../browser/chained/dev/sugar-es5.html | 0 .../browser/chained/dev/sugar-es6.html | 0 .../browser/chained/dev/sugar-function.html | 0 .../chained/dev/sugar-inflections.html | 0 .../browser/chained/dev/sugar-language.html | 0 .../browser/chained/dev/sugar-number.html | 0 .../browser/chained/dev/sugar-object.html | 0 .../browser/chained/dev/sugar-range.html | 0 .../browser/chained/dev/sugar-regexp.html | 0 .../browser/chained/dev/sugar-string.html | 0 test/{ => OLD}/browser/chained/dev/sugar.html | 0 test/{ => OLD}/browser/chained/index.html | 0 .../{ => OLD}/browser/chained/min/custom.html | 0 test/{ => OLD}/browser/chained/min/dist.html | 0 .../browser/chained/min/sugar-array.html | 0 .../browser/chained/min/sugar-date.html | 0 .../browser/chained/min/sugar-enumerable.html | 0 .../browser/chained/min/sugar-es5.html | 0 .../browser/chained/min/sugar-es6.html | 0 .../browser/chained/min/sugar-function.html | 0 .../chained/min/sugar-inflections.html | 0 .../browser/chained/min/sugar-language.html | 0 .../browser/chained/min/sugar-number.html | 0 .../browser/chained/min/sugar-object.html | 0 .../browser/chained/min/sugar-range.html | 0 .../browser/chained/min/sugar-regexp.html | 0 .../browser/chained/min/sugar-string.html | 0 test/{ => OLD}/browser/chained/min/sugar.html | 0 test/{ => OLD}/browser/chained/src.html | 0 test/{ => OLD}/browser/chained/src/array.html | 0 test/{ => OLD}/browser/chained/src/date.html | 0 .../browser/chained/src/default.html | 0 .../browser/chained/src/enumerable.html | 0 test/{ => OLD}/browser/chained/src/full.html | 0 .../browser/chained/src/function.html | 0 .../browser/chained/src/inflections.html | 0 .../browser/chained/src/language.html | 0 .../{ => OLD}/browser/chained/src/number.html | 0 .../{ => OLD}/browser/chained/src/object.html | 0 test/{ => OLD}/browser/chained/src/range.html | 0 .../{ => OLD}/browser/chained/src/regexp.html | 0 .../{ => OLD}/browser/chained/src/string.html | 0 test/{ => OLD}/browser/custom.html | 0 test/{ => OLD}/browser/default/core.html | 0 .../{ => OLD}/browser/default/dev/custom.html | 0 test/{ => OLD}/browser/default/dev/dist.html | 0 .../browser/default/dev/sugar-array.html | 0 .../browser/default/dev/sugar-core.html | 0 .../browser/default/dev/sugar-date.html | 0 .../browser/default/dev/sugar-enumerable.html | 0 .../browser/default/dev/sugar-es5.html | 0 .../browser/default/dev/sugar-es6.html | 0 .../browser/default/dev/sugar-function.html | 0 .../default/dev/sugar-inflections.html | 0 .../browser/default/dev/sugar-language.html | 0 .../browser/default/dev/sugar-number.html | 0 .../browser/default/dev/sugar-object.html | 0 .../browser/default/dev/sugar-range.html | 0 .../browser/default/dev/sugar-regexp.html | 0 .../browser/default/dev/sugar-string.html | 0 test/{ => OLD}/browser/default/dev/sugar.html | 0 test/{ => OLD}/browser/default/index.html | 0 .../{ => OLD}/browser/default/min/custom.html | 0 test/{ => OLD}/browser/default/min/dist.html | 0 .../browser/default/min/sugar-array.html | 0 .../browser/default/min/sugar-core.html | 0 .../browser/default/min/sugar-date.html | 0 .../browser/default/min/sugar-enumerable.html | 0 .../browser/default/min/sugar-es5.html | 0 .../browser/default/min/sugar-es6.html | 0 .../browser/default/min/sugar-function.html | 0 .../default/min/sugar-inflections.html | 0 .../browser/default/min/sugar-language.html | 0 .../browser/default/min/sugar-number.html | 0 .../browser/default/min/sugar-object.html | 0 .../browser/default/min/sugar-range.html | 0 .../browser/default/min/sugar-regexp.html | 0 .../browser/default/min/sugar-string.html | 0 test/{ => OLD}/browser/default/min/sugar.html | 0 test/{ => OLD}/browser/default/src.html | 0 test/{ => OLD}/browser/default/src/array.html | 0 test/{ => OLD}/browser/default/src/core.html | 0 test/{ => OLD}/browser/default/src/date.html | 0 .../browser/default/src/default.html | 0 .../browser/default/src/enumerable.html | 0 test/{ => OLD}/browser/default/src/es.html | 0 test/{ => OLD}/browser/default/src/es5.html | 0 test/{ => OLD}/browser/default/src/full.html | 0 .../browser/default/src/function.html | 0 .../browser/default/src/inflections.html | 0 .../browser/default/src/language.html | 0 .../{ => OLD}/browser/default/src/number.html | 0 .../{ => OLD}/browser/default/src/object.html | 0 test/{ => OLD}/browser/default/src/range.html | 0 .../{ => OLD}/browser/default/src/regexp.html | 0 .../{ => OLD}/browser/default/src/string.html | 0 test/{ => OLD}/browser/dist.html | 0 .../browser/extended/dev/custom.html | 0 test/{ => OLD}/browser/extended/dev/dist.html | 0 .../browser/extended/dev/sugar-array.html | 0 .../browser/extended/dev/sugar-date.html | 0 .../extended/dev/sugar-enumerable.html | 0 .../browser/extended/dev/sugar-es5.html | 0 .../browser/extended/dev/sugar-es6.html | 0 .../browser/extended/dev/sugar-function.html | 0 .../extended/dev/sugar-inflections.html | 0 .../browser/extended/dev/sugar-language.html | 0 .../browser/extended/dev/sugar-number.html | 0 .../browser/extended/dev/sugar-object.html | 0 .../browser/extended/dev/sugar-range.html | 0 .../browser/extended/dev/sugar-regexp.html | 0 .../browser/extended/dev/sugar-string.html | 0 .../{ => OLD}/browser/extended/dev/sugar.html | 0 test/{ => OLD}/browser/extended/index.html | 0 .../browser/extended/min/custom.html | 0 test/{ => OLD}/browser/extended/min/dist.html | 0 .../browser/extended/min/sugar-array.html | 0 .../browser/extended/min/sugar-date.html | 0 .../extended/min/sugar-enumerable.html | 0 .../browser/extended/min/sugar-es5.html | 0 .../browser/extended/min/sugar-es6.html | 0 .../browser/extended/min/sugar-function.html | 0 .../extended/min/sugar-inflections.html | 0 .../browser/extended/min/sugar-language.html | 0 .../browser/extended/min/sugar-number.html | 0 .../browser/extended/min/sugar-object.html | 0 .../browser/extended/min/sugar-range.html | 0 .../browser/extended/min/sugar-regexp.html | 0 .../browser/extended/min/sugar-string.html | 0 .../{ => OLD}/browser/extended/min/sugar.html | 0 test/{ => OLD}/browser/extended/src.html | 0 .../{ => OLD}/browser/extended/src/array.html | 0 test/{ => OLD}/browser/extended/src/date.html | 0 .../browser/extended/src/default.html | 0 .../browser/extended/src/enumerable.html | 0 test/{ => OLD}/browser/extended/src/full.html | 0 .../browser/extended/src/function.html | 0 .../browser/extended/src/inflections.html | 0 .../browser/extended/src/language.html | 0 .../browser/extended/src/number.html | 0 .../browser/extended/src/object.html | 0 .../{ => OLD}/browser/extended/src/range.html | 0 .../browser/extended/src/regexp.html | 0 .../browser/extended/src/string.html | 0 test/{ => OLD}/browser/index.html | 0 .../browser/javascripts/benchmark.js | 0 .../browser/javascripts/jquery-1.7.1.js | 0 .../browser/javascripts/runner-chained.js | 0 .../browser/javascripts/runner-extended.js | 0 test/{ => OLD}/browser/javascripts/runner.js | 0 .../{ => OLD}/browser/javascripts/suite-ui.js | 0 test/{ => OLD}/browser/javascripts/tooltip.js | 0 .../{ => OLD}/browser/performance/fixtures.js | 0 test/{ => OLD}/browser/performance/index.html | 0 test/{ => OLD}/browser/performance/tests.js | 0 test/{ => OLD}/browser/src.html | 0 test/{ => OLD}/browser/stylesheets/custom.css | 0 .../{ => OLD}/browser/stylesheets/tooltip.css | 0 test/{ => OLD}/browser/sugar.html | 0 test/{ => OLD}/node/all.js | 0 test/{ => OLD}/node/chained/dist.js | 0 test/{ => OLD}/node/chained/sugar-array.js | 0 test/{ => OLD}/node/chained/sugar-date.js | 0 .../node/chained/sugar-enumerable.js | 0 test/{ => OLD}/node/chained/sugar-function.js | 0 .../node/chained/sugar-inflections.js | 0 test/{ => OLD}/node/chained/sugar-language.js | 0 test/{ => OLD}/node/chained/sugar-number.js | 0 test/{ => OLD}/node/chained/sugar-object.js | 0 test/{ => OLD}/node/chained/sugar-range.js | 0 test/{ => OLD}/node/chained/sugar-regexp.js | 0 test/{ => OLD}/node/chained/sugar-string.js | 0 test/{ => OLD}/node/chained/sugar.js | 0 test/{ => OLD}/node/default/dist.js | 0 test/{ => OLD}/node/default/sugar-array.js | 0 test/{ => OLD}/node/default/sugar-core.js | 0 test/{ => OLD}/node/default/sugar-date.js | 0 .../node/default/sugar-enumerable.js | 0 test/{ => OLD}/node/default/sugar-es5.js | 0 test/{ => OLD}/node/default/sugar-es6.js | 0 test/{ => OLD}/node/default/sugar-function.js | 0 .../node/default/sugar-inflections.js | 0 test/{ => OLD}/node/default/sugar-language.js | 0 test/{ => OLD}/node/default/sugar-number.js | 0 test/{ => OLD}/node/default/sugar-object.js | 0 test/{ => OLD}/node/default/sugar-range.js | 0 test/{ => OLD}/node/default/sugar-regexp.js | 0 test/{ => OLD}/node/default/sugar-string.js | 0 test/{ => OLD}/node/default/sugar.js | 0 test/{ => OLD}/node/extended/dist.js | 0 test/{ => OLD}/node/extended/sugar-array.js | 0 test/{ => OLD}/node/extended/sugar-date.js | 0 .../node/extended/sugar-enumerable.js | 0 .../{ => OLD}/node/extended/sugar-function.js | 0 .../node/extended/sugar-inflections.js | 0 .../{ => OLD}/node/extended/sugar-language.js | 0 test/{ => OLD}/node/extended/sugar-number.js | 0 test/{ => OLD}/node/extended/sugar-object.js | 0 test/{ => OLD}/node/extended/sugar-range.js | 0 test/{ => OLD}/node/extended/sugar-regexp.js | 0 test/{ => OLD}/node/extended/sugar-string.js | 0 test/{ => OLD}/node/extended/sugar.js | 0 test/{ => OLD}/node/index.js | 0 test/{ => OLD}/node/npm.js | 0 test/{ => OLD}/node/setup.js | 0 test/{ => OLD}/node/sugar.js | 0 test/{ => OLD}/rhino/sugar.js | 0 test/{ => OLD}/suite/helpers/array.js | 0 test/{ => OLD}/suite/helpers/common.js | 0 test/{ => OLD}/suite/helpers/core.js | 0 test/{ => OLD}/suite/helpers/date.js | 0 test/{ => OLD}/suite/helpers/object.js | 0 test/{ => OLD}/suite/log.js | 0 test/{ => OLD}/suite/overrides.js | 0 test/{ => OLD}/suite/resets/b64.js | 0 test/{ => OLD}/suite/resets/es5.js | 0 test/{ => OLD}/suite/resets/es6.js | 0 test/{ => OLD}/suite/resets/es7.js | 0 test/{ => OLD}/suite/suite.js | 0 test/{ => OLD}/tests/array.js | 0 test/OLD/tests/core.js | 3 + test/{ => OLD}/tests/date.js | 0 test/{ => OLD}/tests/dom.js | 0 test/{ => OLD}/tests/enumerable.js | 0 test/{ => OLD}/tests/equals.js | 0 test/{ => OLD}/tests/es5/array.js | 0 test/{ => OLD}/tests/es5/date.js | 0 test/{ => OLD}/tests/es5/function.js | 0 test/{ => OLD}/tests/es5/object.js | 0 test/{ => OLD}/tests/es5/string.js | 0 test/{ => OLD}/tests/es6/array.js | 0 test/{ => OLD}/tests/es6/number.js | 0 test/{ => OLD}/tests/es6/string.js | 0 test/{ => OLD}/tests/es7/array.js | 0 test/{ => OLD}/tests/function.js | 0 test/{ => OLD}/tests/inflections.js | 0 test/{ => OLD}/tests/language.js | 0 test/{ => OLD}/tests/locales/ca.js | 0 test/{ => OLD}/tests/locales/da.js | 0 test/{ => OLD}/tests/locales/de.js | 0 test/{ => OLD}/tests/locales/es.js | 0 test/{ => OLD}/tests/locales/fi.js | 0 test/{ => OLD}/tests/locales/fr.js | 0 test/{ => OLD}/tests/locales/it.js | 0 test/{ => OLD}/tests/locales/ja.js | 0 test/{ => OLD}/tests/locales/ko.js | 0 test/{ => OLD}/tests/locales/nl.js | 0 test/{ => OLD}/tests/locales/no.js | 0 test/{ => OLD}/tests/locales/pl.js | 0 test/{ => OLD}/tests/locales/pt.js | 0 test/{ => OLD}/tests/locales/ru.js | 0 test/{ => OLD}/tests/locales/sv.js | 0 test/{ => OLD}/tests/locales/zh-CN.js | 0 test/{ => OLD}/tests/locales/zh-TW.js | 0 test/OLD/tests/number.js | 1093 ++++++++++++ test/{ => OLD}/tests/object.js | 0 test/{ => OLD}/tests/range/date.js | 0 test/{ => OLD}/tests/range/number.js | 0 test/{ => OLD}/tests/range/string.js | 0 test/{ => OLD}/tests/regexp.js | 0 test/{ => OLD}/tests/string.js | 0 test/core.js | 99 -- test/helpers/node.js | 8 + test/index.html | 8 +- test/index.js | 13 +- test/modules.js | 20 - test/number.js | 541 ------ test/plugins/math-operators/add/define.js | 3 + test/plugins/math-operators/add/index.js | 3 + test/plugins/math-operators/index.js | 11 + test/plugins/math-operators/mult/define.js | 3 + test/plugins/math-operators/mult/index.js | 3 + test/{ => tests}/chainable.js | 0 test/tests/core.js | 118 +- test/{ => tests}/extended.js | 0 test/tests/modules/plugin-method-define.js | 22 + test/tests/modules/plugin-method.js | 14 + test/tests/modules/plugin.js | 26 + test/tests/modules/sugar.js | 14 + test/tests/number.js | 1464 +++++------------ 322 files changed, 1872 insertions(+), 1750 deletions(-) rename src/{number/namespace.js => core/number.js} (100%) rename src/core/{ => util}/NamespaceStore.js (100%) rename src/core/{ => util}/SugarChainableBase.js (100%) rename src/core/{extendUtils.js => util/extend.js} (96%) rename src/core/{ => util}/globalContext.js (100%) rename src/core/{utils.js => util/helpers.js} (100%) rename src/number/util/{formatNumber.js => format.js} (78%) rename test/{ => OLD}/browser/chained/dev/custom.html (100%) rename test/{ => OLD}/browser/chained/dev/dist.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-array.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-date.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-enumerable.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-es5.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-es6.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-function.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-inflections.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-language.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-number.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-object.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-range.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-regexp.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar-string.html (100%) rename test/{ => OLD}/browser/chained/dev/sugar.html (100%) rename test/{ => OLD}/browser/chained/index.html (100%) rename test/{ => OLD}/browser/chained/min/custom.html (100%) rename test/{ => OLD}/browser/chained/min/dist.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-array.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-date.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-enumerable.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-es5.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-es6.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-function.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-inflections.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-language.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-number.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-object.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-range.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-regexp.html (100%) rename test/{ => OLD}/browser/chained/min/sugar-string.html (100%) rename test/{ => OLD}/browser/chained/min/sugar.html (100%) rename test/{ => OLD}/browser/chained/src.html (100%) rename test/{ => OLD}/browser/chained/src/array.html (100%) rename test/{ => OLD}/browser/chained/src/date.html (100%) rename test/{ => OLD}/browser/chained/src/default.html (100%) rename test/{ => OLD}/browser/chained/src/enumerable.html (100%) rename test/{ => OLD}/browser/chained/src/full.html (100%) rename test/{ => OLD}/browser/chained/src/function.html (100%) rename test/{ => OLD}/browser/chained/src/inflections.html (100%) rename test/{ => OLD}/browser/chained/src/language.html (100%) rename test/{ => OLD}/browser/chained/src/number.html (100%) rename test/{ => OLD}/browser/chained/src/object.html (100%) rename test/{ => OLD}/browser/chained/src/range.html (100%) rename test/{ => OLD}/browser/chained/src/regexp.html (100%) rename test/{ => OLD}/browser/chained/src/string.html (100%) rename test/{ => OLD}/browser/custom.html (100%) rename test/{ => OLD}/browser/default/core.html (100%) rename test/{ => OLD}/browser/default/dev/custom.html (100%) rename test/{ => OLD}/browser/default/dev/dist.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-array.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-core.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-date.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-enumerable.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-es5.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-es6.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-function.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-inflections.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-language.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-number.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-object.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-range.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-regexp.html (100%) rename test/{ => OLD}/browser/default/dev/sugar-string.html (100%) rename test/{ => OLD}/browser/default/dev/sugar.html (100%) rename test/{ => OLD}/browser/default/index.html (100%) rename test/{ => OLD}/browser/default/min/custom.html (100%) rename test/{ => OLD}/browser/default/min/dist.html (100%) rename test/{ => OLD}/browser/default/min/sugar-array.html (100%) rename test/{ => OLD}/browser/default/min/sugar-core.html (100%) rename test/{ => OLD}/browser/default/min/sugar-date.html (100%) rename test/{ => OLD}/browser/default/min/sugar-enumerable.html (100%) rename test/{ => OLD}/browser/default/min/sugar-es5.html (100%) rename test/{ => OLD}/browser/default/min/sugar-es6.html (100%) rename test/{ => OLD}/browser/default/min/sugar-function.html (100%) rename test/{ => OLD}/browser/default/min/sugar-inflections.html (100%) rename test/{ => OLD}/browser/default/min/sugar-language.html (100%) rename test/{ => OLD}/browser/default/min/sugar-number.html (100%) rename test/{ => OLD}/browser/default/min/sugar-object.html (100%) rename test/{ => OLD}/browser/default/min/sugar-range.html (100%) rename test/{ => OLD}/browser/default/min/sugar-regexp.html (100%) rename test/{ => OLD}/browser/default/min/sugar-string.html (100%) rename test/{ => OLD}/browser/default/min/sugar.html (100%) rename test/{ => OLD}/browser/default/src.html (100%) rename test/{ => OLD}/browser/default/src/array.html (100%) rename test/{ => OLD}/browser/default/src/core.html (100%) rename test/{ => OLD}/browser/default/src/date.html (100%) rename test/{ => OLD}/browser/default/src/default.html (100%) rename test/{ => OLD}/browser/default/src/enumerable.html (100%) rename test/{ => OLD}/browser/default/src/es.html (100%) rename test/{ => OLD}/browser/default/src/es5.html (100%) rename test/{ => OLD}/browser/default/src/full.html (100%) rename test/{ => OLD}/browser/default/src/function.html (100%) rename test/{ => OLD}/browser/default/src/inflections.html (100%) rename test/{ => OLD}/browser/default/src/language.html (100%) rename test/{ => OLD}/browser/default/src/number.html (100%) rename test/{ => OLD}/browser/default/src/object.html (100%) rename test/{ => OLD}/browser/default/src/range.html (100%) rename test/{ => OLD}/browser/default/src/regexp.html (100%) rename test/{ => OLD}/browser/default/src/string.html (100%) rename test/{ => OLD}/browser/dist.html (100%) rename test/{ => OLD}/browser/extended/dev/custom.html (100%) rename test/{ => OLD}/browser/extended/dev/dist.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-array.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-date.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-enumerable.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-es5.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-es6.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-function.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-inflections.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-language.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-number.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-object.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-range.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-regexp.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar-string.html (100%) rename test/{ => OLD}/browser/extended/dev/sugar.html (100%) rename test/{ => OLD}/browser/extended/index.html (100%) rename test/{ => OLD}/browser/extended/min/custom.html (100%) rename test/{ => OLD}/browser/extended/min/dist.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-array.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-date.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-enumerable.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-es5.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-es6.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-function.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-inflections.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-language.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-number.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-object.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-range.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-regexp.html (100%) rename test/{ => OLD}/browser/extended/min/sugar-string.html (100%) rename test/{ => OLD}/browser/extended/min/sugar.html (100%) rename test/{ => OLD}/browser/extended/src.html (100%) rename test/{ => OLD}/browser/extended/src/array.html (100%) rename test/{ => OLD}/browser/extended/src/date.html (100%) rename test/{ => OLD}/browser/extended/src/default.html (100%) rename test/{ => OLD}/browser/extended/src/enumerable.html (100%) rename test/{ => OLD}/browser/extended/src/full.html (100%) rename test/{ => OLD}/browser/extended/src/function.html (100%) rename test/{ => OLD}/browser/extended/src/inflections.html (100%) rename test/{ => OLD}/browser/extended/src/language.html (100%) rename test/{ => OLD}/browser/extended/src/number.html (100%) rename test/{ => OLD}/browser/extended/src/object.html (100%) rename test/{ => OLD}/browser/extended/src/range.html (100%) rename test/{ => OLD}/browser/extended/src/regexp.html (100%) rename test/{ => OLD}/browser/extended/src/string.html (100%) rename test/{ => OLD}/browser/index.html (100%) rename test/{ => OLD}/browser/javascripts/benchmark.js (100%) rename test/{ => OLD}/browser/javascripts/jquery-1.7.1.js (100%) rename test/{ => OLD}/browser/javascripts/runner-chained.js (100%) rename test/{ => OLD}/browser/javascripts/runner-extended.js (100%) rename test/{ => OLD}/browser/javascripts/runner.js (100%) rename test/{ => OLD}/browser/javascripts/suite-ui.js (100%) rename test/{ => OLD}/browser/javascripts/tooltip.js (100%) rename test/{ => OLD}/browser/performance/fixtures.js (100%) rename test/{ => OLD}/browser/performance/index.html (100%) rename test/{ => OLD}/browser/performance/tests.js (100%) rename test/{ => OLD}/browser/src.html (100%) rename test/{ => OLD}/browser/stylesheets/custom.css (100%) rename test/{ => OLD}/browser/stylesheets/tooltip.css (100%) rename test/{ => OLD}/browser/sugar.html (100%) rename test/{ => OLD}/node/all.js (100%) rename test/{ => OLD}/node/chained/dist.js (100%) rename test/{ => OLD}/node/chained/sugar-array.js (100%) rename test/{ => OLD}/node/chained/sugar-date.js (100%) rename test/{ => OLD}/node/chained/sugar-enumerable.js (100%) rename test/{ => OLD}/node/chained/sugar-function.js (100%) rename test/{ => OLD}/node/chained/sugar-inflections.js (100%) rename test/{ => OLD}/node/chained/sugar-language.js (100%) rename test/{ => OLD}/node/chained/sugar-number.js (100%) rename test/{ => OLD}/node/chained/sugar-object.js (100%) rename test/{ => OLD}/node/chained/sugar-range.js (100%) rename test/{ => OLD}/node/chained/sugar-regexp.js (100%) rename test/{ => OLD}/node/chained/sugar-string.js (100%) rename test/{ => OLD}/node/chained/sugar.js (100%) rename test/{ => OLD}/node/default/dist.js (100%) rename test/{ => OLD}/node/default/sugar-array.js (100%) rename test/{ => OLD}/node/default/sugar-core.js (100%) rename test/{ => OLD}/node/default/sugar-date.js (100%) rename test/{ => OLD}/node/default/sugar-enumerable.js (100%) rename test/{ => OLD}/node/default/sugar-es5.js (100%) rename test/{ => OLD}/node/default/sugar-es6.js (100%) rename test/{ => OLD}/node/default/sugar-function.js (100%) rename test/{ => OLD}/node/default/sugar-inflections.js (100%) rename test/{ => OLD}/node/default/sugar-language.js (100%) rename test/{ => OLD}/node/default/sugar-number.js (100%) rename test/{ => OLD}/node/default/sugar-object.js (100%) rename test/{ => OLD}/node/default/sugar-range.js (100%) rename test/{ => OLD}/node/default/sugar-regexp.js (100%) rename test/{ => OLD}/node/default/sugar-string.js (100%) rename test/{ => OLD}/node/default/sugar.js (100%) rename test/{ => OLD}/node/extended/dist.js (100%) rename test/{ => OLD}/node/extended/sugar-array.js (100%) rename test/{ => OLD}/node/extended/sugar-date.js (100%) rename test/{ => OLD}/node/extended/sugar-enumerable.js (100%) rename test/{ => OLD}/node/extended/sugar-function.js (100%) rename test/{ => OLD}/node/extended/sugar-inflections.js (100%) rename test/{ => OLD}/node/extended/sugar-language.js (100%) rename test/{ => OLD}/node/extended/sugar-number.js (100%) rename test/{ => OLD}/node/extended/sugar-object.js (100%) rename test/{ => OLD}/node/extended/sugar-range.js (100%) rename test/{ => OLD}/node/extended/sugar-regexp.js (100%) rename test/{ => OLD}/node/extended/sugar-string.js (100%) rename test/{ => OLD}/node/extended/sugar.js (100%) rename test/{ => OLD}/node/index.js (100%) rename test/{ => OLD}/node/npm.js (100%) rename test/{ => OLD}/node/setup.js (100%) rename test/{ => OLD}/node/sugar.js (100%) rename test/{ => OLD}/rhino/sugar.js (100%) rename test/{ => OLD}/suite/helpers/array.js (100%) rename test/{ => OLD}/suite/helpers/common.js (100%) rename test/{ => OLD}/suite/helpers/core.js (100%) rename test/{ => OLD}/suite/helpers/date.js (100%) rename test/{ => OLD}/suite/helpers/object.js (100%) rename test/{ => OLD}/suite/log.js (100%) rename test/{ => OLD}/suite/overrides.js (100%) rename test/{ => OLD}/suite/resets/b64.js (100%) rename test/{ => OLD}/suite/resets/es5.js (100%) rename test/{ => OLD}/suite/resets/es6.js (100%) rename test/{ => OLD}/suite/resets/es7.js (100%) rename test/{ => OLD}/suite/suite.js (100%) rename test/{ => OLD}/tests/array.js (100%) create mode 100644 test/OLD/tests/core.js rename test/{ => OLD}/tests/date.js (100%) rename test/{ => OLD}/tests/dom.js (100%) rename test/{ => OLD}/tests/enumerable.js (100%) rename test/{ => OLD}/tests/equals.js (100%) rename test/{ => OLD}/tests/es5/array.js (100%) rename test/{ => OLD}/tests/es5/date.js (100%) rename test/{ => OLD}/tests/es5/function.js (100%) rename test/{ => OLD}/tests/es5/object.js (100%) rename test/{ => OLD}/tests/es5/string.js (100%) rename test/{ => OLD}/tests/es6/array.js (100%) rename test/{ => OLD}/tests/es6/number.js (100%) rename test/{ => OLD}/tests/es6/string.js (100%) rename test/{ => OLD}/tests/es7/array.js (100%) rename test/{ => OLD}/tests/function.js (100%) rename test/{ => OLD}/tests/inflections.js (100%) rename test/{ => OLD}/tests/language.js (100%) rename test/{ => OLD}/tests/locales/ca.js (100%) rename test/{ => OLD}/tests/locales/da.js (100%) rename test/{ => OLD}/tests/locales/de.js (100%) rename test/{ => OLD}/tests/locales/es.js (100%) rename test/{ => OLD}/tests/locales/fi.js (100%) rename test/{ => OLD}/tests/locales/fr.js (100%) rename test/{ => OLD}/tests/locales/it.js (100%) rename test/{ => OLD}/tests/locales/ja.js (100%) rename test/{ => OLD}/tests/locales/ko.js (100%) rename test/{ => OLD}/tests/locales/nl.js (100%) rename test/{ => OLD}/tests/locales/no.js (100%) rename test/{ => OLD}/tests/locales/pl.js (100%) rename test/{ => OLD}/tests/locales/pt.js (100%) rename test/{ => OLD}/tests/locales/ru.js (100%) rename test/{ => OLD}/tests/locales/sv.js (100%) rename test/{ => OLD}/tests/locales/zh-CN.js (100%) rename test/{ => OLD}/tests/locales/zh-TW.js (100%) create mode 100644 test/OLD/tests/number.js rename test/{ => OLD}/tests/object.js (100%) rename test/{ => OLD}/tests/range/date.js (100%) rename test/{ => OLD}/tests/range/number.js (100%) rename test/{ => OLD}/tests/range/string.js (100%) rename test/{ => OLD}/tests/regexp.js (100%) rename test/{ => OLD}/tests/string.js (100%) delete mode 100644 test/core.js create mode 100644 test/helpers/node.js delete mode 100644 test/modules.js delete mode 100644 test/number.js create mode 100644 test/plugins/math-operators/add/define.js create mode 100644 test/plugins/math-operators/add/index.js create mode 100644 test/plugins/math-operators/index.js create mode 100644 test/plugins/math-operators/mult/define.js create mode 100644 test/plugins/math-operators/mult/index.js rename test/{ => tests}/chainable.js (100%) rename test/{ => tests}/extended.js (100%) create mode 100644 test/tests/modules/plugin-method-define.js create mode 100644 test/tests/modules/plugin-method.js create mode 100644 test/tests/modules/plugin.js create mode 100644 test/tests/modules/sugar.js diff --git a/src/core/index.js b/src/core/index.js index 044ea4d64..4cb5c4eda 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,17 +1,20 @@ -import NamespaceStore from './NamespaceStore'; -import SugarChainableBase from './SugarChainableBase'; - -import globalContext from './globalContext'; -import { extendNative, restoreNative } from './extendUtils'; -import { hasOwnProperty, forEachProperty, arrayIncludes } from './utils'; +import globalContext from './util/globalContext'; +import NamespaceStore from './util/NamespaceStore'; +import SugarChainableBase from './util/SugarChainableBase'; +import { extendNative, restoreNative } from './util/extend'; +import { hasOwnProperty, forEachProperty, arrayIncludes } from './util/helpers'; +import { isString, isFunction } from '../util/typeChecks'; // --- Constants const SUGAR = 'Sugar'; -const ERROR_METHOD_DEFINED = 'Method already defined'; -const ERROR_NATIVE_UNKNOWN = 'Built-in class does not exist'; -const ERROR_EXTEND_CONFLICT = 'Extend options cannot have both include and exclude'; + +const ERROR_METHOD_DEFINED = 'Method already defined'; +const ERROR_NATIVE_UNKNOWN = 'Built-in class does not exist'; +const ERROR_EXTEND_CONFLICT = 'Extend options cannot have both include and exclude'; +const ERROR_UNNAMED_FUNCTION = 'Function requires a name'; + export const VERSION = 'edge'; @@ -62,12 +65,16 @@ export function createNamespace(globalName) { // --- Defining methods function defineWithArgs(globalName, defineMethod, args) { - if (typeof args[0] !== 'object') { - return defineMethod(globalName, args[0], args[1]); + if (isString(args[0])) { + defineMethod(globalName, args[0], args[1]); + } else if (isFunction(args[0])) { + assertNamedFunction(args[0]); + defineMethod(globalName, args[0].name, args[0]); + } else { + forEachProperty(args[0], (methodName, fn) => { + defineMethod(globalName, methodName, fn); + }); } - forEachProperty(args[0], (methodName, fn) => { - defineMethod(globalName, methodName, fn); - }); } function defineAliases(globalName, defineMethod, str, fn) { @@ -103,6 +110,12 @@ function assertMethodDoesNotExist(SugarChainable, methodName) { } } +function assertNamedFunction(fn) { + if (!fn.name) { + throw new TypeError(ERROR_UNNAMED_FUNCTION); + } +} + function wrapStaticMethodAsInstance(SugarChainable, fn) { return function(...args) { args.unshift(this); @@ -251,7 +264,7 @@ function mapNativeToChainable(globalName, SugarChainable) { } try { fn = proto[methodName]; - if (typeof fn !== 'function') { + if (!isFunction(fn)) { // Bail on anything not a function. return; } diff --git a/src/number/namespace.js b/src/core/number.js similarity index 100% rename from src/number/namespace.js rename to src/core/number.js diff --git a/src/core/NamespaceStore.js b/src/core/util/NamespaceStore.js similarity index 100% rename from src/core/NamespaceStore.js rename to src/core/util/NamespaceStore.js diff --git a/src/core/SugarChainableBase.js b/src/core/util/SugarChainableBase.js similarity index 100% rename from src/core/SugarChainableBase.js rename to src/core/util/SugarChainableBase.js diff --git a/src/core/extendUtils.js b/src/core/util/extend.js similarity index 96% rename from src/core/extendUtils.js rename to src/core/util/extend.js index 128b67be9..483d5b943 100644 --- a/src/core/extendUtils.js +++ b/src/core/util/extend.js @@ -1,5 +1,5 @@ import NamespaceStore from './NamespaceStore'; -import { hasOwnProperty } from './utils'; +import { hasOwnProperty } from './helpers'; const nativeDescriptors = new NamespaceStore(); diff --git a/src/core/globalContext.js b/src/core/util/globalContext.js similarity index 100% rename from src/core/globalContext.js rename to src/core/util/globalContext.js diff --git a/src/core/utils.js b/src/core/util/helpers.js similarity index 100% rename from src/core/utils.js rename to src/core/util/helpers.js diff --git a/src/number/abbr.js b/src/number/abbr.js index 690c63e1d..8098f61c4 100644 --- a/src/number/abbr.js +++ b/src/number/abbr.js @@ -1,8 +1,8 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import { assertFinite } from '../util/assertions'; import { trunc, round } from './util/math'; import { isNumber } from '../util/typeChecks'; -import formatNumber from './util/formatNumber'; +import format from './util/format'; import clamp from './util/clamp'; /** @@ -154,7 +154,7 @@ function getFormatted(n, formatter) { if (formatter) { return formatter.format(n); } - return formatNumber(n); + return format(n); } function getSafe(n) { @@ -163,4 +163,4 @@ function getSafe(n) { return round(n, SAFE_PRECISION); } -export default defineInstance('abbr', abbr); +export default defineInstance(abbr); diff --git a/src/number/abs.js b/src/number/abs.js index 4a4bec9c8..390073c81 100644 --- a/src/number/abs.js +++ b/src/number/abs.js @@ -1,6 +1,6 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; -export default defineInstance('abs', function(n) { +export default defineInstance(function abs(n) { // Note that .valueOf() here is only required due to a // very strange bug in iOS7 that only occurs occasionally // in which Math.abs() called on non-primitive numbers diff --git a/src/number/ceil.js b/src/number/ceil.js index ae73f8bd4..14936e075 100644 --- a/src/number/ceil.js +++ b/src/number/ceil.js @@ -1,3 +1,3 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import { ceil } from './util/math'; export default defineInstance('ceil', ceil); diff --git a/src/number/exp.js b/src/number/exp.js index afe2f91bb..56d956c17 100644 --- a/src/number/exp.js +++ b/src/number/exp.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('exp', Math.exp); +import { defineInstance } from '../core/number'; +export default defineInstance(Math.exp); diff --git a/src/number/floor.js b/src/number/floor.js index f1c98415e..585859cfd 100644 --- a/src/number/floor.js +++ b/src/number/floor.js @@ -1,3 +1,3 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import { floor } from './util/math'; export default defineInstance('floor', floor); diff --git a/src/number/format.js b/src/number/format.js index ef2f170aa..0afc2065b 100644 --- a/src/number/format.js +++ b/src/number/format.js @@ -1,3 +1,3 @@ -import { defineInstance } from './namespace'; -import formatNumber from './util/formatNumber'; -export default defineInstance('format', formatNumber); +import { defineInstance } from '../core/number'; +import format from './util/format'; +export default defineInstance(format); diff --git a/src/number/index.js b/src/number/index.js index 564b2423c..cc2ec4cba 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -1,4 +1,4 @@ -import SugarNumber from './namespace'; +import SugarNumber from '../core/number'; import './abbr'; import './abs'; diff --git a/src/number/isEven.js b/src/number/isEven.js index 85a2d7bba..76828caee 100644 --- a/src/number/isEven.js +++ b/src/number/isEven.js @@ -1,6 +1,6 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import isMultipleOf from './util/isMultipleOf'; -export default defineInstance('isEven', function(n) { +export default defineInstance(function isEven(n) { return Number.isInteger(n) && isMultipleOf(n, 2); }); diff --git a/src/number/isFinite.js b/src/number/isFinite.js index 249c3cc07..aa09d296e 100644 --- a/src/number/isFinite.js +++ b/src/number/isFinite.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('isFinite', Number.isFinite); +import { defineInstance } from '../core/number'; +export default defineInstance(Number.isFinite); diff --git a/src/number/isInteger.js b/src/number/isInteger.js index 0fc14de7c..1d8fe44ab 100644 --- a/src/number/isInteger.js +++ b/src/number/isInteger.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('isInteger', Number.isInteger); +import { defineInstance } from '../core/number'; +export default defineInstance(Number.isInteger); diff --git a/src/number/isMultipleOf.js b/src/number/isMultipleOf.js index 7c56c9e2c..f0a6861ac 100644 --- a/src/number/isMultipleOf.js +++ b/src/number/isMultipleOf.js @@ -1,6 +1,3 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import isMultipleOf from './util/isMultipleOf'; - -export default defineInstance('isMultipleOf', function(n1, n2) { - return isMultipleOf(n1, n2); -}); +export default defineInstance(isMultipleOf); diff --git a/src/number/isNaN.js b/src/number/isNaN.js index 07ffeb200..3add7120c 100644 --- a/src/number/isNaN.js +++ b/src/number/isNaN.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('isNaN', Number.isNaN); +import { defineInstance } from '../core/number'; +export default defineInstance(Number.isNaN); diff --git a/src/number/isOdd.js b/src/number/isOdd.js index a71e4ebba..114daf99f 100644 --- a/src/number/isOdd.js +++ b/src/number/isOdd.js @@ -1,6 +1,6 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import isMultipleOf from './util/isMultipleOf'; -export default defineInstance('isOdd', function(n) { +export default defineInstance(function isOdd(n) { return Number.isInteger(n) && !isMultipleOf(n, 2); }); diff --git a/src/number/isSafeInteger.js b/src/number/isSafeInteger.js index 91b40232f..19871c416 100644 --- a/src/number/isSafeInteger.js +++ b/src/number/isSafeInteger.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('isSafeInteger', Number.isSafeInteger); +import { defineInstance } from '../core/number'; +export default defineInstance(Number.isSafeInteger); diff --git a/src/number/log.js b/src/number/log.js index c7f3c1628..e17c77227 100644 --- a/src/number/log.js +++ b/src/number/log.js @@ -1,6 +1,6 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; -export default defineInstance('log', function(n, base) { +export default defineInstance(function log(n, base) { let log = Math.log(n); if (base) { log /= Math.log(base); diff --git a/src/number/pad.js b/src/number/pad.js index e1e1a6f32..3465d2626 100644 --- a/src/number/pad.js +++ b/src/number/pad.js @@ -1,3 +1,3 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import pad from './util/pad'; -export default defineInstance('pad', pad); +export default defineInstance(pad); diff --git a/src/number/pow.js b/src/number/pow.js index 1471020f5..b61170e10 100644 --- a/src/number/pow.js +++ b/src/number/pow.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('pow', Math.pow); +import { defineInstance } from '../core/number'; +export default defineInstance(Math.pow); diff --git a/src/number/random.js b/src/number/random.js index 5083be48c..fde52b792 100644 --- a/src/number/random.js +++ b/src/number/random.js @@ -1,6 +1,6 @@ -import { defineStatic } from './namespace'; +import { defineStatic } from '../core/number'; -export default defineStatic('random', function(n1 = 1, n2 = 0) { +export default defineStatic(function random(n1 = 1, n2 = 0) { const min = Math.min(n1, n2); const max = Math.max(n1, n2) + 1; return Math.floor((Math.random() * (max - min)) + min); diff --git a/src/number/round.js b/src/number/round.js index 8982e40c7..fe026e94c 100644 --- a/src/number/round.js +++ b/src/number/round.js @@ -1,3 +1,3 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import { round } from './util/math'; export default defineInstance('round', round); diff --git a/src/number/sqrt.js b/src/number/sqrt.js index b826a8a72..05980f4bb 100644 --- a/src/number/sqrt.js +++ b/src/number/sqrt.js @@ -1,2 +1,2 @@ -import { defineInstance } from './namespace'; -export default defineInstance('sqrt', Math.sqrt); +import { defineInstance } from '../core/number'; +export default defineInstance(Math.sqrt); diff --git a/src/number/times.js b/src/number/times.js index 43535db7b..af6765720 100644 --- a/src/number/times.js +++ b/src/number/times.js @@ -1,7 +1,7 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import { assertPositiveInteger } from '../util/assertions'; -export default defineInstance('times', function(n, fn) { +export default defineInstance(function times(n, fn) { assertPositiveInteger(n); const arr = []; for (let i = 0; i < n; i++) { diff --git a/src/number/toChar.js b/src/number/toChar.js index 0d99f7a19..ad29bc6c3 100644 --- a/src/number/toChar.js +++ b/src/number/toChar.js @@ -1,6 +1,6 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; -export default defineInstance('toChar', function(n) { +export default defineInstance(function toChar(n) { // Note that fromCharCode was historically 2x faster than // fromCodePoint, however this no longer seems to be the case. // https://jsperf.com/fromcharcode-vs-fromcodepoint/6 diff --git a/src/number/toHex.js b/src/number/toHex.js index cbb3e82cb..a3870877a 100644 --- a/src/number/toHex.js +++ b/src/number/toHex.js @@ -1,6 +1,6 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import pad from './util/pad'; -export default defineInstance('toHex', function(n, digits) { +export default defineInstance(function toHex(n, digits) { return pad(n, digits, null, false, 16); }); diff --git a/src/number/toOrdinal.js b/src/number/toOrdinal.js index e36b60930..cc6986da4 100644 --- a/src/number/toOrdinal.js +++ b/src/number/toOrdinal.js @@ -1,4 +1,4 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import toOrdinal from '../util/toOrdinal'; -export default defineInstance('toOrdinal', toOrdinal); +export default defineInstance(toOrdinal); diff --git a/src/number/trunc.js b/src/number/trunc.js index 18bc58dc8..5158b0481 100644 --- a/src/number/trunc.js +++ b/src/number/trunc.js @@ -1,3 +1,3 @@ -import { defineInstance } from './namespace'; +import { defineInstance } from '../core/number'; import { trunc } from './util/math'; export default defineInstance('trunc', trunc); diff --git a/src/number/util/formatNumber.js b/src/number/util/format.js similarity index 78% rename from src/number/util/formatNumber.js rename to src/number/util/format.js index 895f1477f..c73b43ef8 100644 --- a/src/number/util/formatNumber.js +++ b/src/number/util/format.js @@ -1,6 +1,6 @@ import replaceInteger from './replaceInteger'; -export default function formatNumber(n, precision, forceSign) { +export default function format(n, precision, forceSign) { return replaceInteger(n, precision, forceSign, 10, str => { for (let i = str.length - 3; i > 0; i -= 3) { str = str.slice(0, i) + ',' + str.slice(i); diff --git a/src/number/util/isMultipleOf.js b/src/number/util/isMultipleOf.js index 04927ff25..36fe55fe7 100644 --- a/src/number/util/isMultipleOf.js +++ b/src/number/util/isMultipleOf.js @@ -1,3 +1,3 @@ -export default function(n1, n2) { +export default function isMultipleOf(n1, n2) { return n1 % n2 === 0; } diff --git a/src/number/util/pad.js b/src/number/util/pad.js index 16b4def78..23cabac03 100644 --- a/src/number/util/pad.js +++ b/src/number/util/pad.js @@ -1,6 +1,6 @@ import replaceInteger from './replaceInteger'; -export default function(n, digits, precision, forceSign, base) { +export default function pad(n, digits, precision, forceSign, base) { return replaceInteger(n, precision, forceSign, base, str => { return str.padStart(digits, '0'); }); diff --git a/src/util/toOrdinal.js b/src/util/toOrdinal.js index a0632ce57..854ed39c8 100644 --- a/src/util/toOrdinal.js +++ b/src/util/toOrdinal.js @@ -12,7 +12,7 @@ function getSuffix(n) { } } -export default function(n) { +export default function toOrdinal(n) { assertInteger(n); return n + getSuffix(n); } diff --git a/src/util/typeChecks.js b/src/util/typeChecks.js index 1cdc1890a..4aad24ea6 100644 --- a/src/util/typeChecks.js +++ b/src/util/typeChecks.js @@ -5,3 +5,7 @@ export function isNumber(obj) { export function isString(obj) { return typeof obj === 'string'; } + +export function isFunction(obj) { + return typeof obj === 'function'; +} diff --git a/test/browser/chained/dev/custom.html b/test/OLD/browser/chained/dev/custom.html similarity index 100% rename from test/browser/chained/dev/custom.html rename to test/OLD/browser/chained/dev/custom.html diff --git a/test/browser/chained/dev/dist.html b/test/OLD/browser/chained/dev/dist.html similarity index 100% rename from test/browser/chained/dev/dist.html rename to test/OLD/browser/chained/dev/dist.html diff --git a/test/browser/chained/dev/sugar-array.html b/test/OLD/browser/chained/dev/sugar-array.html similarity index 100% rename from test/browser/chained/dev/sugar-array.html rename to test/OLD/browser/chained/dev/sugar-array.html diff --git a/test/browser/chained/dev/sugar-date.html b/test/OLD/browser/chained/dev/sugar-date.html similarity index 100% rename from test/browser/chained/dev/sugar-date.html rename to test/OLD/browser/chained/dev/sugar-date.html diff --git a/test/browser/chained/dev/sugar-enumerable.html b/test/OLD/browser/chained/dev/sugar-enumerable.html similarity index 100% rename from test/browser/chained/dev/sugar-enumerable.html rename to test/OLD/browser/chained/dev/sugar-enumerable.html diff --git a/test/browser/chained/dev/sugar-es5.html b/test/OLD/browser/chained/dev/sugar-es5.html similarity index 100% rename from test/browser/chained/dev/sugar-es5.html rename to test/OLD/browser/chained/dev/sugar-es5.html diff --git a/test/browser/chained/dev/sugar-es6.html b/test/OLD/browser/chained/dev/sugar-es6.html similarity index 100% rename from test/browser/chained/dev/sugar-es6.html rename to test/OLD/browser/chained/dev/sugar-es6.html diff --git a/test/browser/chained/dev/sugar-function.html b/test/OLD/browser/chained/dev/sugar-function.html similarity index 100% rename from test/browser/chained/dev/sugar-function.html rename to test/OLD/browser/chained/dev/sugar-function.html diff --git a/test/browser/chained/dev/sugar-inflections.html b/test/OLD/browser/chained/dev/sugar-inflections.html similarity index 100% rename from test/browser/chained/dev/sugar-inflections.html rename to test/OLD/browser/chained/dev/sugar-inflections.html diff --git a/test/browser/chained/dev/sugar-language.html b/test/OLD/browser/chained/dev/sugar-language.html similarity index 100% rename from test/browser/chained/dev/sugar-language.html rename to test/OLD/browser/chained/dev/sugar-language.html diff --git a/test/browser/chained/dev/sugar-number.html b/test/OLD/browser/chained/dev/sugar-number.html similarity index 100% rename from test/browser/chained/dev/sugar-number.html rename to test/OLD/browser/chained/dev/sugar-number.html diff --git a/test/browser/chained/dev/sugar-object.html b/test/OLD/browser/chained/dev/sugar-object.html similarity index 100% rename from test/browser/chained/dev/sugar-object.html rename to test/OLD/browser/chained/dev/sugar-object.html diff --git a/test/browser/chained/dev/sugar-range.html b/test/OLD/browser/chained/dev/sugar-range.html similarity index 100% rename from test/browser/chained/dev/sugar-range.html rename to test/OLD/browser/chained/dev/sugar-range.html diff --git a/test/browser/chained/dev/sugar-regexp.html b/test/OLD/browser/chained/dev/sugar-regexp.html similarity index 100% rename from test/browser/chained/dev/sugar-regexp.html rename to test/OLD/browser/chained/dev/sugar-regexp.html diff --git a/test/browser/chained/dev/sugar-string.html b/test/OLD/browser/chained/dev/sugar-string.html similarity index 100% rename from test/browser/chained/dev/sugar-string.html rename to test/OLD/browser/chained/dev/sugar-string.html diff --git a/test/browser/chained/dev/sugar.html b/test/OLD/browser/chained/dev/sugar.html similarity index 100% rename from test/browser/chained/dev/sugar.html rename to test/OLD/browser/chained/dev/sugar.html diff --git a/test/browser/chained/index.html b/test/OLD/browser/chained/index.html similarity index 100% rename from test/browser/chained/index.html rename to test/OLD/browser/chained/index.html diff --git a/test/browser/chained/min/custom.html b/test/OLD/browser/chained/min/custom.html similarity index 100% rename from test/browser/chained/min/custom.html rename to test/OLD/browser/chained/min/custom.html diff --git a/test/browser/chained/min/dist.html b/test/OLD/browser/chained/min/dist.html similarity index 100% rename from test/browser/chained/min/dist.html rename to test/OLD/browser/chained/min/dist.html diff --git a/test/browser/chained/min/sugar-array.html b/test/OLD/browser/chained/min/sugar-array.html similarity index 100% rename from test/browser/chained/min/sugar-array.html rename to test/OLD/browser/chained/min/sugar-array.html diff --git a/test/browser/chained/min/sugar-date.html b/test/OLD/browser/chained/min/sugar-date.html similarity index 100% rename from test/browser/chained/min/sugar-date.html rename to test/OLD/browser/chained/min/sugar-date.html diff --git a/test/browser/chained/min/sugar-enumerable.html b/test/OLD/browser/chained/min/sugar-enumerable.html similarity index 100% rename from test/browser/chained/min/sugar-enumerable.html rename to test/OLD/browser/chained/min/sugar-enumerable.html diff --git a/test/browser/chained/min/sugar-es5.html b/test/OLD/browser/chained/min/sugar-es5.html similarity index 100% rename from test/browser/chained/min/sugar-es5.html rename to test/OLD/browser/chained/min/sugar-es5.html diff --git a/test/browser/chained/min/sugar-es6.html b/test/OLD/browser/chained/min/sugar-es6.html similarity index 100% rename from test/browser/chained/min/sugar-es6.html rename to test/OLD/browser/chained/min/sugar-es6.html diff --git a/test/browser/chained/min/sugar-function.html b/test/OLD/browser/chained/min/sugar-function.html similarity index 100% rename from test/browser/chained/min/sugar-function.html rename to test/OLD/browser/chained/min/sugar-function.html diff --git a/test/browser/chained/min/sugar-inflections.html b/test/OLD/browser/chained/min/sugar-inflections.html similarity index 100% rename from test/browser/chained/min/sugar-inflections.html rename to test/OLD/browser/chained/min/sugar-inflections.html diff --git a/test/browser/chained/min/sugar-language.html b/test/OLD/browser/chained/min/sugar-language.html similarity index 100% rename from test/browser/chained/min/sugar-language.html rename to test/OLD/browser/chained/min/sugar-language.html diff --git a/test/browser/chained/min/sugar-number.html b/test/OLD/browser/chained/min/sugar-number.html similarity index 100% rename from test/browser/chained/min/sugar-number.html rename to test/OLD/browser/chained/min/sugar-number.html diff --git a/test/browser/chained/min/sugar-object.html b/test/OLD/browser/chained/min/sugar-object.html similarity index 100% rename from test/browser/chained/min/sugar-object.html rename to test/OLD/browser/chained/min/sugar-object.html diff --git a/test/browser/chained/min/sugar-range.html b/test/OLD/browser/chained/min/sugar-range.html similarity index 100% rename from test/browser/chained/min/sugar-range.html rename to test/OLD/browser/chained/min/sugar-range.html diff --git a/test/browser/chained/min/sugar-regexp.html b/test/OLD/browser/chained/min/sugar-regexp.html similarity index 100% rename from test/browser/chained/min/sugar-regexp.html rename to test/OLD/browser/chained/min/sugar-regexp.html diff --git a/test/browser/chained/min/sugar-string.html b/test/OLD/browser/chained/min/sugar-string.html similarity index 100% rename from test/browser/chained/min/sugar-string.html rename to test/OLD/browser/chained/min/sugar-string.html diff --git a/test/browser/chained/min/sugar.html b/test/OLD/browser/chained/min/sugar.html similarity index 100% rename from test/browser/chained/min/sugar.html rename to test/OLD/browser/chained/min/sugar.html diff --git a/test/browser/chained/src.html b/test/OLD/browser/chained/src.html similarity index 100% rename from test/browser/chained/src.html rename to test/OLD/browser/chained/src.html diff --git a/test/browser/chained/src/array.html b/test/OLD/browser/chained/src/array.html similarity index 100% rename from test/browser/chained/src/array.html rename to test/OLD/browser/chained/src/array.html diff --git a/test/browser/chained/src/date.html b/test/OLD/browser/chained/src/date.html similarity index 100% rename from test/browser/chained/src/date.html rename to test/OLD/browser/chained/src/date.html diff --git a/test/browser/chained/src/default.html b/test/OLD/browser/chained/src/default.html similarity index 100% rename from test/browser/chained/src/default.html rename to test/OLD/browser/chained/src/default.html diff --git a/test/browser/chained/src/enumerable.html b/test/OLD/browser/chained/src/enumerable.html similarity index 100% rename from test/browser/chained/src/enumerable.html rename to test/OLD/browser/chained/src/enumerable.html diff --git a/test/browser/chained/src/full.html b/test/OLD/browser/chained/src/full.html similarity index 100% rename from test/browser/chained/src/full.html rename to test/OLD/browser/chained/src/full.html diff --git a/test/browser/chained/src/function.html b/test/OLD/browser/chained/src/function.html similarity index 100% rename from test/browser/chained/src/function.html rename to test/OLD/browser/chained/src/function.html diff --git a/test/browser/chained/src/inflections.html b/test/OLD/browser/chained/src/inflections.html similarity index 100% rename from test/browser/chained/src/inflections.html rename to test/OLD/browser/chained/src/inflections.html diff --git a/test/browser/chained/src/language.html b/test/OLD/browser/chained/src/language.html similarity index 100% rename from test/browser/chained/src/language.html rename to test/OLD/browser/chained/src/language.html diff --git a/test/browser/chained/src/number.html b/test/OLD/browser/chained/src/number.html similarity index 100% rename from test/browser/chained/src/number.html rename to test/OLD/browser/chained/src/number.html diff --git a/test/browser/chained/src/object.html b/test/OLD/browser/chained/src/object.html similarity index 100% rename from test/browser/chained/src/object.html rename to test/OLD/browser/chained/src/object.html diff --git a/test/browser/chained/src/range.html b/test/OLD/browser/chained/src/range.html similarity index 100% rename from test/browser/chained/src/range.html rename to test/OLD/browser/chained/src/range.html diff --git a/test/browser/chained/src/regexp.html b/test/OLD/browser/chained/src/regexp.html similarity index 100% rename from test/browser/chained/src/regexp.html rename to test/OLD/browser/chained/src/regexp.html diff --git a/test/browser/chained/src/string.html b/test/OLD/browser/chained/src/string.html similarity index 100% rename from test/browser/chained/src/string.html rename to test/OLD/browser/chained/src/string.html diff --git a/test/browser/custom.html b/test/OLD/browser/custom.html similarity index 100% rename from test/browser/custom.html rename to test/OLD/browser/custom.html diff --git a/test/browser/default/core.html b/test/OLD/browser/default/core.html similarity index 100% rename from test/browser/default/core.html rename to test/OLD/browser/default/core.html diff --git a/test/browser/default/dev/custom.html b/test/OLD/browser/default/dev/custom.html similarity index 100% rename from test/browser/default/dev/custom.html rename to test/OLD/browser/default/dev/custom.html diff --git a/test/browser/default/dev/dist.html b/test/OLD/browser/default/dev/dist.html similarity index 100% rename from test/browser/default/dev/dist.html rename to test/OLD/browser/default/dev/dist.html diff --git a/test/browser/default/dev/sugar-array.html b/test/OLD/browser/default/dev/sugar-array.html similarity index 100% rename from test/browser/default/dev/sugar-array.html rename to test/OLD/browser/default/dev/sugar-array.html diff --git a/test/browser/default/dev/sugar-core.html b/test/OLD/browser/default/dev/sugar-core.html similarity index 100% rename from test/browser/default/dev/sugar-core.html rename to test/OLD/browser/default/dev/sugar-core.html diff --git a/test/browser/default/dev/sugar-date.html b/test/OLD/browser/default/dev/sugar-date.html similarity index 100% rename from test/browser/default/dev/sugar-date.html rename to test/OLD/browser/default/dev/sugar-date.html diff --git a/test/browser/default/dev/sugar-enumerable.html b/test/OLD/browser/default/dev/sugar-enumerable.html similarity index 100% rename from test/browser/default/dev/sugar-enumerable.html rename to test/OLD/browser/default/dev/sugar-enumerable.html diff --git a/test/browser/default/dev/sugar-es5.html b/test/OLD/browser/default/dev/sugar-es5.html similarity index 100% rename from test/browser/default/dev/sugar-es5.html rename to test/OLD/browser/default/dev/sugar-es5.html diff --git a/test/browser/default/dev/sugar-es6.html b/test/OLD/browser/default/dev/sugar-es6.html similarity index 100% rename from test/browser/default/dev/sugar-es6.html rename to test/OLD/browser/default/dev/sugar-es6.html diff --git a/test/browser/default/dev/sugar-function.html b/test/OLD/browser/default/dev/sugar-function.html similarity index 100% rename from test/browser/default/dev/sugar-function.html rename to test/OLD/browser/default/dev/sugar-function.html diff --git a/test/browser/default/dev/sugar-inflections.html b/test/OLD/browser/default/dev/sugar-inflections.html similarity index 100% rename from test/browser/default/dev/sugar-inflections.html rename to test/OLD/browser/default/dev/sugar-inflections.html diff --git a/test/browser/default/dev/sugar-language.html b/test/OLD/browser/default/dev/sugar-language.html similarity index 100% rename from test/browser/default/dev/sugar-language.html rename to test/OLD/browser/default/dev/sugar-language.html diff --git a/test/browser/default/dev/sugar-number.html b/test/OLD/browser/default/dev/sugar-number.html similarity index 100% rename from test/browser/default/dev/sugar-number.html rename to test/OLD/browser/default/dev/sugar-number.html diff --git a/test/browser/default/dev/sugar-object.html b/test/OLD/browser/default/dev/sugar-object.html similarity index 100% rename from test/browser/default/dev/sugar-object.html rename to test/OLD/browser/default/dev/sugar-object.html diff --git a/test/browser/default/dev/sugar-range.html b/test/OLD/browser/default/dev/sugar-range.html similarity index 100% rename from test/browser/default/dev/sugar-range.html rename to test/OLD/browser/default/dev/sugar-range.html diff --git a/test/browser/default/dev/sugar-regexp.html b/test/OLD/browser/default/dev/sugar-regexp.html similarity index 100% rename from test/browser/default/dev/sugar-regexp.html rename to test/OLD/browser/default/dev/sugar-regexp.html diff --git a/test/browser/default/dev/sugar-string.html b/test/OLD/browser/default/dev/sugar-string.html similarity index 100% rename from test/browser/default/dev/sugar-string.html rename to test/OLD/browser/default/dev/sugar-string.html diff --git a/test/browser/default/dev/sugar.html b/test/OLD/browser/default/dev/sugar.html similarity index 100% rename from test/browser/default/dev/sugar.html rename to test/OLD/browser/default/dev/sugar.html diff --git a/test/browser/default/index.html b/test/OLD/browser/default/index.html similarity index 100% rename from test/browser/default/index.html rename to test/OLD/browser/default/index.html diff --git a/test/browser/default/min/custom.html b/test/OLD/browser/default/min/custom.html similarity index 100% rename from test/browser/default/min/custom.html rename to test/OLD/browser/default/min/custom.html diff --git a/test/browser/default/min/dist.html b/test/OLD/browser/default/min/dist.html similarity index 100% rename from test/browser/default/min/dist.html rename to test/OLD/browser/default/min/dist.html diff --git a/test/browser/default/min/sugar-array.html b/test/OLD/browser/default/min/sugar-array.html similarity index 100% rename from test/browser/default/min/sugar-array.html rename to test/OLD/browser/default/min/sugar-array.html diff --git a/test/browser/default/min/sugar-core.html b/test/OLD/browser/default/min/sugar-core.html similarity index 100% rename from test/browser/default/min/sugar-core.html rename to test/OLD/browser/default/min/sugar-core.html diff --git a/test/browser/default/min/sugar-date.html b/test/OLD/browser/default/min/sugar-date.html similarity index 100% rename from test/browser/default/min/sugar-date.html rename to test/OLD/browser/default/min/sugar-date.html diff --git a/test/browser/default/min/sugar-enumerable.html b/test/OLD/browser/default/min/sugar-enumerable.html similarity index 100% rename from test/browser/default/min/sugar-enumerable.html rename to test/OLD/browser/default/min/sugar-enumerable.html diff --git a/test/browser/default/min/sugar-es5.html b/test/OLD/browser/default/min/sugar-es5.html similarity index 100% rename from test/browser/default/min/sugar-es5.html rename to test/OLD/browser/default/min/sugar-es5.html diff --git a/test/browser/default/min/sugar-es6.html b/test/OLD/browser/default/min/sugar-es6.html similarity index 100% rename from test/browser/default/min/sugar-es6.html rename to test/OLD/browser/default/min/sugar-es6.html diff --git a/test/browser/default/min/sugar-function.html b/test/OLD/browser/default/min/sugar-function.html similarity index 100% rename from test/browser/default/min/sugar-function.html rename to test/OLD/browser/default/min/sugar-function.html diff --git a/test/browser/default/min/sugar-inflections.html b/test/OLD/browser/default/min/sugar-inflections.html similarity index 100% rename from test/browser/default/min/sugar-inflections.html rename to test/OLD/browser/default/min/sugar-inflections.html diff --git a/test/browser/default/min/sugar-language.html b/test/OLD/browser/default/min/sugar-language.html similarity index 100% rename from test/browser/default/min/sugar-language.html rename to test/OLD/browser/default/min/sugar-language.html diff --git a/test/browser/default/min/sugar-number.html b/test/OLD/browser/default/min/sugar-number.html similarity index 100% rename from test/browser/default/min/sugar-number.html rename to test/OLD/browser/default/min/sugar-number.html diff --git a/test/browser/default/min/sugar-object.html b/test/OLD/browser/default/min/sugar-object.html similarity index 100% rename from test/browser/default/min/sugar-object.html rename to test/OLD/browser/default/min/sugar-object.html diff --git a/test/browser/default/min/sugar-range.html b/test/OLD/browser/default/min/sugar-range.html similarity index 100% rename from test/browser/default/min/sugar-range.html rename to test/OLD/browser/default/min/sugar-range.html diff --git a/test/browser/default/min/sugar-regexp.html b/test/OLD/browser/default/min/sugar-regexp.html similarity index 100% rename from test/browser/default/min/sugar-regexp.html rename to test/OLD/browser/default/min/sugar-regexp.html diff --git a/test/browser/default/min/sugar-string.html b/test/OLD/browser/default/min/sugar-string.html similarity index 100% rename from test/browser/default/min/sugar-string.html rename to test/OLD/browser/default/min/sugar-string.html diff --git a/test/browser/default/min/sugar.html b/test/OLD/browser/default/min/sugar.html similarity index 100% rename from test/browser/default/min/sugar.html rename to test/OLD/browser/default/min/sugar.html diff --git a/test/browser/default/src.html b/test/OLD/browser/default/src.html similarity index 100% rename from test/browser/default/src.html rename to test/OLD/browser/default/src.html diff --git a/test/browser/default/src/array.html b/test/OLD/browser/default/src/array.html similarity index 100% rename from test/browser/default/src/array.html rename to test/OLD/browser/default/src/array.html diff --git a/test/browser/default/src/core.html b/test/OLD/browser/default/src/core.html similarity index 100% rename from test/browser/default/src/core.html rename to test/OLD/browser/default/src/core.html diff --git a/test/browser/default/src/date.html b/test/OLD/browser/default/src/date.html similarity index 100% rename from test/browser/default/src/date.html rename to test/OLD/browser/default/src/date.html diff --git a/test/browser/default/src/default.html b/test/OLD/browser/default/src/default.html similarity index 100% rename from test/browser/default/src/default.html rename to test/OLD/browser/default/src/default.html diff --git a/test/browser/default/src/enumerable.html b/test/OLD/browser/default/src/enumerable.html similarity index 100% rename from test/browser/default/src/enumerable.html rename to test/OLD/browser/default/src/enumerable.html diff --git a/test/browser/default/src/es.html b/test/OLD/browser/default/src/es.html similarity index 100% rename from test/browser/default/src/es.html rename to test/OLD/browser/default/src/es.html diff --git a/test/browser/default/src/es5.html b/test/OLD/browser/default/src/es5.html similarity index 100% rename from test/browser/default/src/es5.html rename to test/OLD/browser/default/src/es5.html diff --git a/test/browser/default/src/full.html b/test/OLD/browser/default/src/full.html similarity index 100% rename from test/browser/default/src/full.html rename to test/OLD/browser/default/src/full.html diff --git a/test/browser/default/src/function.html b/test/OLD/browser/default/src/function.html similarity index 100% rename from test/browser/default/src/function.html rename to test/OLD/browser/default/src/function.html diff --git a/test/browser/default/src/inflections.html b/test/OLD/browser/default/src/inflections.html similarity index 100% rename from test/browser/default/src/inflections.html rename to test/OLD/browser/default/src/inflections.html diff --git a/test/browser/default/src/language.html b/test/OLD/browser/default/src/language.html similarity index 100% rename from test/browser/default/src/language.html rename to test/OLD/browser/default/src/language.html diff --git a/test/browser/default/src/number.html b/test/OLD/browser/default/src/number.html similarity index 100% rename from test/browser/default/src/number.html rename to test/OLD/browser/default/src/number.html diff --git a/test/browser/default/src/object.html b/test/OLD/browser/default/src/object.html similarity index 100% rename from test/browser/default/src/object.html rename to test/OLD/browser/default/src/object.html diff --git a/test/browser/default/src/range.html b/test/OLD/browser/default/src/range.html similarity index 100% rename from test/browser/default/src/range.html rename to test/OLD/browser/default/src/range.html diff --git a/test/browser/default/src/regexp.html b/test/OLD/browser/default/src/regexp.html similarity index 100% rename from test/browser/default/src/regexp.html rename to test/OLD/browser/default/src/regexp.html diff --git a/test/browser/default/src/string.html b/test/OLD/browser/default/src/string.html similarity index 100% rename from test/browser/default/src/string.html rename to test/OLD/browser/default/src/string.html diff --git a/test/browser/dist.html b/test/OLD/browser/dist.html similarity index 100% rename from test/browser/dist.html rename to test/OLD/browser/dist.html diff --git a/test/browser/extended/dev/custom.html b/test/OLD/browser/extended/dev/custom.html similarity index 100% rename from test/browser/extended/dev/custom.html rename to test/OLD/browser/extended/dev/custom.html diff --git a/test/browser/extended/dev/dist.html b/test/OLD/browser/extended/dev/dist.html similarity index 100% rename from test/browser/extended/dev/dist.html rename to test/OLD/browser/extended/dev/dist.html diff --git a/test/browser/extended/dev/sugar-array.html b/test/OLD/browser/extended/dev/sugar-array.html similarity index 100% rename from test/browser/extended/dev/sugar-array.html rename to test/OLD/browser/extended/dev/sugar-array.html diff --git a/test/browser/extended/dev/sugar-date.html b/test/OLD/browser/extended/dev/sugar-date.html similarity index 100% rename from test/browser/extended/dev/sugar-date.html rename to test/OLD/browser/extended/dev/sugar-date.html diff --git a/test/browser/extended/dev/sugar-enumerable.html b/test/OLD/browser/extended/dev/sugar-enumerable.html similarity index 100% rename from test/browser/extended/dev/sugar-enumerable.html rename to test/OLD/browser/extended/dev/sugar-enumerable.html diff --git a/test/browser/extended/dev/sugar-es5.html b/test/OLD/browser/extended/dev/sugar-es5.html similarity index 100% rename from test/browser/extended/dev/sugar-es5.html rename to test/OLD/browser/extended/dev/sugar-es5.html diff --git a/test/browser/extended/dev/sugar-es6.html b/test/OLD/browser/extended/dev/sugar-es6.html similarity index 100% rename from test/browser/extended/dev/sugar-es6.html rename to test/OLD/browser/extended/dev/sugar-es6.html diff --git a/test/browser/extended/dev/sugar-function.html b/test/OLD/browser/extended/dev/sugar-function.html similarity index 100% rename from test/browser/extended/dev/sugar-function.html rename to test/OLD/browser/extended/dev/sugar-function.html diff --git a/test/browser/extended/dev/sugar-inflections.html b/test/OLD/browser/extended/dev/sugar-inflections.html similarity index 100% rename from test/browser/extended/dev/sugar-inflections.html rename to test/OLD/browser/extended/dev/sugar-inflections.html diff --git a/test/browser/extended/dev/sugar-language.html b/test/OLD/browser/extended/dev/sugar-language.html similarity index 100% rename from test/browser/extended/dev/sugar-language.html rename to test/OLD/browser/extended/dev/sugar-language.html diff --git a/test/browser/extended/dev/sugar-number.html b/test/OLD/browser/extended/dev/sugar-number.html similarity index 100% rename from test/browser/extended/dev/sugar-number.html rename to test/OLD/browser/extended/dev/sugar-number.html diff --git a/test/browser/extended/dev/sugar-object.html b/test/OLD/browser/extended/dev/sugar-object.html similarity index 100% rename from test/browser/extended/dev/sugar-object.html rename to test/OLD/browser/extended/dev/sugar-object.html diff --git a/test/browser/extended/dev/sugar-range.html b/test/OLD/browser/extended/dev/sugar-range.html similarity index 100% rename from test/browser/extended/dev/sugar-range.html rename to test/OLD/browser/extended/dev/sugar-range.html diff --git a/test/browser/extended/dev/sugar-regexp.html b/test/OLD/browser/extended/dev/sugar-regexp.html similarity index 100% rename from test/browser/extended/dev/sugar-regexp.html rename to test/OLD/browser/extended/dev/sugar-regexp.html diff --git a/test/browser/extended/dev/sugar-string.html b/test/OLD/browser/extended/dev/sugar-string.html similarity index 100% rename from test/browser/extended/dev/sugar-string.html rename to test/OLD/browser/extended/dev/sugar-string.html diff --git a/test/browser/extended/dev/sugar.html b/test/OLD/browser/extended/dev/sugar.html similarity index 100% rename from test/browser/extended/dev/sugar.html rename to test/OLD/browser/extended/dev/sugar.html diff --git a/test/browser/extended/index.html b/test/OLD/browser/extended/index.html similarity index 100% rename from test/browser/extended/index.html rename to test/OLD/browser/extended/index.html diff --git a/test/browser/extended/min/custom.html b/test/OLD/browser/extended/min/custom.html similarity index 100% rename from test/browser/extended/min/custom.html rename to test/OLD/browser/extended/min/custom.html diff --git a/test/browser/extended/min/dist.html b/test/OLD/browser/extended/min/dist.html similarity index 100% rename from test/browser/extended/min/dist.html rename to test/OLD/browser/extended/min/dist.html diff --git a/test/browser/extended/min/sugar-array.html b/test/OLD/browser/extended/min/sugar-array.html similarity index 100% rename from test/browser/extended/min/sugar-array.html rename to test/OLD/browser/extended/min/sugar-array.html diff --git a/test/browser/extended/min/sugar-date.html b/test/OLD/browser/extended/min/sugar-date.html similarity index 100% rename from test/browser/extended/min/sugar-date.html rename to test/OLD/browser/extended/min/sugar-date.html diff --git a/test/browser/extended/min/sugar-enumerable.html b/test/OLD/browser/extended/min/sugar-enumerable.html similarity index 100% rename from test/browser/extended/min/sugar-enumerable.html rename to test/OLD/browser/extended/min/sugar-enumerable.html diff --git a/test/browser/extended/min/sugar-es5.html b/test/OLD/browser/extended/min/sugar-es5.html similarity index 100% rename from test/browser/extended/min/sugar-es5.html rename to test/OLD/browser/extended/min/sugar-es5.html diff --git a/test/browser/extended/min/sugar-es6.html b/test/OLD/browser/extended/min/sugar-es6.html similarity index 100% rename from test/browser/extended/min/sugar-es6.html rename to test/OLD/browser/extended/min/sugar-es6.html diff --git a/test/browser/extended/min/sugar-function.html b/test/OLD/browser/extended/min/sugar-function.html similarity index 100% rename from test/browser/extended/min/sugar-function.html rename to test/OLD/browser/extended/min/sugar-function.html diff --git a/test/browser/extended/min/sugar-inflections.html b/test/OLD/browser/extended/min/sugar-inflections.html similarity index 100% rename from test/browser/extended/min/sugar-inflections.html rename to test/OLD/browser/extended/min/sugar-inflections.html diff --git a/test/browser/extended/min/sugar-language.html b/test/OLD/browser/extended/min/sugar-language.html similarity index 100% rename from test/browser/extended/min/sugar-language.html rename to test/OLD/browser/extended/min/sugar-language.html diff --git a/test/browser/extended/min/sugar-number.html b/test/OLD/browser/extended/min/sugar-number.html similarity index 100% rename from test/browser/extended/min/sugar-number.html rename to test/OLD/browser/extended/min/sugar-number.html diff --git a/test/browser/extended/min/sugar-object.html b/test/OLD/browser/extended/min/sugar-object.html similarity index 100% rename from test/browser/extended/min/sugar-object.html rename to test/OLD/browser/extended/min/sugar-object.html diff --git a/test/browser/extended/min/sugar-range.html b/test/OLD/browser/extended/min/sugar-range.html similarity index 100% rename from test/browser/extended/min/sugar-range.html rename to test/OLD/browser/extended/min/sugar-range.html diff --git a/test/browser/extended/min/sugar-regexp.html b/test/OLD/browser/extended/min/sugar-regexp.html similarity index 100% rename from test/browser/extended/min/sugar-regexp.html rename to test/OLD/browser/extended/min/sugar-regexp.html diff --git a/test/browser/extended/min/sugar-string.html b/test/OLD/browser/extended/min/sugar-string.html similarity index 100% rename from test/browser/extended/min/sugar-string.html rename to test/OLD/browser/extended/min/sugar-string.html diff --git a/test/browser/extended/min/sugar.html b/test/OLD/browser/extended/min/sugar.html similarity index 100% rename from test/browser/extended/min/sugar.html rename to test/OLD/browser/extended/min/sugar.html diff --git a/test/browser/extended/src.html b/test/OLD/browser/extended/src.html similarity index 100% rename from test/browser/extended/src.html rename to test/OLD/browser/extended/src.html diff --git a/test/browser/extended/src/array.html b/test/OLD/browser/extended/src/array.html similarity index 100% rename from test/browser/extended/src/array.html rename to test/OLD/browser/extended/src/array.html diff --git a/test/browser/extended/src/date.html b/test/OLD/browser/extended/src/date.html similarity index 100% rename from test/browser/extended/src/date.html rename to test/OLD/browser/extended/src/date.html diff --git a/test/browser/extended/src/default.html b/test/OLD/browser/extended/src/default.html similarity index 100% rename from test/browser/extended/src/default.html rename to test/OLD/browser/extended/src/default.html diff --git a/test/browser/extended/src/enumerable.html b/test/OLD/browser/extended/src/enumerable.html similarity index 100% rename from test/browser/extended/src/enumerable.html rename to test/OLD/browser/extended/src/enumerable.html diff --git a/test/browser/extended/src/full.html b/test/OLD/browser/extended/src/full.html similarity index 100% rename from test/browser/extended/src/full.html rename to test/OLD/browser/extended/src/full.html diff --git a/test/browser/extended/src/function.html b/test/OLD/browser/extended/src/function.html similarity index 100% rename from test/browser/extended/src/function.html rename to test/OLD/browser/extended/src/function.html diff --git a/test/browser/extended/src/inflections.html b/test/OLD/browser/extended/src/inflections.html similarity index 100% rename from test/browser/extended/src/inflections.html rename to test/OLD/browser/extended/src/inflections.html diff --git a/test/browser/extended/src/language.html b/test/OLD/browser/extended/src/language.html similarity index 100% rename from test/browser/extended/src/language.html rename to test/OLD/browser/extended/src/language.html diff --git a/test/browser/extended/src/number.html b/test/OLD/browser/extended/src/number.html similarity index 100% rename from test/browser/extended/src/number.html rename to test/OLD/browser/extended/src/number.html diff --git a/test/browser/extended/src/object.html b/test/OLD/browser/extended/src/object.html similarity index 100% rename from test/browser/extended/src/object.html rename to test/OLD/browser/extended/src/object.html diff --git a/test/browser/extended/src/range.html b/test/OLD/browser/extended/src/range.html similarity index 100% rename from test/browser/extended/src/range.html rename to test/OLD/browser/extended/src/range.html diff --git a/test/browser/extended/src/regexp.html b/test/OLD/browser/extended/src/regexp.html similarity index 100% rename from test/browser/extended/src/regexp.html rename to test/OLD/browser/extended/src/regexp.html diff --git a/test/browser/extended/src/string.html b/test/OLD/browser/extended/src/string.html similarity index 100% rename from test/browser/extended/src/string.html rename to test/OLD/browser/extended/src/string.html diff --git a/test/browser/index.html b/test/OLD/browser/index.html similarity index 100% rename from test/browser/index.html rename to test/OLD/browser/index.html diff --git a/test/browser/javascripts/benchmark.js b/test/OLD/browser/javascripts/benchmark.js similarity index 100% rename from test/browser/javascripts/benchmark.js rename to test/OLD/browser/javascripts/benchmark.js diff --git a/test/browser/javascripts/jquery-1.7.1.js b/test/OLD/browser/javascripts/jquery-1.7.1.js similarity index 100% rename from test/browser/javascripts/jquery-1.7.1.js rename to test/OLD/browser/javascripts/jquery-1.7.1.js diff --git a/test/browser/javascripts/runner-chained.js b/test/OLD/browser/javascripts/runner-chained.js similarity index 100% rename from test/browser/javascripts/runner-chained.js rename to test/OLD/browser/javascripts/runner-chained.js diff --git a/test/browser/javascripts/runner-extended.js b/test/OLD/browser/javascripts/runner-extended.js similarity index 100% rename from test/browser/javascripts/runner-extended.js rename to test/OLD/browser/javascripts/runner-extended.js diff --git a/test/browser/javascripts/runner.js b/test/OLD/browser/javascripts/runner.js similarity index 100% rename from test/browser/javascripts/runner.js rename to test/OLD/browser/javascripts/runner.js diff --git a/test/browser/javascripts/suite-ui.js b/test/OLD/browser/javascripts/suite-ui.js similarity index 100% rename from test/browser/javascripts/suite-ui.js rename to test/OLD/browser/javascripts/suite-ui.js diff --git a/test/browser/javascripts/tooltip.js b/test/OLD/browser/javascripts/tooltip.js similarity index 100% rename from test/browser/javascripts/tooltip.js rename to test/OLD/browser/javascripts/tooltip.js diff --git a/test/browser/performance/fixtures.js b/test/OLD/browser/performance/fixtures.js similarity index 100% rename from test/browser/performance/fixtures.js rename to test/OLD/browser/performance/fixtures.js diff --git a/test/browser/performance/index.html b/test/OLD/browser/performance/index.html similarity index 100% rename from test/browser/performance/index.html rename to test/OLD/browser/performance/index.html diff --git a/test/browser/performance/tests.js b/test/OLD/browser/performance/tests.js similarity index 100% rename from test/browser/performance/tests.js rename to test/OLD/browser/performance/tests.js diff --git a/test/browser/src.html b/test/OLD/browser/src.html similarity index 100% rename from test/browser/src.html rename to test/OLD/browser/src.html diff --git a/test/browser/stylesheets/custom.css b/test/OLD/browser/stylesheets/custom.css similarity index 100% rename from test/browser/stylesheets/custom.css rename to test/OLD/browser/stylesheets/custom.css diff --git a/test/browser/stylesheets/tooltip.css b/test/OLD/browser/stylesheets/tooltip.css similarity index 100% rename from test/browser/stylesheets/tooltip.css rename to test/OLD/browser/stylesheets/tooltip.css diff --git a/test/browser/sugar.html b/test/OLD/browser/sugar.html similarity index 100% rename from test/browser/sugar.html rename to test/OLD/browser/sugar.html diff --git a/test/node/all.js b/test/OLD/node/all.js similarity index 100% rename from test/node/all.js rename to test/OLD/node/all.js diff --git a/test/node/chained/dist.js b/test/OLD/node/chained/dist.js similarity index 100% rename from test/node/chained/dist.js rename to test/OLD/node/chained/dist.js diff --git a/test/node/chained/sugar-array.js b/test/OLD/node/chained/sugar-array.js similarity index 100% rename from test/node/chained/sugar-array.js rename to test/OLD/node/chained/sugar-array.js diff --git a/test/node/chained/sugar-date.js b/test/OLD/node/chained/sugar-date.js similarity index 100% rename from test/node/chained/sugar-date.js rename to test/OLD/node/chained/sugar-date.js diff --git a/test/node/chained/sugar-enumerable.js b/test/OLD/node/chained/sugar-enumerable.js similarity index 100% rename from test/node/chained/sugar-enumerable.js rename to test/OLD/node/chained/sugar-enumerable.js diff --git a/test/node/chained/sugar-function.js b/test/OLD/node/chained/sugar-function.js similarity index 100% rename from test/node/chained/sugar-function.js rename to test/OLD/node/chained/sugar-function.js diff --git a/test/node/chained/sugar-inflections.js b/test/OLD/node/chained/sugar-inflections.js similarity index 100% rename from test/node/chained/sugar-inflections.js rename to test/OLD/node/chained/sugar-inflections.js diff --git a/test/node/chained/sugar-language.js b/test/OLD/node/chained/sugar-language.js similarity index 100% rename from test/node/chained/sugar-language.js rename to test/OLD/node/chained/sugar-language.js diff --git a/test/node/chained/sugar-number.js b/test/OLD/node/chained/sugar-number.js similarity index 100% rename from test/node/chained/sugar-number.js rename to test/OLD/node/chained/sugar-number.js diff --git a/test/node/chained/sugar-object.js b/test/OLD/node/chained/sugar-object.js similarity index 100% rename from test/node/chained/sugar-object.js rename to test/OLD/node/chained/sugar-object.js diff --git a/test/node/chained/sugar-range.js b/test/OLD/node/chained/sugar-range.js similarity index 100% rename from test/node/chained/sugar-range.js rename to test/OLD/node/chained/sugar-range.js diff --git a/test/node/chained/sugar-regexp.js b/test/OLD/node/chained/sugar-regexp.js similarity index 100% rename from test/node/chained/sugar-regexp.js rename to test/OLD/node/chained/sugar-regexp.js diff --git a/test/node/chained/sugar-string.js b/test/OLD/node/chained/sugar-string.js similarity index 100% rename from test/node/chained/sugar-string.js rename to test/OLD/node/chained/sugar-string.js diff --git a/test/node/chained/sugar.js b/test/OLD/node/chained/sugar.js similarity index 100% rename from test/node/chained/sugar.js rename to test/OLD/node/chained/sugar.js diff --git a/test/node/default/dist.js b/test/OLD/node/default/dist.js similarity index 100% rename from test/node/default/dist.js rename to test/OLD/node/default/dist.js diff --git a/test/node/default/sugar-array.js b/test/OLD/node/default/sugar-array.js similarity index 100% rename from test/node/default/sugar-array.js rename to test/OLD/node/default/sugar-array.js diff --git a/test/node/default/sugar-core.js b/test/OLD/node/default/sugar-core.js similarity index 100% rename from test/node/default/sugar-core.js rename to test/OLD/node/default/sugar-core.js diff --git a/test/node/default/sugar-date.js b/test/OLD/node/default/sugar-date.js similarity index 100% rename from test/node/default/sugar-date.js rename to test/OLD/node/default/sugar-date.js diff --git a/test/node/default/sugar-enumerable.js b/test/OLD/node/default/sugar-enumerable.js similarity index 100% rename from test/node/default/sugar-enumerable.js rename to test/OLD/node/default/sugar-enumerable.js diff --git a/test/node/default/sugar-es5.js b/test/OLD/node/default/sugar-es5.js similarity index 100% rename from test/node/default/sugar-es5.js rename to test/OLD/node/default/sugar-es5.js diff --git a/test/node/default/sugar-es6.js b/test/OLD/node/default/sugar-es6.js similarity index 100% rename from test/node/default/sugar-es6.js rename to test/OLD/node/default/sugar-es6.js diff --git a/test/node/default/sugar-function.js b/test/OLD/node/default/sugar-function.js similarity index 100% rename from test/node/default/sugar-function.js rename to test/OLD/node/default/sugar-function.js diff --git a/test/node/default/sugar-inflections.js b/test/OLD/node/default/sugar-inflections.js similarity index 100% rename from test/node/default/sugar-inflections.js rename to test/OLD/node/default/sugar-inflections.js diff --git a/test/node/default/sugar-language.js b/test/OLD/node/default/sugar-language.js similarity index 100% rename from test/node/default/sugar-language.js rename to test/OLD/node/default/sugar-language.js diff --git a/test/node/default/sugar-number.js b/test/OLD/node/default/sugar-number.js similarity index 100% rename from test/node/default/sugar-number.js rename to test/OLD/node/default/sugar-number.js diff --git a/test/node/default/sugar-object.js b/test/OLD/node/default/sugar-object.js similarity index 100% rename from test/node/default/sugar-object.js rename to test/OLD/node/default/sugar-object.js diff --git a/test/node/default/sugar-range.js b/test/OLD/node/default/sugar-range.js similarity index 100% rename from test/node/default/sugar-range.js rename to test/OLD/node/default/sugar-range.js diff --git a/test/node/default/sugar-regexp.js b/test/OLD/node/default/sugar-regexp.js similarity index 100% rename from test/node/default/sugar-regexp.js rename to test/OLD/node/default/sugar-regexp.js diff --git a/test/node/default/sugar-string.js b/test/OLD/node/default/sugar-string.js similarity index 100% rename from test/node/default/sugar-string.js rename to test/OLD/node/default/sugar-string.js diff --git a/test/node/default/sugar.js b/test/OLD/node/default/sugar.js similarity index 100% rename from test/node/default/sugar.js rename to test/OLD/node/default/sugar.js diff --git a/test/node/extended/dist.js b/test/OLD/node/extended/dist.js similarity index 100% rename from test/node/extended/dist.js rename to test/OLD/node/extended/dist.js diff --git a/test/node/extended/sugar-array.js b/test/OLD/node/extended/sugar-array.js similarity index 100% rename from test/node/extended/sugar-array.js rename to test/OLD/node/extended/sugar-array.js diff --git a/test/node/extended/sugar-date.js b/test/OLD/node/extended/sugar-date.js similarity index 100% rename from test/node/extended/sugar-date.js rename to test/OLD/node/extended/sugar-date.js diff --git a/test/node/extended/sugar-enumerable.js b/test/OLD/node/extended/sugar-enumerable.js similarity index 100% rename from test/node/extended/sugar-enumerable.js rename to test/OLD/node/extended/sugar-enumerable.js diff --git a/test/node/extended/sugar-function.js b/test/OLD/node/extended/sugar-function.js similarity index 100% rename from test/node/extended/sugar-function.js rename to test/OLD/node/extended/sugar-function.js diff --git a/test/node/extended/sugar-inflections.js b/test/OLD/node/extended/sugar-inflections.js similarity index 100% rename from test/node/extended/sugar-inflections.js rename to test/OLD/node/extended/sugar-inflections.js diff --git a/test/node/extended/sugar-language.js b/test/OLD/node/extended/sugar-language.js similarity index 100% rename from test/node/extended/sugar-language.js rename to test/OLD/node/extended/sugar-language.js diff --git a/test/node/extended/sugar-number.js b/test/OLD/node/extended/sugar-number.js similarity index 100% rename from test/node/extended/sugar-number.js rename to test/OLD/node/extended/sugar-number.js diff --git a/test/node/extended/sugar-object.js b/test/OLD/node/extended/sugar-object.js similarity index 100% rename from test/node/extended/sugar-object.js rename to test/OLD/node/extended/sugar-object.js diff --git a/test/node/extended/sugar-range.js b/test/OLD/node/extended/sugar-range.js similarity index 100% rename from test/node/extended/sugar-range.js rename to test/OLD/node/extended/sugar-range.js diff --git a/test/node/extended/sugar-regexp.js b/test/OLD/node/extended/sugar-regexp.js similarity index 100% rename from test/node/extended/sugar-regexp.js rename to test/OLD/node/extended/sugar-regexp.js diff --git a/test/node/extended/sugar-string.js b/test/OLD/node/extended/sugar-string.js similarity index 100% rename from test/node/extended/sugar-string.js rename to test/OLD/node/extended/sugar-string.js diff --git a/test/node/extended/sugar.js b/test/OLD/node/extended/sugar.js similarity index 100% rename from test/node/extended/sugar.js rename to test/OLD/node/extended/sugar.js diff --git a/test/node/index.js b/test/OLD/node/index.js similarity index 100% rename from test/node/index.js rename to test/OLD/node/index.js diff --git a/test/node/npm.js b/test/OLD/node/npm.js similarity index 100% rename from test/node/npm.js rename to test/OLD/node/npm.js diff --git a/test/node/setup.js b/test/OLD/node/setup.js similarity index 100% rename from test/node/setup.js rename to test/OLD/node/setup.js diff --git a/test/node/sugar.js b/test/OLD/node/sugar.js similarity index 100% rename from test/node/sugar.js rename to test/OLD/node/sugar.js diff --git a/test/rhino/sugar.js b/test/OLD/rhino/sugar.js similarity index 100% rename from test/rhino/sugar.js rename to test/OLD/rhino/sugar.js diff --git a/test/suite/helpers/array.js b/test/OLD/suite/helpers/array.js similarity index 100% rename from test/suite/helpers/array.js rename to test/OLD/suite/helpers/array.js diff --git a/test/suite/helpers/common.js b/test/OLD/suite/helpers/common.js similarity index 100% rename from test/suite/helpers/common.js rename to test/OLD/suite/helpers/common.js diff --git a/test/suite/helpers/core.js b/test/OLD/suite/helpers/core.js similarity index 100% rename from test/suite/helpers/core.js rename to test/OLD/suite/helpers/core.js diff --git a/test/suite/helpers/date.js b/test/OLD/suite/helpers/date.js similarity index 100% rename from test/suite/helpers/date.js rename to test/OLD/suite/helpers/date.js diff --git a/test/suite/helpers/object.js b/test/OLD/suite/helpers/object.js similarity index 100% rename from test/suite/helpers/object.js rename to test/OLD/suite/helpers/object.js diff --git a/test/suite/log.js b/test/OLD/suite/log.js similarity index 100% rename from test/suite/log.js rename to test/OLD/suite/log.js diff --git a/test/suite/overrides.js b/test/OLD/suite/overrides.js similarity index 100% rename from test/suite/overrides.js rename to test/OLD/suite/overrides.js diff --git a/test/suite/resets/b64.js b/test/OLD/suite/resets/b64.js similarity index 100% rename from test/suite/resets/b64.js rename to test/OLD/suite/resets/b64.js diff --git a/test/suite/resets/es5.js b/test/OLD/suite/resets/es5.js similarity index 100% rename from test/suite/resets/es5.js rename to test/OLD/suite/resets/es5.js diff --git a/test/suite/resets/es6.js b/test/OLD/suite/resets/es6.js similarity index 100% rename from test/suite/resets/es6.js rename to test/OLD/suite/resets/es6.js diff --git a/test/suite/resets/es7.js b/test/OLD/suite/resets/es7.js similarity index 100% rename from test/suite/resets/es7.js rename to test/OLD/suite/resets/es7.js diff --git a/test/suite/suite.js b/test/OLD/suite/suite.js similarity index 100% rename from test/suite/suite.js rename to test/OLD/suite/suite.js diff --git a/test/tests/array.js b/test/OLD/tests/array.js similarity index 100% rename from test/tests/array.js rename to test/OLD/tests/array.js diff --git a/test/OLD/tests/core.js b/test/OLD/tests/core.js new file mode 100644 index 000000000..c0d79d3cc --- /dev/null +++ b/test/OLD/tests/core.js @@ -0,0 +1,3 @@ +namespace('Core', function() { + 'use strict'; +}); diff --git a/test/tests/date.js b/test/OLD/tests/date.js similarity index 100% rename from test/tests/date.js rename to test/OLD/tests/date.js diff --git a/test/tests/dom.js b/test/OLD/tests/dom.js similarity index 100% rename from test/tests/dom.js rename to test/OLD/tests/dom.js diff --git a/test/tests/enumerable.js b/test/OLD/tests/enumerable.js similarity index 100% rename from test/tests/enumerable.js rename to test/OLD/tests/enumerable.js diff --git a/test/tests/equals.js b/test/OLD/tests/equals.js similarity index 100% rename from test/tests/equals.js rename to test/OLD/tests/equals.js diff --git a/test/tests/es5/array.js b/test/OLD/tests/es5/array.js similarity index 100% rename from test/tests/es5/array.js rename to test/OLD/tests/es5/array.js diff --git a/test/tests/es5/date.js b/test/OLD/tests/es5/date.js similarity index 100% rename from test/tests/es5/date.js rename to test/OLD/tests/es5/date.js diff --git a/test/tests/es5/function.js b/test/OLD/tests/es5/function.js similarity index 100% rename from test/tests/es5/function.js rename to test/OLD/tests/es5/function.js diff --git a/test/tests/es5/object.js b/test/OLD/tests/es5/object.js similarity index 100% rename from test/tests/es5/object.js rename to test/OLD/tests/es5/object.js diff --git a/test/tests/es5/string.js b/test/OLD/tests/es5/string.js similarity index 100% rename from test/tests/es5/string.js rename to test/OLD/tests/es5/string.js diff --git a/test/tests/es6/array.js b/test/OLD/tests/es6/array.js similarity index 100% rename from test/tests/es6/array.js rename to test/OLD/tests/es6/array.js diff --git a/test/tests/es6/number.js b/test/OLD/tests/es6/number.js similarity index 100% rename from test/tests/es6/number.js rename to test/OLD/tests/es6/number.js diff --git a/test/tests/es6/string.js b/test/OLD/tests/es6/string.js similarity index 100% rename from test/tests/es6/string.js rename to test/OLD/tests/es6/string.js diff --git a/test/tests/es7/array.js b/test/OLD/tests/es7/array.js similarity index 100% rename from test/tests/es7/array.js rename to test/OLD/tests/es7/array.js diff --git a/test/tests/function.js b/test/OLD/tests/function.js similarity index 100% rename from test/tests/function.js rename to test/OLD/tests/function.js diff --git a/test/tests/inflections.js b/test/OLD/tests/inflections.js similarity index 100% rename from test/tests/inflections.js rename to test/OLD/tests/inflections.js diff --git a/test/tests/language.js b/test/OLD/tests/language.js similarity index 100% rename from test/tests/language.js rename to test/OLD/tests/language.js diff --git a/test/tests/locales/ca.js b/test/OLD/tests/locales/ca.js similarity index 100% rename from test/tests/locales/ca.js rename to test/OLD/tests/locales/ca.js diff --git a/test/tests/locales/da.js b/test/OLD/tests/locales/da.js similarity index 100% rename from test/tests/locales/da.js rename to test/OLD/tests/locales/da.js diff --git a/test/tests/locales/de.js b/test/OLD/tests/locales/de.js similarity index 100% rename from test/tests/locales/de.js rename to test/OLD/tests/locales/de.js diff --git a/test/tests/locales/es.js b/test/OLD/tests/locales/es.js similarity index 100% rename from test/tests/locales/es.js rename to test/OLD/tests/locales/es.js diff --git a/test/tests/locales/fi.js b/test/OLD/tests/locales/fi.js similarity index 100% rename from test/tests/locales/fi.js rename to test/OLD/tests/locales/fi.js diff --git a/test/tests/locales/fr.js b/test/OLD/tests/locales/fr.js similarity index 100% rename from test/tests/locales/fr.js rename to test/OLD/tests/locales/fr.js diff --git a/test/tests/locales/it.js b/test/OLD/tests/locales/it.js similarity index 100% rename from test/tests/locales/it.js rename to test/OLD/tests/locales/it.js diff --git a/test/tests/locales/ja.js b/test/OLD/tests/locales/ja.js similarity index 100% rename from test/tests/locales/ja.js rename to test/OLD/tests/locales/ja.js diff --git a/test/tests/locales/ko.js b/test/OLD/tests/locales/ko.js similarity index 100% rename from test/tests/locales/ko.js rename to test/OLD/tests/locales/ko.js diff --git a/test/tests/locales/nl.js b/test/OLD/tests/locales/nl.js similarity index 100% rename from test/tests/locales/nl.js rename to test/OLD/tests/locales/nl.js diff --git a/test/tests/locales/no.js b/test/OLD/tests/locales/no.js similarity index 100% rename from test/tests/locales/no.js rename to test/OLD/tests/locales/no.js diff --git a/test/tests/locales/pl.js b/test/OLD/tests/locales/pl.js similarity index 100% rename from test/tests/locales/pl.js rename to test/OLD/tests/locales/pl.js diff --git a/test/tests/locales/pt.js b/test/OLD/tests/locales/pt.js similarity index 100% rename from test/tests/locales/pt.js rename to test/OLD/tests/locales/pt.js diff --git a/test/tests/locales/ru.js b/test/OLD/tests/locales/ru.js similarity index 100% rename from test/tests/locales/ru.js rename to test/OLD/tests/locales/ru.js diff --git a/test/tests/locales/sv.js b/test/OLD/tests/locales/sv.js similarity index 100% rename from test/tests/locales/sv.js rename to test/OLD/tests/locales/sv.js diff --git a/test/tests/locales/zh-CN.js b/test/OLD/tests/locales/zh-CN.js similarity index 100% rename from test/tests/locales/zh-CN.js rename to test/OLD/tests/locales/zh-CN.js diff --git a/test/tests/locales/zh-TW.js b/test/OLD/tests/locales/zh-TW.js similarity index 100% rename from test/tests/locales/zh-TW.js rename to test/OLD/tests/locales/zh-TW.js diff --git a/test/OLD/tests/number.js b/test/OLD/tests/number.js new file mode 100644 index 000000000..8f3f2a334 --- /dev/null +++ b/test/OLD/tests/number.js @@ -0,0 +1,1093 @@ +namespace('Number', function () { + 'use strict'; + + group('Options', function() { + equal(Sugar.Number.getOption('thousands'), ',', 'Thousands should be comma by default'); + equal(Sugar.Number.getOption('decimal'), '.', 'Decimal should be dot by default'); + }); + + method('random', function() { + var rand; + + rand = run(Number); + equal(rand == 0 || rand == 1, true, 'no params = 0 or 1'); + + rand = run(Number, 'random', [10]); + equal(rand >= 0 && rand <= 10, true, 'min not defined, max is 10'); + equal(rand % 1, 0, 'number is whole'); + + rand = run(Number, 'random', [536224, 536280]); + equal(rand >= 536224 && rand <= 536280, true, 'min and max defined'); + + rand = run(Number, 'random', [6, -5]); + equal(rand >= -5 && rand <= 6, true, 'min and max can be reversed'); + + test(Number, [0, 0], 0, '0 should always remain 0'); + test(Number, [0, 0], 0, '0 should always remain 0'); + test(Number, [0, 0], 0, '0 should always remain 0'); + test(Number, [0, 0], 0, '0 should always remain 0'); + test(Number, [0, 0], 0, '0 should always remain 0'); + test(Number, [0, 0], 0, '0 should always remain 0'); + }); + + method('toNumber', function() { + test(4, 4, '4 is 4'); + test(10000, 10000, '10000 is 10000'); + test(5.2345, 5.2345, '5.2345 is 5.2345'); + }); + + method('ceil', function() { + test(5.5, 6, '5.5'); + test(5.14, 6, '5.14'); + test(5, 5, '5'); + test(-5.5, -5, '-5.5'); + test(-5.14, -5, '-5.14'); + test(-5, -5, '-5'); + test(4417.1318, [0], 4418, '0'); + test(4417.1318, [1], 4417.2, '1'); + test(4417.1318, [2], 4417.14, '2'); + test(4417.1318, [3], 4417.132, '3'); + test(4417.1318, [-1], 4420, '-1'); + test(4417.1318, [-2], 4500, '-2'); + test(4417.1318, [-3], 5000, '-3'); + }); + + method('floor', function() { + test(5.5, 5, '5.5'); + test(5.14, 5, '5.14'); + test(5.9, 5, '5.9'); + test(5, 5, '5'); + test(-5.5, -6, '-5.5'); + test(-5.14, -6, '-5.14'); + test(-5, -5, '-5'); + test(4417.1318, [0], 4417, '0'); + test(4417.1318, [1], 4417.1, '1'); + test(4417.1318, [2], 4417.13, '2'); + test(4417.1318, [3], 4417.131, '3'); + test(4417.1318, [-1], 4410, '-1'); + test(4417.1318, [-2], 4400, '-2'); + test(4417.1318, [-3], 4000, '-3'); + }); + + method('abs', function() { + test(-5, 5, '-5'); + test(5, 5, '5'); + test(-3.324, 3.324, '-3.324'); + test(3.324, 3.324, '3.324'); + }); + + method('pow', function() { + test(3, [2], 9, '3 ^ 2'); + test(3, [1], 3, '3 ^ 1'); + test(12, [2], 144, '12 ^ 2'); + test(3, [3], 27, '3 ^ 3'); + test(3, [0], 1, 'zero is allowed'); + test(3, NaN, 'defaults to no number'); + }); + + method('sin', function() { + // A recent change in the V8 engine now produces less accurate values for + // trigonomic functions in Chrome: https://code.google.com/p/v8/issues/detail?id=3006 + // This issue is flagged for landing in M35. + equalWithMargin(run(1, 'sin'), 0.8414709848078965, 0.000000000000001); + test(0, 0); + test(Math.PI/2, 1); + }); + + method('cos', function() { + test(0, 1); + test(Math.PI, -1, 'PI'); + test(Math.PI*2, 1, 'PI*2'); + }); + + method('tan', function() { + test(0, 0); + // See above + equalWithMargin(run(45, 'tan'), 1.6197751905438615, 0.000000000000001); + equalWithMargin(run(90, 'tan'), -1.995200412208242, 0.000000000000001); + }); + + method('asin', function() { + test(0, 0); + test(1, Math.PI/2, '1 is PI/2'); + }); + + method('acos', function() { + test(0, Math.PI/2, '0 is PI/2'); + test(1, 0); + }); + + method('atan', function() { + test(0, 0); + test(45, 1.5485777614681775); + }); + + method('log', function() { + test(64, [2], 6, '64 with base 2'); + equalWithMargin(run(9, 'log', [3]), 2, 0.000000000000001, '9 with base 3'); + test(5, 1.6094379124341003, '5'); + test(Math.E, 1, 'E'); + }); + + method('exp', function() { + equalWithMargin(run(1, 'exp', []), Math.E, 0.000000000000001); + test(0, 1); + }); + + method('sqrt', function() { + test(9, 3); + test(1024, 32); + }); + + method('round', function() { + test(3, 3); + test(3.241, 3); + test(3.752, 4); + test(-3.241, -3); + test(-3.752, -4); + test(3.241, [1], 3.2, '3.241 to 1 place'); + + test(3.752, [1], 3.8, '3.752 to 1 place'); + test(3.241, [2], 3.24, '3.241 to 2 places'); + test(3.752, [2], 3.75, '3.752 to 2 places'); + + test(322855.241, [-2], 322900, '322855.241 to -2 places'); + test(322855.241, [-3], 323000, '322855.241 to -3 places'); + test(322855.241, [-4], 320000, '322855.241 to -4 places'); + test(322855.241, [-6], 0, '322855.241 to -6 places'); + test(722855.241, [-6], 1000000, '722855.241 to -6 places'); + test(722855.241, [-8], 0, '722855.241 to -8 places'); + }); + + method('chr', function() { + test(65, 'A'); + test(24536, '忘'); + test(20294, '但'); + }); + + method('times', function() { + var count = 0; + var callback = function(first) { + equal(first, count, 'first parameter is the index'); + count++; + return count; + }; + var result = run(5, 'times', [callback]); + equal(result, [1,2,3,4,5], 'result should be the collected return values'); + equal(count, 5, 'iterated 5 times'); + + var fn = function() {}; + var result = run(3, 'times', [fn]); + equal(result, undefined, 'Returning undefined should return nothing'); + + var fn = function(i) { + return i || undefined; + }; + var result = run(3, 'times', [fn]); + equal(result, [1, 2], 'Mixed return values only collects non-undefined'); + + raisesError(function() { run(5, 'times', []); }, 'no callback raises error', TypeError); + }); + + method('isMultipleOf', function() { + test(2, [2], true, '2 is a multiple of 2'); + test(6, [2], true, '6 is a multiple of 2'); + test(100, [2], true, '100 is a multiple of 2'); + test(2, [100], false, '2 is a multiple of 100'); + test(100, [-2], true, '100 is a multiple of -2'); + test(6, [-2], true, '6 is a multiple of -2'); + test(6, [3], true, '6 is a multiple of 3'); + test(7, [3], false, '7 is a multiple of 3'); + test(2.5, [1.25], true, '2.5 is a multiple of 1.25'); + test(2, ['a'], false, 'string arguments'); + test(2, [/af/], false, 'other random arguments'); + test(2, [null], false, 'null'); + test(2, false, 'no argument passed'); + }); + + method('isOdd', function() { + test(0, false); + test(1, true); + test(2, false); + test(24, false); + test(200, false); + test(1.1, false); + test(NaN, false); + test(Infinity, false); + test(-Infinity, false); + }); + + method('isEven', function() { + test(0, true); + test(1, false); + test(2, true); + test(24, true); + test(200, true); + test(1.1, false); + test(NaN, false); + test(Infinity, false); + test(-Infinity, false); + }); + + method('ordinalize', function() { + test(0, '0th'); + test(1, '1st'); + test(2, '2nd'); + test(3, '3rd'); + test(4, '4th'); + test(5, '5th'); + test(6, '6th'); + test(7, '7th'); + test(8, '8th'); + test(9, '9th'); + test(10, '10th'); + test(11, '11th'); + test(12, '12th'); + test(13, '13th'); + test(14, '14th'); + test(15, '15th'); + test(20, '20th'); + test(21, '21st'); + test(22, '22nd'); + test(23, '23rd'); + test(24, '24th'); + test(25, '25th'); + test(100, '100th'); + test(101, '101st'); + test(102, '102nd'); + test(103, '103rd'); + test(104, '104th'); + test(105, '105th'); + test(111, '111th'); + test(112, '112th'); + test(113, '113th'); + test(114, '114th'); + test(-1, '-1st'); + + var OrdinalNumbers = { + "-1" : "-1st", + "-2" : "-2nd", + "-3" : "-3rd", + "-4" : "-4th", + "-5" : "-5th", + "-6" : "-6th", + "-7" : "-7th", + "-8" : "-8th", + "-9" : "-9th", + "-10" : "-10th", + "-11" : "-11th", + "-12" : "-12th", + "-13" : "-13th", + "-14" : "-14th", + "-20" : "-20th", + "-21" : "-21st", + "-22" : "-22nd", + "-23" : "-23rd", + "-24" : "-24th", + "-100" : "-100th", + "-101" : "-101st", + "-102" : "-102nd", + "-103" : "-103rd", + "-104" : "-104th", + "-110" : "-110th", + "-111" : "-111th", + "-112" : "-112th", + "-113" : "-113th", + "-1000" : "-1000th", + "-1001" : "-1001st", + "0" : "0th", + "1" : "1st", + "2" : "2nd", + "3" : "3rd", + "4" : "4th", + "5" : "5th", + "6" : "6th", + "7" : "7th", + "8" : "8th", + "9" : "9th", + "10" : "10th", + "11" : "11th", + "12" : "12th", + "13" : "13th", + "14" : "14th", + "20" : "20th", + "21" : "21st", + "22" : "22nd", + "23" : "23rd", + "24" : "24th", + "100" : "100th", + "101" : "101st", + "102" : "102nd", + "103" : "103rd", + "104" : "104th", + "110" : "110th", + "111" : "111th", + "112" : "112th", + "113" : "113th", + "1000" : "1000th", + "1001" : "1001st" + } + + testIterateOverObject(OrdinalNumbers, function(str, ordinalized) { + test(+str, ordinalized); + }); + + }); + + method('format', function() { + + test(100, '100'); + test(1, '1'); + test(10, '10'); + test(100, '100'); + test(1000, '1,000'); + test(10000, '10,000'); + test(100000, '100,000'); + test(1000000, '1,000,000'); + test(1000000.01, '1,000,000.01'); + test(-100, '-100'); + test(-1, '-1'); + test(-1000, '-1,000'); + test(-1000000.01, '-1,000,000.01'); + test(0.52, '0.52'); + test(9999999.99, '9,999,999.99'); + + // These discrepancies are due to floating point variable limitations. + equal(run(100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '100,046,546,510,000'); + equal(run(-100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '-100,046,546,510,000'); + + Sugar.Number.setOption('thousands', ' '); + Sugar.Number.setOption('decimal', ','); + test(1000, [null, ' '], '1 000', 'with space'); + test(1532587, [null, ' '], '1 532 587', 'larget with space'); + test(1532587.5752, [null, ' ', ','], '1 532 587,5752', 'larger number with decimal'); + + Sugar.Number.setOption('thousands', '.'); + Sugar.Number.setOption('decimal', ','); + test(9999999.99, [null, '.',','], '9.999.999,99', 'Euro style!'); + + Sugar.Number.setOption('thousands', ''); + Sugar.Number.setOption('decimal', '.'); + test(9999999.99, [null, ''], '9999999.99', 'empty string'); + + Sugar.Number.setOption('thousands', ''); + Sugar.Number.setOption('decimal', ''); + test(9999999.99, [null, '', ''], '999999999', 'no punctuation'); + + Sugar.Number.setOption('thousands', null); + Sugar.Number.setOption('decimal', null); + test(9999999.99, [null, '', ''], '9,999,999.99', 'null returns to defaults'); + + withArgs([2], function() { + test(1, '1.00'); + test(10, '10.00'); + test(100, '100.00'); + test(1000, '1,000.00'); + test(10000, '10,000.00'); + test(100000, '100,000.00'); + test(1000000, '1,000,000.00'); + + test(-1, '-1.00'); + test(-10, '-10.00'); + test(-100, '-100.00'); + test(-1000, '-1,000.00'); + test(-10000, '-10,000.00'); + test(-100000, '-100,000.00'); + test(-1000000, '-1,000,000.00'); + + test(2.435, '2.44'); + }); + + withArgs([4], function() { + test(1, '1.0000'); + test(10, '10.0000'); + test(100, '100.0000'); + test(1000, '1,000.0000'); + test(10000, '10,000.0000'); + test(100000, '100,000.0000'); + test(1000000, '1,000,000.0000'); + test(-1, '-1.0000'); + test(-10, '-10.0000'); + test(-100, '-100.0000'); + test(-1000, '-1,000.0000'); + test(-10000, '-10,000.0000'); + test(-100000, '-100,000.0000'); + test(-1000000, '-1,000,000.0000'); + }); + + test(553599.435, [2], '553,599.44', 'to 2 places'); + test(553599.435, [1], '553,599.4', 'to 1 place'); + test(553599.435, [0], '553,599', 'to 0 places'); + test(553599.435, [-1], '553,600', 'to -1 places'); + test(553599.435, [-2], '553,600', 'to -2 places'); + test(553599.435, [-3], '554,000', 'to -3 places'); + test(553599.435, [-4], '550,000', 'to -4 places'); + test(553599.435, [-5], '600,000', 'to -5 places'); + + // Testing object form + Sugar.Number.setOption({ + thousands: 'y' + }); + test(1000, [null, ' '], '1y000', 'y as separator'); + Sugar.Number.setOption({ + thousands: null + }); + + }); + + method('pad', function() { + test(1, [0], '1', '1 no padding'); + test(1, [1], '1', '1 padded to 1 place'); + test(1, [2], '01', '1 padded to 2 places'); + test(1, [3], '001', '1 padded to 3 places'); + test(1, [4], '0001', '1 padded to 4 places'); + test(547, [0], '547', '547 no padding'); + test(547, [1], '547', '547 padded to 1 place'); + test(547, [2], '547', '547 padded to 2 places'); + test(547, [3], '547', '547 padded to 3 places'); + test(547, [4], '0547', '547 padded to 4 places'); + test(0, [0], '0', '0 no padding'); + test(0, [1], '0', '0 padded to 1 place'); + test(0, [2], '00', '0 padded to 2 places'); + test(0, [3], '000', '0 padded to 3 places'); + test(0, [4], '0000', '0 padded to 4 places'); + test(-1, [1], '-1', '-1 padded to 1 places'); + test(-1, [2], '-01', '-1 padded to 2 places'); + test(-1, [3], '-001', '-1 padded to 3 places'); + test(-1, [4], '-0001', '-1 padded to 4 places'); + test(1, [1, true], '+1', '1 padded to 1 places and sign'); + test(1, [2, true], '+01', '1 padded to 2 places and sign'); + test(1, [3, true], '+001', '1 padded to 3 places and sign'); + test(1, [4, true], '+0001', '1 padded to 4 places and sign'); + test(0, [1, true], '+0', '0 padded to 1 place and sign'); + test(547.528, [4], '0547.528', 'does not take decimal places into account'); + + test(255, [4, false, 16], '00ff', 'handles hex'); + test(2, [4, false, 2], '0010', 'handles binary'); + }); + + method('hex', function() { + test(0, '0'); + test(10, 'a'); + test(255, 'ff'); + test(0.5, '0.8'); + test(2.5, '2.8'); + test(2553423, '26f64f'); + + withArgs([2], function() { + test(0, '00'); + test(10, '0a'); + test(255, 'ff'); + test(0.5, '00.8'); + test(2.5, '02.8'); + }); + + withArgs([4], function() { + test(0, '0000'); + test(10, '000a'); + test(255, '00ff'); + test(0.5, '0000.8'); + test(2.5, '0002.8'); + }); + }); + + method('isInteger', function() { + test(15, true); + test(15.2, false); + test(15.2668, false); + test(15.0, true); + test('15', true); + test('15.8', false); + }); + + method('abbr', function() { + test(1, '1'); + test(10, '10'); + test(100, '100'); + test(1000, '1k'); + test(10000, '10k'); + test(100000, '100k'); + test(1000000, '1m'); + test(10000000, '10m'); + test(100000000, '100m'); + test(1000000000, '1b'); + test(10000000000, '10b'); + test(100000000000, '100b'); + test(1000000000000, '1t'); + test(1000000000000000000, '1,000,000t'); + + test(1, '1'); + test(12, '12'); + test(124, '124'); + test(1249, '1k'); + test(1749, '2k'); + test(12495, '12k'); + test(17495, '17k'); + test(124958, '125k'); + test(174958, '175k'); + test(1249584, '1m'); + test(1749584, '2m'); + + withArgs([1], function() { + test(1, '1', 'decimal 1 place | 1'); + test(12, '12', 'decimal 1 place | 12'); + test(124, '124', 'decimal 1 place | 124'); + test(1249, '1.2k', 'decimal 1 place | 1,249'); + test(1749, '1.7k', 'decimal 1 place | 1,749'); + test(12495, '12.5k', 'decimal 1 place | 12,495'); + test(17495, '17.5k', 'decimal 1 place | 17,495'); + test(124958, '125k', 'decimal 1 place | 124,958'); + test(174958, '175k', 'decimal 1 place | 174,958'); + test(1249584, '1.2m', 'decimal 1 place | 1,249,584'); + test(1749584, '1.7m', 'decimal 1 place | 1,749,584'); + }); + + withArgs([2], function() { + test(1, '1', 'decimal 2 places | 1'); + test(12, '12', 'decimal 2 places | 12'); + test(124, '124', 'decimal 2 places | 124'); + test(1249, '1.25k', 'decimal 2 places | 1,249'); + test(1749, '1.75k', 'decimal 2 places | 1,749'); + test(12495, '12.5k', 'decimal 2 places | 12,495'); + test(17495, '17.5k', 'decimal 2 places | 17,495'); + test(124958, '124.96k', 'decimal 2 places | 124,958'); + test(174958, '174.96k', 'decimal 2 places | 174,958'); + test(1249584, '1.25m', 'decimal 2 places | 1,249,584'); + test(1749584, '1.75m', 'decimal 2 places | 1,749,584'); + }); + + withArgs([3], function() { + test(1, '1', 'decimal 3 places | 1'); + test(12, '12', 'decimal 3 places | 12'); + test(124, '124', 'decimal 3 places | 124'); + test(1249, '1.249k', 'decimal 3 places | 1,249'); + test(1749, '1.749k', 'decimal 3 places | 1,749'); + test(12495, '12.495k', 'decimal 3 places | 12,495'); + test(17495, '17.495k', 'decimal 3 places | 17,495'); + test(124958, '124.958k', 'decimal 3 places | 124,958'); + test(174958, '174.958k', 'decimal 3 places | 174,958'); + test(1249584, '1.25m', 'decimal 3 places | 1,249,584'); + test(1749584, '1.75m', 'decimal 3 places | 1,749,584'); + + // Issue #422 + Sugar.Number.setOption('decimal', ','); + test(1749584, '1,75m', 'should respect global decimal marker'); + Sugar.Number.setOption('decimal', null); + }); + + withArgs([-1], function() { + test(1, '0', 'decimal -1 places | 1'); + test(12, '10', 'decimal -1 places | 12'); + test(124, '120', 'decimal -1 places | 124'); + test(1249, '0k', 'decimal -1 places | 1,249'); + test(1749, '0k', 'decimal -1 places | 1,749'); + test(12495, '10k', 'decimal -1 places | 12,495'); + test(17495, '20k', 'decimal -1 places | 17,495'); + test(124958, '120k', 'decimal -1 places | 124,958'); + test(174958, '170k', 'decimal -1 places | 174,958'); + test(1249584, '0m', 'decimal -1 places | 1,249,584'); + test(1749584, '0m', 'decimal -1 places | 1,749,584'); + }); + + test(0.1, '0', '0.1'); + test(0.01, '0', '0.01'); + test(0.001, '0', '0.001'); + test(0.0001, '0', '0.00001'); + test(0.00001, '0', '0.000001'); + test(0.000001, '0', '0.0000001'); + test(0.0000001, '0', '0.00000001'); + test(0.00000001, '0', '0.000000001'); + + test(1.1, '1', '1.1'); + test(1.01, '1', '1.01'); + test(1.001, '1', '1.001'); + test(1.0001, '1', '1.00001'); + test(1.00001, '1', '1.000001'); + test(1.000001, '1', '1.0000001'); + test(1.0000001, '1', '1.00000001'); + test(1.00000001, '1', '1.000000001'); + + test(1000.004, '1k', '1000.004'); + test(10000.004, '10k', '10,000.004'); + test(100000.004, '100k', '100,000.004'); + test(1000000.004, '1m', '1,000,000.004'); + + withArgs([2], function() { + test(1000.004, '1k', '2 places | 1000.004'); + test(10000.004, '10k', '2 places | 10,000.004'); + test(100000.004, '100k', '2 places | 100,000.004'); + test(1000000.004, '1m', '2 places | 1,000,000.004'); + }); + }); + + method('metric', function() { + + test(1, '1'); + test(10, '10'); + test(100, '100'); + test(1000, '1k'); + test(10000, '10k'); + test(100000, '100k'); + test(1000000, '1,000k'); + test(10000000, '10,000k'); + test(100000000, '100,000k'); + test(1000000000, '1,000,000k'); + test(10000000000, '10,000,000k'); + test(100000000000, '100,000,000k'); + test(1000000000000, '1,000,000,000k'); + test(10000000000000, '10,000,000,000k'); + test(100000000000000, '100,000,000,000k'); + test(1000000000000000, '1,000,000,000,000k'); + test(10000000000000000, '10,000,000,000,000k'); + test(100000000000000000, '100,000,000,000,000k'); + + test(1, '1', 'decimal | 1'); + test(12, '12', 'decimal | 12'); + test(124, '124', 'decimal | 124'); + test(1249, '1k', 'decimal | 1,249'); + test(1749, '2k', 'decimal | 1,749'); + test(12495, '12k', 'decimal | 12,495'); + test(17495, '17k', 'decimal | 17,495'); + test(124958, '125k', 'decimal | 124,958'); + test(174958, '175k', 'decimal | 174,958'); + test(1249584, '1,250k', 'decimal | 1,249,584'); + test(1749584, '1,750k', 'decimal | 1,749,584'); + test(1249584000, '1,249,584k', 'decimal | 1,249,584,000'); + test(1749584000, '1,749,584k', 'decimal | 1,749,584,000'); + + test(0.1000000000000, '100m', 'fractional | 0.1'); + test(0.0100000000000, '10m', 'fractional | 0.01'); + test(0.0010000000000, '1m', 'fractional | 0.001'); + test(0.0001000000000, '100μ', 'fractional | 0.0001'); + test(0.0000100000000, '10μ', 'fractional | 0.00001'); + test(0.0000010000000, '1μ', 'fractional | 0.000001'); + test(0.0000001000000, '100n', 'fractional | 0.0000001'); + test(0.0000000100000, '10n', 'fractional | 0.00000001'); + test(0.0000000010000, '1n', 'fractional | 0.000000001'); + test(0.0000000001000, '0.1n', 'fractional | 0.0000000001'); + test(0.0000000000100, '0.01n', 'fractional | 0.00000000001'); + test(0.0000000000010, '0.001n', 'fractional | 0.000000000001'); + test(0.0000000000001, '0.0001n', 'fractional | 0.0000000000001'); + + test(0.1111111111111, '111m', 'fractional | 0 places | 0.1111111111111'); + test(0.0111111111111, '11m', 'fractional | 0 places | 0.0111111111111'); + test(0.0011111111111, '1m', 'fractional | 0 places | 0.0011111111111'); + test(0.0001111111111, '111μ', 'fractional | 0 places | 0.0001111111111'); + test(0.0000111111111, '11μ', 'fractional | 0 places | 0.0000111111111'); + test(0.0000011111111, '1μ', 'fractional | 0 places | 0.0000011111111'); + test(0.0000001111111, '111n', 'fractional | 0 places | 0.0000001111111'); + test(0.0000000111111, '11n', 'fractional | 0 places | 0.0000000111111'); + test(0.0000000011111, '1n', 'fractional | 0 places | 0.0000000011111'); + test(0.0000000001111, '0.1n', 'fractional | 0 places | 0.0000000001111'); + test(0.0000000000111, '0.01n', 'fractional | 0 places | 0.0000000000111'); + test(0.0000000000011, '0.001n', 'fractional | 0 places | 0.0000000000011'); + test(0.0000000000001, '0.0001n', 'fractional | 0 places | 0.0000000000001'); + + test(0.000000000000000001, '1e-9n', 'fractional | 0 places | 0.0000000000001'); + + test(1.1111111111111, '1', 'fractional | 0 places | 1.1111111111111'); + test(1.0111111111111, '1', 'fractional | 0 places | 1.0111111111111'); + test(1.0011111111111, '1', 'fractional | 0 places | 1.0011111111111'); + test(1.0001111111111, '1', 'fractional | 0 places | 1.0001111111111'); + test(1.0000111111111, '1', 'fractional | 0 places | 1.0000111111111'); + test(1.0000011111111, '1', 'fractional | 0 places | 1.0000011111111'); + test(1.0000001111111, '1', 'fractional | 0 places | 1.0000001111111'); + test(1.0000000111111, '1', 'fractional | 0 places | 1.0000000111111'); + test(1.0000000011111, '1', 'fractional | 0 places | 1.0000000011111'); + test(1.0000000001111, '1', 'fractional | 0 places | 1.0000000001111'); + test(1.0000000000111, '1', 'fractional | 0 places | 1.0000000000111'); + test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); + + test(1.1000000000001, '1', 'fractional | 0 places | 1.1000000000001'); + test(1.0100000000001, '1', 'fractional | 0 places | 1.0100000000001'); + test(1.0010000000001, '1', 'fractional | 0 places | 1.0010000000001'); + test(1.0001000000001, '1', 'fractional | 0 places | 1.0001000000001'); + test(1.0000100000001, '1', 'fractional | 0 places | 1.0000100000001'); + test(1.0000010000001, '1', 'fractional | 0 places | 1.0000010000001'); + test(1.0000001000001, '1', 'fractional | 0 places | 1.0000001000001'); + test(1.0000000100001, '1', 'fractional | 0 places | 1.0000000100001'); + test(1.0000000010001, '1', 'fractional | 0 places | 1.0000000010001'); + test(1.0000000001001, '1', 'fractional | 0 places | 1.0000000001001'); + test(1.0000000000101, '1', 'fractional | 0 places | 1.0000000000101'); + test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); + + withArgs([0, 'all'], function() { + test(10000000, '10M'); + test(100000000, '100M'); + test(1000000000, '1G'); + test(10000000000, '10G'); + test(100000000000, '100G'); + test(1000000000000, '1T'); + test(10000000000000, '10T'); + test(100000000000000, '100T'); + test(1000000000000000, '1P'); + test(10000000000000000, '10P'); + test(100000000000000000, '100P'); + + test(1, '1', 'decimal | 1'); + test(12, '12', 'decimal | 12'); + test(124, '124', 'decimal | 124'); + test(1249, '1K', 'decimal | 1,249'); + test(1749, '2K', 'decimal | 1,749'); + test(12495, '12K', 'decimal | 12,495'); + test(17495, '17K', 'decimal | 17,495'); + test(124958, '125K', 'decimal | 124,958'); + test(174958, '175K', 'decimal | 174,958'); + test(1249584, '1M', 'decimal | 1,249,584'); + test(1749584, '2M', 'decimal | 1,749,584'); + test(1249584000, '1G', 'decimal | 1,249,584,000'); + test(1749584000, '2G', 'decimal | 1,749,584,000'); + }); + + withArgs([1], function() { + test(1, '1', 'decimal 1 place | 1'); + test(12, '12', 'decimal 1 place | 12'); + test(124, '124', 'decimal 1 place | 124'); + test(1249, '1.2k', 'decimal 1 place | 1,249'); + test(1749, '1.7k', 'decimal 1 place | 1,749'); + test(12495, '12.5k', 'decimal 1 place | 12,495'); + test(17495, '17.5k', 'decimal 1 place | 17,495'); + test(124958, '125k', 'decimal 1 place | 124,958'); + test(174958, '175k', 'decimal 1 place | 174,958'); + test(1249584, '1,249.6k', 'decimal 1 place | 1,249,584'); + + // Issue #422 + Sugar.Number.setOption('decimal', ','); + test(3232, [1], '3,2k', 'should respect global decimal marker'); + Sugar.Number.setOption('decimal', null); + }); + + withArgs([1, 'all'], function() { + test(1, '1', 'decimal 1 place | 1'); + test(12, '12', 'decimal 1 place | 12'); + test(124, '124', 'decimal 1 place | 124'); + test(1249, '1.2K', 'decimal 1 place | 1,249'); + test(1749, '1.7K', 'decimal 1 place | 1,749'); + test(12495, '12.5K', 'decimal 1 place | 12,495'); + test(17495, '17.5K', 'decimal 1 place | 17,495'); + test(124958, '125K', 'decimal 1 place | 124,958'); + test(174958, '175K', 'decimal 1 place | 174,958'); + test(1249584, '1.2M', 'decimal 1 place | 1,249,584'); + test(1749584, '1.7M', 'decimal 1 place | 1,749,584'); + test(1249584000, '1.2G', 'decimal 1 place | 1,249,584,000'); + test(1749584000, '1.7G', 'decimal 1 place | 1,749,584,000'); + }); + + withArgs([2], function() { + test(1, '1', 'decimal 2 places | 1'); + test(12, '12', 'decimal 2 places | 12'); + test(124, '124', 'decimal 2 places | 124'); + test(1249, '1.25k', 'decimal 2 places | 1,249'); + test(1749, '1.75k', 'decimal 2 places | 1,749'); + test(12495, '12.5k', 'decimal 2 places | 12,495'); + test(17495, '17.5k', 'decimal 2 places | 17,495'); + test(124958, '124.96k', 'decimal 2 places | 124,958'); + test(174958, '174.96k', 'decimal 2 places | 174,958'); + test(1249584, '1,249.58k', 'decimal 2 places | 1,249,584'); + }); + + withArgs([2, 'all'], function() { + test(1, '1', 'decimal 2 places | 1'); + test(12, '12', 'decimal 2 places | 12'); + test(124, '124', 'decimal 2 places | 124'); + test(1249, '1.25K', 'decimal 2 places | 1,249'); + test(1749, '1.75K', 'decimal 2 places | 1,749'); + test(12495, '12.5K', 'decimal 2 places | 12,495'); + test(17495, '17.5K', 'decimal 2 places | 17,495'); + test(124958, '124.96K', 'decimal 2 places | 124,958'); + test(174958, '174.96K', 'decimal 2 places | 174,958'); + test(1249584, '1.25M', 'decimal 2 places | 1,249,584'); + test(1749584, '1.75M', 'decimal 2 places | 1,749,584'); + test(1249584000, '1.25G', 'decimal 2 places | 1,249,584,000'); + test(1749584000, '1.75G', 'decimal 2 places | 1,749,584,000'); + }); + + withArgs([3], function() { + test(1, '1', 'decimal 3 places | 1'); + test(12, '12', 'decimal 3 places | 12'); + test(124, '124', 'decimal 3 places | 124'); + test(1249, '1.249k', 'decimal 3 places | 1,249'); + test(1749, '1.749k', 'decimal 3 places | 1,749'); + test(12495, '12.495k', 'decimal 3 places | 12,495'); + test(17495, '17.495k', 'decimal 3 places | 17,495'); + test(124958, '124.958k', 'decimal 3 places | 124,958'); + test(174958, '174.958k', 'decimal 3 places | 174,958'); + test(1249584, '1,249.584k', 'decimal 3 places | 1,249,584'); + }); + + withArgs([3, 'all'], function() { + test(1, '1', 'decimal 3 places | 1'); + test(12, '12', 'decimal 3 places | 12'); + test(124, '124', 'decimal 3 places | 124'); + test(1249, '1.249K', 'decimal 3 places | 1,249'); + test(1749, '1.749K', 'decimal 3 places | 1,749'); + test(12495, '12.495K', 'decimal 3 places | 12,495'); + test(17495, '17.495K', 'decimal 3 places | 17,495'); + test(124958, '124.958K', 'decimal 3 places | 124,958'); + test(174958, '174.958K', 'decimal 3 places | 174,958'); + test(1249584, '1.25M', 'decimal 3 places | 1,249,584'); + test(1749584, '1.75M', 'decimal 3 places | 1,749,584'); + test(1249584000, '1.25G', 'decimal 3 places | 1,249,584,000'); + test(1749584000, '1.75G', 'decimal 3 places | 1,749,584,000'); + }); + + withArgs([-1], function() { + test(1, '0', 'decimal -1 places | 1'); + test(12, '10', 'decimal -1 places | 12'); + test(124, '120', 'decimal -1 places | 124'); + test(1249, '0k', 'decimal -1 places | 1,249'); + test(1749, '0k', 'decimal -1 places | 1,749'); + test(12495, '10k', 'decimal -1 places | 12,495'); + test(17495, '20k', 'decimal -1 places | 17,495'); + test(124958, '120k', 'decimal -1 places | 124,958'); + test(174958, '170k', 'decimal -1 places | 174,958'); + test(1249584, '1,250k', 'decimal -1 places | 1,249,584'); + }); + + withArgs([-1, 'all'], function() { + test(1, '0', 'decimal -1 places | 1'); + test(12, '10', 'decimal -1 places | 12'); + test(124, '120', 'decimal -1 places | 124'); + test(1249, '0K', 'decimal -1 places | 1,249'); + test(1749, '0K', 'decimal -1 places | 1,749'); + test(12495, '10K', 'decimal -1 places | 12,495'); + test(17495, '20K', 'decimal -1 places | 17,495'); + test(124958, '120K', 'decimal -1 places | 124,958'); + test(174958, '170K', 'decimal -1 places | 174,958'); + test(1249584, '0M', 'decimal -1 places | 1,249,584'); + test(1749584, '0M', 'decimal -1 places | 1,749,584'); + test(1249584000, '0G', 'decimal -1 places | 1,249,584,000'); + test(1749584000, '0G', 'decimal -1 places | 1,749,584,000'); + }); + + withArgs([2], function() { + test(0.1111111111111, '111.11m', 'fractional | 2 places | 0.1111111111111'); + test(0.0111111111111, '11.11m', 'fractional | 2 places | 0.0111111111111'); + test(0.0011111111111, '1.11m', 'fractional | 2 places | 0.0011111111111'); + test(0.0001111111111, '111.11μ', 'fractional | 2 places | 0.0001111111111'); + test(0.0000111111111, '11.11μ', 'fractional | 2 places | 0.0000111111111'); + test(0.0000011111111, '1.11μ', 'fractional | 2 places | 0.0000011111111'); + test(0.0000001111111, '111.11n', 'fractional | 2 places | 0.0000001111111'); + test(0.0000000111111, '11.11n', 'fractional | 2 places | 0.0000000111111'); + test(0.0000000011111, '1.11n', 'fractional | 2 places | 0.0000000011111'); + test(0.0000000001111, '0.1n', 'fractional | 2 places | 0.0000000001111'); + test(0.0000000000111, '0.01n', 'fractional | 2 places | 0.0000000000111'); + test(0.0000000000011, '0.001n', 'fractional | 2 places | 0.0000000000011'); + test(0.0000000000001, '0.0001n', 'fractional | 2 places | 0.0000000000001'); + + test(1.1111111111111, '1.11', 'fractional | 2 places | 1.1111111111111'); + test(1.0111111111111, '1.01', 'fractional | 2 places | 1.0111111111111'); + test(1.0011111111111, '1', 'fractional | 2 places | 1.0011111111111'); + test(1.0001111111111, '1', 'fractional | 2 places | 1.0001111111111'); + test(1.0000111111111, '1', 'fractional | 2 places | 1.0000111111111'); + test(1.0000011111111, '1', 'fractional | 2 places | 1.0000011111111'); + test(1.0000001111111, '1', 'fractional | 2 places | 1.0000001111111'); + test(1.0000000111111, '1', 'fractional | 2 places | 1.0000000111111'); + test(1.0000000011111, '1', 'fractional | 2 places | 1.0000000011111'); + test(1.0000000001111, '1', 'fractional | 2 places | 1.0000000001111'); + test(1.0000000000111, '1', 'fractional | 2 places | 1.0000000000111'); + test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); + + test(1.1000000000001, '1.1', 'fractional | 2 places | 1.1000000000001'); + test(1.0100000000001, '1.01', 'fractional | 2 places | 1.0100000000001'); + test(1.0010000000001, '1', 'fractional | 2 places | 1.0010000000001'); + test(1.0001000000001, '1', 'fractional | 2 places | 1.0001000000001'); + test(1.0000100000001, '1', 'fractional | 2 places | 1.0000100000001'); + test(1.0000010000001, '1', 'fractional | 2 places | 1.0000010000001'); + test(1.0000001000001, '1', 'fractional | 2 places | 1.0000001000001'); + test(1.0000000100001, '1', 'fractional | 2 places | 1.0000000100001'); + test(1.0000000010001, '1', 'fractional | 2 places | 1.0000000010001'); + test(1.0000000001001, '1', 'fractional | 2 places | 1.0000000001001'); + test(1.0000000000101, '1', 'fractional | 2 places | 1.0000000000101'); + test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); + test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); + }); + + equal(run(0.0001) + 'm', '100μm', '100μm'); + equal(run(0.001) + 'm', '1mm', '1mm'); + equal(run(0.01) + 'm', '10mm', '10mm'); + equal(run(0.1) + 'm', '100mm', '100mm'); + equal(run(1) + 'm', '1m', '1m'); + equal(run(1000) + 'm', '1km', '1km'); + equal(run(1000000) + 'm', '1,000km', '1,000km'); + equal(run(1000000000) + 'm', '1,000,000km', '1,000,000km'); + + withArgs([0, '|'], function() { + equal(run(1000000000) + 'm', '1,000,000,000m', 'limited to meters | 1,000,000,000m'); + equal(run(1000000) + 'm', '1,000,000m', 'limited to meters | 1,000,000m'); + equal(run(1000) + 'm', '1,000m', 'limited to meters | 1,000m'); + equal(run(1) + 'm', '1m', 'limited to meters | 1m'); + }); + + test(12334.5880, '12k', 'fractional | 0 places | 12334.5880'); + test(12334.5880, [3], '12.335k', 'fractional | 3 places | 12334.5880'); + test(.588500, [9], '588.5m', 'fractional | 9 places | .5885'); + test(.580085, [9], '580.085m', 'fractional | 9 places | .580085'); + test(.580085, [7], '580.085m', 'fractional | 7 places | .580085'); + test(.580085, [5], '580.085m', 'fractional | 5 places | .580085'); + test(.580085, [3], '580.085m', 'fractional | 3 places | .580085'); + test(.580085, [1], '580.1m', 'fractional | 1 places | .580085'); + test(12323.424558, [3, '|'], '12,323.425', 'limited and 3 decimals'); + + equal(run(1, 'metric', [0, '']) + 'm', '1m', 'no format uses short'); + equal(run(1000, 'metric', [0, '|']) + 'm', '1,000m', 'simple placeholder limits'); + + equal(run(1, 'metric', [0, 'm']) + 'm', '1,000mm', 'millimeter max'); + equal(run(1, 'metric', [0, 'μ_']) + 'm', '1,000,000μm', 'micrometer max'); + equal(run(1, 'metric', [0, 'n__']) + 'm', '1,000,000,000nm', 'nanometer max'); + equal(run(1, 'metric', [3, '_k']) + 'm', '0.001km', 'kilometer min'); + + equal(run(0.0000001, 'metric', [0, 'nμ_']) + 'm', '100nm', '100nm with micrometer max'); + equal(run(0.0001, 'metric', [0, 'nμ_']) + 'm', '100μm', '100μm with micrometer max'); + + equal(run(1000000, 'metric', [3, '_KG']) + 'W', '1GW', 'minimum can format higher'); + }); + + method('bytes', function() { + + test(1, '1B', 'default | 1B '); + test(10, '10B', 'default | 10B '); + test(100, '100B', 'default | 100B '); + test(1000, '1KB', 'default | 1KB '); + test(10000, '10KB', 'default | 10KB '); + test(100000, '100KB', 'default | 100KB'); + test(1000000, '1MB', 'default | 1MB '); + test(10000000, '10MB', 'default | 10MB '); + test(100000000, '100MB', 'default | 100MB'); + test(1000000000, '1GB', 'default | 1GB '); + test(10000000000, '10GB', 'default | 10GB '); + test(100000000000, '100GB', 'default | 100GB'); + test(1000000000000, '1TB', 'default | 1TB '); + test(10000000000000, '10TB', 'default | 10TB '); + test(100000000000000, '100TB', 'default | 100TB'); + test(1000000000000000, '1PB', 'default | 1PB '); + test(10000000000000000, '10PB', 'default | 10PB '); + test(100000000000000000, '100PB', 'default | 100PB'); + + withArgs([2], function() { + test(1, '1B', '2 places | 1B '); + test(10, '10B', '2 places | 10B '); + test(100, '100B', '2 places | 100B '); + test(1000, '1KB', '2 places | 1KB '); + test(10000, '10KB', '2 places | 10KB '); + test(100000, '100KB', '2 places | 100KB'); + test(1000000, '1MB', '2 places | 1MB '); + test(10000000, '10MB', '2 places | 10MB '); + test(100000000, '100MB', '2 places | 100MB'); + test(1000000000, '1GB', '2 places | 1GB '); + test(10000000000, '10GB', '2 places | 10GB '); + test(100000000000, '100GB', '2 places | 100GB'); + test(1000000000000, '1TB', '2 places | 1TB '); + test(10000000000000, '10TB', '2 places | 10TB '); + test(100000000000000, '100TB', '2 places | 100TB'); + test(1000000000000000, '1PB', '2 places | 1PB '); + test(10000000000000000, '10PB', '2 places | 10PB '); + test(100000000000000000, '100PB', '2 places | 100PB'); + }); + + withArgs([0, true], function() { + test(1, '1B', '0 places | base 2 | 1B '); + test(10, '10B', '0 places | base 2 | 10B '); + test(100, '100B', '0 places | base 2 | 100B '); + test(1000, '1KiB', '0 places | base 2 | 1KiB '); + test(10000, '10KiB', '0 places | base 2 | 10KiB '); + test(100000, '98KiB', '0 places | base 2 | 100KiB'); + test(1000000, '1MiB', '0 places | base 2 | 1MiB '); + test(10000000, '10MiB', '0 places | base 2 | 10MiB '); + test(100000000, '95MiB', '0 places | base 2 | 100MiB'); + test(1000000000, '1GiB', '0 places | base 2 | 1GiB '); + test(10000000000, '9GiB', '0 places | base 2 | 10GiB '); + test(100000000000, '93GiB', '0 places | base 2 | 100GiB'); + test(1000000000000, '1TiB', '0 places | base 2 | 1TiB '); + test(10000000000000, '9TiB', '0 places | base 2 | 10TiB '); + test(100000000000000, '91TiB', '0 places | base 2 | 100TiB'); + test(1000000000000000, '1PiB', '0 places | base 2 | 1PiB '); + test(10000000000000000, '9PiB', '0 places | base 2 | 10PiB '); + test(100000000000000000, '89PiB', '0 places | base 2 | 100PiB'); + }); + + withArgs([2, true], function() { + + test(1, '1B', '2 places | base 2 | 1B '); + test(10, '10B', '2 places | base 2 | 10B '); + test(100, '100B', '2 places | base 2 | 100B '); + test(1000, '0.98KiB', '2 places | base 2 | 1KB '); + test(10000, '9.77KiB', '2 places | base 2 | 10KB '); + test(100000, '97.66KiB', '2 places | base 2 | 100KB'); + test(1000000, '0.95MiB', '2 places | base 2 | 1MB '); + test(10000000, '9.54MiB', '2 places | base 2 | 10MB '); + test(100000000, '95.37MiB', '2 places | base 2 | 100MB'); + test(1000000000, '0.93GiB', '2 places | base 2 | 1GB '); + test(10000000000, '9.31GiB', '2 places | base 2 | 10GB '); + test(100000000000, '93.13GiB', '2 places | base 2 | 100GB'); + test(1000000000000, '0.91TiB', '2 places | base 2 | 1TB '); + test(10000000000000, '9.09TiB', '2 places | base 2 | 10TB '); + test(100000000000000, '90.95TiB', '2 places | base 2 | 100TB'); + test(1000000000000000, '0.89PiB', '2 places | base 2 | 1PB '); + test(10000000000000000, '8.88PiB', '2 places | base 2 | 10PB '); + test(100000000000000000, '88.82PiB', '2 places | base 2 | 100PB'); + + // Issue #422 + Sugar.Number.setOption('decimal', ','); + test(1000, '0,98KiB', 'should respect global decimal'); + Sugar.Number.setOption('decimal', null); + + }); + + withArgs([0, true, 'si'], function() { + test(1, '1B', 'base 2 with si units | 1B '); + test(10, '10B', 'base 2 with si units | 10B '); + test(100, '100B', 'base 2 with si units | 100B '); + test(1000, '1KB', 'base 2 with si units | 1KB '); + test(10000, '10KB', 'base 2 with si units | 10KB '); + test(100000, '98KB', 'base 2 with si units | 100KB'); + test(1000000, '1MB', 'base 2 with si units | 1MB '); + test(10000000, '10MB', 'base 2 with si units | 10MB '); + test(100000000, '95MB', 'base 2 with si units | 100MB'); + test(1000000000, '1GB', 'base 2 with si units | 1GB '); + test(10000000000, '9GB', 'base 2 with si units | 10GB '); + test(100000000000, '93GB', 'base 2 with si units | 100GB'); + test(1000000000000, '1TB', 'base 2 with si units | 1TB '); + test(10000000000000, '9TB', 'base 2 with si units | 10TB '); + test(100000000000000, '91TB', 'base 2 with si units | 100TB'); + test(1000000000000000, '1PB', 'base 2 with si units | 1PB '); + test(10000000000000000, '9PB', 'base 2 with si units | 10PB '); + test(100000000000000000, '89PB', 'base 2 with si units | 100PB'); + }); + + withArgs([0, false, 'binary'], function() { + + test(1, '1B', 'base 10 with binary units | 1B '); + test(10, '10B', 'base 10 with binary units | 10B '); + test(100, '100B', 'base 10 with binary units | 100B '); + test(1000, '1KiB', 'base 10 with binary units | 1KiB '); + test(10000, '10KiB', 'base 10 with binary units | 10KiB '); + test(100000, '100KiB', 'base 10 with binary units | 100KiB'); + test(1000000, '1MiB', 'base 10 with binary units | 1MiB '); + test(10000000, '10MiB', 'base 10 with binary units | 10MiB '); + test(100000000, '100MiB', 'base 10 with binary units | 100MiB'); + test(1000000000, '1GiB', 'base 10 with binary units | 1GiB '); + test(10000000000, '10GiB', 'base 10 with binary units | 10GiB '); + test(100000000000, '100GiB', 'base 10 with binary units | 100GiB'); + test(1000000000000, '1TiB', 'base 10 with binary units | 1TiB '); + test(10000000000000, '10TiB', 'base 10 with binary units | 10TiB '); + test(100000000000000, '100TiB', 'base 10 with binary units | 100TiB'); + test(1000000000000000, '1PiB', 'base 10 with binary units | 1PiB '); + test(10000000000000000, '10PiB', 'base 10 with binary units | 10PiB '); + test(100000000000000000, '100PiB', 'base 10 with binary units | 100PiB'); + + }); + + test(1024, [0, true], '1KiB', '1024 bytes is 1KiB'); + test(1048576, [0, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); + test(1024, [2, true], '1KiB', '2 places | 1024 bytes is 1KiB'); + test(1048576, [2, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); + + test(Math.pow(10, 16), [0, true], '9PiB', '10 ^ 16 bytes'); + test(Math.pow(10, 16), [-2, true], '0PiB', '10 ^ 16 bytes | -2 places'); + }); + +}); diff --git a/test/tests/object.js b/test/OLD/tests/object.js similarity index 100% rename from test/tests/object.js rename to test/OLD/tests/object.js diff --git a/test/tests/range/date.js b/test/OLD/tests/range/date.js similarity index 100% rename from test/tests/range/date.js rename to test/OLD/tests/range/date.js diff --git a/test/tests/range/number.js b/test/OLD/tests/range/number.js similarity index 100% rename from test/tests/range/number.js rename to test/OLD/tests/range/number.js diff --git a/test/tests/range/string.js b/test/OLD/tests/range/string.js similarity index 100% rename from test/tests/range/string.js rename to test/OLD/tests/range/string.js diff --git a/test/tests/regexp.js b/test/OLD/tests/regexp.js similarity index 100% rename from test/tests/regexp.js rename to test/OLD/tests/regexp.js diff --git a/test/tests/string.js b/test/OLD/tests/string.js similarity index 100% rename from test/tests/string.js rename to test/OLD/tests/string.js diff --git a/test/core.js b/test/core.js deleted file mode 100644 index ca025d31e..000000000 --- a/test/core.js +++ /dev/null @@ -1,99 +0,0 @@ -'use strict'; - -describe('Core', function() { - - describe('Global', function() { - - it('should have a version', function() { - assertMatch(Sugar.VERSION, /^(\d+\.\d+\.\d+|edge)$/); - }); - - }); - - describe('Namespace', function() { - - it('should be able to create a new namespace', function() { - ensureNamespaceNotInitialized('Array', function() { - var namespace = Sugar.createNamespace('Array'); - assertEqual(namespace, Sugar.Array); - assertInstanceOf(namespace.defineInstance, Function); - }); - }); - - it('should not overwrite a created namespace', function() { - ensureNamespaceNotInitialized('Array', function() { - Sugar.createNamespace('Array'); - var oldNamespace = Sugar.Array; - Sugar.createNamespace('Array'); - assertEqual(oldNamespace, Sugar.Array); - }); - }); - - it('should error when namespace is not a built-in', function() { - assertError(function createUnknownNamespace() { - Sugar.createNamespace('Foo'); - }); - }); - - }); - - describe('Defining', function() { - - function alias(name) { - var add = Number(name.charAt(3)); - return function(n) { - return n + add; - }; - } - - it('should be able to define static methods', function() { - Sugar.Number.defineStatic('add', add); - assertEqual(Sugar.Number.add(1, 2), 3); - delete Sugar.Number.add; - }); - - it('should be able to define instance methods as static', function() { - Sugar.Number.defineInstance('add', add); - assertEqual(Sugar.Number.add(1, 2), 3); - delete Sugar.Number.add; - }); - - it('should be able to define static with object', function() { - Sugar.Number.defineStatic({ add: add }); - assertEqual(Sugar.Number.add(1, 2), 3); - delete Sugar.Number.add; - }); - - it('should be able to define instance with object', function() { - Sugar.Number.defineInstance({ add: add }); - assertEqual(Sugar.Number.add(1, 2), 3); - delete Sugar.Number.add; - }); - - it('should be able to define static aliases', function() { - Sugar.Number.defineStaticAlias('add1 add2', alias); - assertEqual(Sugar.Number.add1(1), 2); - assertEqual(Sugar.Number.add2(1), 3); - delete Sugar.Number.add1; - delete Sugar.Number.add2; - }); - - it('should be able to define instance aliases', function() { - Sugar.Number.defineInstanceAlias('add1 add2', alias); - assertEqual(Sugar.Number.add1(1), 2); - assertEqual(Sugar.Number.add2(1), 3); - delete Sugar.Number.add1; - delete Sugar.Number.add2; - }); - - it('should be able to define aliases with a comma as well', function() { - Sugar.Number.defineInstanceAlias('add1,add2', alias); - assertEqual(Sugar.Number.add1(1), 2); - assertEqual(Sugar.Number.add2(1), 3); - delete Sugar.Number.add1; - delete Sugar.Number.add2; - }); - - }); - -}); diff --git a/test/helpers/node.js b/test/helpers/node.js new file mode 100644 index 000000000..4fbe35dd2 --- /dev/null +++ b/test/helpers/node.js @@ -0,0 +1,8 @@ +const path = require('path'); + +module.exports = { + expireCache: function(dir, p) { + const fullPath = path.resolve(dir, p) + '.js'; + delete require.cache[fullPath]; + } +}; diff --git a/test/index.html b/test/index.html index f37633e3d..fdaaebd74 100644 --- a/test/index.html +++ b/test/index.html @@ -13,9 +13,9 @@ - - - - + + + + diff --git a/test/index.js b/test/index.js index aaf8c71f0..cebcea3b7 100644 --- a/test/index.js +++ b/test/index.js @@ -8,11 +8,14 @@ import './helpers/suite'; import './helpers/intl'; // Tests -import './core'; -import './number'; -import './modules'; -import './extended'; -import './chainable'; +import './tests/core'; +import './tests/number'; +import './tests/extended'; +import './tests/chainable'; +import './tests/modules/sugar'; +import './tests/modules/plugin'; +import './tests/modules/plugin-method'; +import './tests/modules/plugin-method-define'; // Export Sugar to global for tests. global.Sugar = Sugar; diff --git a/test/modules.js b/test/modules.js deleted file mode 100644 index 4eda80cc2..000000000 --- a/test/modules.js +++ /dev/null @@ -1,20 +0,0 @@ -import * as Sugar from '../src'; -import * as Number from '../src/number'; -import abs from '../src/number/abs'; - -describe('Modules', function() { - - it('should have exports for main entry point', function() { - assertMatchingNamedExports(Sugar); - }); - - it('should have exports for namespace entry points', function() { - // TODO: all other namespaces! - assertMatchingNamedExports(Number); - }); - - it('should have standlone exports', function() { - assertEqual(abs(-5), 5); - }); - -}); diff --git a/test/number.js b/test/number.js deleted file mode 100644 index 82c88751e..000000000 --- a/test/number.js +++ /dev/null @@ -1,541 +0,0 @@ -'use strict'; - -namespace('Number', function() { - - method('random', function(random) { - assertOneOf(random(), [0,1]); - assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); - assertOneOf(random(25, 30), [25,26,27,28,29,30]); - assertOneOf(random(30, 25), [25,26,27,28,29,30]); - assertOneOf(random(-5, -2), [-5,-4,-3,-2]); - assertOneOf(random(0, 0), [0]); - }); - - method('round', function(round) { - assertEqual(round(3), 3); - assertEqual(round(3.241), 3); - assertEqual(round(3.752), 4); - assertEqual(round(-3.241), -3); - assertEqual(round(-3.752), -4); - assertEqual(round(3.241, 1), 3.2); - assertEqual(round(3.752, 1), 3.8); - assertEqual(round(3.241, 2), 3.24); - assertEqual(round(3.752, 2), 3.75); - assertEqual(round(322855.241, -2), 322900); - assertEqual(round(322855.241, -3), 323000); - assertEqual(round(322855.241, -4), 320000); - assertEqual(round(322855.241, -6), 0); - assertEqual(round(722855.241, -6), 1000000); - assertEqual(round(722855.241, -8), 0); - assertEqual(round(1e-21, 1), 0); - assertEqual(round(1e-21, -1), 0); - }); - - method('ceil', function(ceil) { - assertEqual(ceil(5.5), 6); - assertEqual(ceil(5.14), 6); - assertEqual(ceil(5), 5); - assertEqual(ceil(-5.5), -5); - assertEqual(ceil(-5.14), -5); - assertEqual(ceil(-5), -5); - assertEqual(ceil(4417.1318, 0), 4418); - assertEqual(ceil(4417.1318, 1), 4417.2); - assertEqual(ceil(4417.1318, 2), 4417.14); - assertEqual(ceil(4417.1318, 3), 4417.132); - assertEqual(ceil(4417.1318, -1), 4420); - assertEqual(ceil(4417.1318, -2), 4500); - assertEqual(ceil(4417.1318, -3), 5000); - }); - - method('floor', function(floor) { - assertEqual(floor(5.5), 5); - assertEqual(floor(5.14), 5); - assertEqual(floor(5.9), 5); - assertEqual(floor(5), 5); - assertEqual(floor(-5.5), -6); - assertEqual(floor(-5.14), -6); - assertEqual(floor(-5), -5); - assertEqual(floor(4417.1318, [0]), 4417); - assertEqual(floor(4417.1318, [1]), 4417.1); - assertEqual(floor(4417.1318, [2]), 4417.13); - assertEqual(floor(4417.1318, [3]), 4417.131); - assertEqual(floor(4417.1318, [-1]), 4410); - assertEqual(floor(4417.1318, [-2]), 4400); - assertEqual(floor(4417.1318, [-3]), 4000); - }); - - method('trunc', function(trunc) { - assertEqual(trunc(5), 5); - assertEqual(trunc(5.25), 5); - assertEqual(trunc(NaN), NaN); - assertEqual(trunc(Infinity), Infinity); - assertEqual(trunc(5.25, 1), 5.2); - assertEqual(trunc(5.25, 2), 5.25); - assertEqual(trunc(-5.25, 1), -5.2); - assertEqual(trunc(-5.25, 2), -5.25); - }); - - method('abs', function(abs) { - assertEqual(abs(-5), 5); - assertEqual(abs(5), 5); - assertEqual(abs(-3.324), 3.324); - assertEqual(abs(3.324), 3.324); - }); - - method('pow', function(pow) { - assertEqual(pow(3, [2]), 9); - assertEqual(pow(3, [1]), 3); - assertEqual(pow(12, [2]), 144); - assertEqual(pow(3, [3]), 27); - assertEqual(pow(3, [0]), 1); - assertEqual(pow(3), NaN); - }); - - method('log', function(log) { - assertEqual(log(64, 2), 6); - assertEqual(log(32, 2), 5); - assertEqual(log(16, 2), 4); - assertEqual(log(Math.E), 1); - }); - - method('exp', function(exp) { - assertEqual(exp(0), 1); - assertEqual(exp(1), Math.exp(1)); - }); - - method('sqrt', function(sqrt) { - assertEqual(sqrt(9), 3); - assertEqual(sqrt(1024), 32); - }); - - method('toChar', function(toChar) { - assertEqual(toChar(65), 'A'); - assertEqual(toChar(24536), '忘'); - assertEqual(toChar(20294), '但'); - }); - - method('isMultipleOf', function(isMultipleOf) { - assertEqual(isMultipleOf(2, 2), true); - assertEqual(isMultipleOf(6, 2), true); - assertEqual(isMultipleOf(100, 2), true); - assertEqual(isMultipleOf(2, 100), false); - assertEqual(isMultipleOf(100, -2), true); - assertEqual(isMultipleOf(6, -2), true); - assertEqual(isMultipleOf(6, 3), true); - assertEqual(isMultipleOf(7, 3), false); - assertEqual(isMultipleOf(2.5, 1.25), true); - assertEqual(isMultipleOf(2, 'a'), false); - assertEqual(isMultipleOf(2, /af/), false); - assertEqual(isMultipleOf(2, null), false); - assertEqual(isMultipleOf(2), false); - }); - - method('isOdd', function(isOdd) { - assertEqual(isOdd(0), false); - assertEqual(isOdd(1), true); - assertEqual(isOdd(2), false); - assertEqual(isOdd(24), false); - assertEqual(isOdd(200), false); - assertEqual(isOdd(1.1), false); - assertEqual(isOdd(NaN), false); - assertEqual(isOdd(Infinity), false); - assertEqual(isOdd(-Infinity), false); - }); - - method('isEven', function(isEven) { - assertEqual(isEven(0), true); - assertEqual(isEven(1), false); - assertEqual(isEven(2), true); - assertEqual(isEven(24), true); - assertEqual(isEven(200), true); - assertEqual(isEven(1.1), false); - assertEqual(isEven(NaN), false); - assertEqual(isEven(Infinity), false); - assertEqual(isEven(-Infinity), false); - }); - - method('toOrdinal', function(toOrdinal) { - - assertEqual(toOrdinal(0), '0th'); - assertEqual(toOrdinal(1), '1st'); - assertEqual(toOrdinal(2), '2nd'); - assertEqual(toOrdinal(3), '3rd'); - assertEqual(toOrdinal(4), '4th'); - assertEqual(toOrdinal(5), '5th'); - assertEqual(toOrdinal(6), '6th'); - assertEqual(toOrdinal(7), '7th'); - assertEqual(toOrdinal(8), '8th'); - assertEqual(toOrdinal(9), '9th'); - assertEqual(toOrdinal(10), '10th'); - assertEqual(toOrdinal(11), '11th'); - assertEqual(toOrdinal(12), '12th'); - assertEqual(toOrdinal(13), '13th'); - assertEqual(toOrdinal(14), '14th'); - assertEqual(toOrdinal(15), '15th'); - assertEqual(toOrdinal(20), '20th'); - assertEqual(toOrdinal(21), '21st'); - assertEqual(toOrdinal(22), '22nd'); - assertEqual(toOrdinal(23), '23rd'); - assertEqual(toOrdinal(24), '24th'); - assertEqual(toOrdinal(25), '25th'); - assertEqual(toOrdinal(100), '100th'); - assertEqual(toOrdinal(101), '101st'); - assertEqual(toOrdinal(102), '102nd'); - assertEqual(toOrdinal(103), '103rd'); - assertEqual(toOrdinal(104), '104th'); - assertEqual(toOrdinal(105), '105th'); - - assertEqual(toOrdinal(-0), '0th'); - assertEqual(toOrdinal(-1), '-1st'); - assertEqual(toOrdinal(-2), '-2nd'); - assertEqual(toOrdinal(-3), '-3rd'); - assertEqual(toOrdinal(-4), '-4th'); - assertEqual(toOrdinal(-5), '-5th'); - - assertError(toOrdinal.bind(null, NaN)); - assertError(toOrdinal.bind(null, 5.55)); - assertError(toOrdinal.bind(null, null)); - assertError(toOrdinal.bind(null, undefined)); - assertError(toOrdinal.bind(null, Infinity)); - - }); - - method('isInteger', function(isInteger) { - assertEqual(isInteger(15), true); - assertEqual(isInteger(15.2), false); - assertEqual(isInteger(15.2668), false); - assertEqual(isInteger(15.0), true); - assertEqual(isInteger('15'), false); - assertEqual(isInteger('15.8'), false); - }); - - method('isSafeInteger', function(isSafeInteger) { - assertEqual(isSafeInteger(-0), true); - assertEqual(isSafeInteger(0), true); - assertEqual(isSafeInteger(1), true); - assertEqual(isSafeInteger(1e255), false); - assertEqual(isSafeInteger(NaN), false); - assertEqual(isSafeInteger(Infinity), false); - }); - - method('isFinite', function(isFinite) { - assertEqual(isFinite(-0), true); - assertEqual(isFinite(0), true); - assertEqual(isFinite(1), true); - assertEqual(isFinite(1e255), true); - assertEqual(isFinite(NaN), false); - assertEqual(isFinite(Infinity), false); - assertEqual(isFinite(-Infinity), false); - }); - - method('isNaN', function(isNaN) { - assertEqual(isNaN(1), false); - assertEqual(isNaN(NaN), true); - assertEqual(isNaN(Infinity), false); - assertEqual(isNaN(-Infinity), false); - }); - - method('times', function(times) { - - function assertTimesRan(n, actual) { - var count = 0; - times(n, function() { - count++; - }); - assertEqual(count, actual); - } - - function assertInvalidInput(n) { - assertError(function() { - times(n, function() {}); - }, TypeError); - } - - assertTimesRan(1, 1); - assertTimesRan(5, 5); - assertTimesRan(10, 10); - - assertInvalidInput(-1); - assertInvalidInput(1.5); - assertInvalidInput(NaN); - assertInvalidInput(null); - assertInvalidInput(undefined); - assertInvalidInput(Infinity); - assertInvalidInput(-Infinity); - - assertArrayEqual(times(3, function(i) { - return Math.pow(2, i); - }), [1,2,4]); - - assertArrayEqual(times(1, function(i, n) { - return n; - }), [1]); - - assertError(function() { - times(1); - }, TypeError); - - }); - - method('format', function(format) { - - assertEqual(format(1), '1'); - assertEqual(format(10), '10'); - assertEqual(format(100), '100'); - assertEqual(format(1000), '1,000'); - assertEqual(format(1000000), '1,000,000'); - assertEqual(format(1000000000), '1,000,000,000'); - - assertEqual(format(-1), '-1'); - assertEqual(format(-10), '-10'); - assertEqual(format(-100), '-100'); - assertEqual(format(-1000), '-1,000'); - assertEqual(format(-1000000), '-1,000,000'); - assertEqual(format(-1000000000), '-1,000,000,000'); - - assertEqual(format( 6666.66), '6,666.66'); - assertEqual(format(-6666.66), '-6,666.66'); - - assertEqual(format( 6666.66, 1), '6,666.7'); - assertEqual(format(-6666.66, 1), '-6,666.7'); - - assertEqual(format( 1000, 2), '1,000.00'); - assertEqual(format(-1000, 2), '-1,000.00'); - - assertEqual(format( 6666.66, -1), '6,670'); - assertEqual(format(-6666.66, -1), '-6,670'); - - assertEqual(format( 1e6), '1,000,000'); - assertEqual(format(-1e6), '-1,000,000'); - - assertEqual(format( 1e6, 2), '1,000,000.00'); - assertEqual(format(-1e6, 2), '-1,000,000.00'); - - assertEqual(format( 0), '0'); - assertEqual(format(-0), '0'); - - assertEqual(format( 0, 2), '0.00'); - assertEqual(format(-0, 2), '0.00'); - - assertEqual(format('1000'), '1,000'); - - assertError(function() { format(NaN); }); - assertError(function() { format(1e21); }); - assertError(function() { format(1e-6); }); - assertError(function() { format(Infinity); }); - - }); - - method('pad', function(pad) { - - assertEqual(pad(1), '1'); - assertEqual(pad(1, 0), '1'); - assertEqual(pad(1, 1), '1'); - assertEqual(pad(1, 2), '01'); - assertEqual(pad(1, 3), '001'); - - assertEqual(pad(-1), '-1'); - assertEqual(pad(-1, 0), '-1'); - assertEqual(pad(-1, 1), '-1'); - assertEqual(pad(-1, 2), '-01'); - - assertEqual(pad( 1, 2, 0, true), '+01'); - assertEqual(pad(-1, 2, 0, true), '-01'); - - assertEqual(pad(5.25, 4), '0005.25'); - assertEqual(pad(5.25, 4, 0), '0005'); - assertEqual(pad(5.25, 4, 1), '0005.3'); - assertEqual(pad(5, 4, 2, true), '+0005.00'); - assertEqual(pad(5, 4, null, true), '+0005'); - - assertError(function() { pad(NaN); }); - assertError(function() { pad(1e21); }); - assertError(function() { pad(1e-6); }); - assertError(function() { pad(Infinity); }); - - }); - - method('toHex', function(toHex) { - - assertEqual(toHex(0), '0'); - assertEqual(toHex(0, 2), '00'); - - assertEqual(toHex(255), 'ff'); - assertEqual(toHex(255, 4), '00ff'); - - assertEqual(toHex(255.5, 4), '00ff.8'); - - assertError(function() { toHex(NaN); }); - assertError(function() { toHex(1e21); }); - assertError(function() { toHex(1e-6); }); - assertError(function() { toHex(Infinity); }); - - }); - - method('abbr', function(abbr) { - - // Positive - assertEqual(abbr(0), '0'); - assertEqual(abbr(1), '1'); - assertEqual(abbr(10), '10'); - assertEqual(abbr(100), '100'); - assertEqual(abbr(999), '999'); - assertEqual(abbr(1000), '1k'); - assertEqual(abbr(1999), '1k'); - assertEqual(abbr(10000), '10k'); - assertEqual(abbr(100000), '100k'); - assertEqual(abbr(1000000), '1m'); - assertEqual(abbr(1000000000), '1b'); - assertEqual(abbr(1000000000000), '1t'); - assertEqual(abbr(1000000000000000), '1,000t'); - - // Negative - assertEqual(abbr(-1), '-1'); - assertEqual(abbr(-10), '-10'); - assertEqual(abbr(-100), '-100'); - assertEqual(abbr(-1000), '-1k'); - assertEqual(abbr(-10000), '-10k'); - assertEqual(abbr(-100000), '-100k'); - assertEqual(abbr(-1000000), '-1m'); - assertEqual(abbr(-1000000000), '-1b'); - assertEqual(abbr(-1000000000000), '-1t'); - assertEqual(abbr(-1000000000000000), '-1,000t'); - - // Decimal - assertEqual(abbr(0.1), '0.1'); - assertEqual(abbr(0.01), '0.01'); - assertEqual(abbr(0.001), '0.001'); - assertEqual(abbr(0.0001), '0.0001'); - assertEqual(abbr(1000000.25), '1m'); - - // With Precision - assertEqual(abbr(0, 0), '0'); - assertEqual(abbr(0, -1), '0'); - assertEqual(abbr(1748), '1k'); - assertEqual(abbr(1748, 1), '1.7k'); - assertEqual(abbr(1748, 2), '1.74k'); - assertEqual(abbr(1748, 3), '1.748k'); - assertEqual(abbr(1748, -1), '1k'); - assertEqual(abbr(155555, 0), '155k'); - assertEqual(abbr(155555, -1), '150k'); - assertEqual(abbr(155555, -2), '100k'); - assertEqual(abbr(155555, -3), '100k'); - assertEqual(abbr(-1748), '-1k'); - assertEqual(abbr(-1748, 1), '-1.7k'); - assertEqual(abbr(-1748, 2), '-1.74k'); - assertEqual(abbr(-1748, 3), '-1.748k'); - assertEqual(abbr(-155555, 0), '-155k'); - assertEqual(abbr(-155555, -1), '-150k'); - assertEqual(abbr(-155555, -2), '-100k'); - - // Common si - assertEqual(abbr(1, 0, 'common') + 'm', '1m'); - assertEqual(abbr(10, 0, 'common') + 'm', '10m'); - assertEqual(abbr(100, 0, 'common') + 'm', '100m'); - assertEqual(abbr(1000, 0, 'common') + 'm', '1km'); - assertEqual(abbr(10000, 0, 'common') + 'm', '10km'); - assertEqual(abbr(10000000, 0, 'common') + 'm', '10,000km'); - - assertEqual(abbr(9, 0, 'common') + 'm', '9m'); - assertEqual(abbr(99, 0, 'common') + 'm', '99m'); - assertEqual(abbr(999, 0, 'common') + 'm', '999m'); - assertEqual(abbr(9999, 0, 'common') + 'm', '9km'); - assertEqual(abbr(99999, 0, 'common') + 'm', '99km'); - assertEqual(abbr(99999999, 0, 'common') + 'm', '99,999km'); - - assertEqual(abbr(.1, 0, 'common') + 'm', '100mm'); - assertEqual(abbr(.01, 0, 'common') + 'm', '10mm'); - assertEqual(abbr(.001, 0, 'common') + 'm', '1mm'); - assertEqual(abbr(.0001, 0, 'common') + 'm', '100μm'); - assertEqual(abbr(.00001, 0, 'common') + 'm', '10μm'); - assertEqual(abbr(.000001, 0, 'common') + 'm', '1μm'); - assertEqual(abbr(.0000001, 0, 'common') + 'm', '100nm'); - assertEqual(abbr(.00000001, 0, 'common') + 'm', '10nm'); - assertEqual(abbr(.000000001, 0, 'common') + 'm', '1nm'); - - assertEqual(abbr(.9, 0, 'common') + 'm', '900mm'); - assertEqual(abbr(.09, 0, 'common') + 'm', '90mm'); - assertEqual(abbr(.009, 0, 'common') + 'm', '9mm'); - assertEqual(abbr(.0009, 0, 'common') + 'm', '900μm'); - assertEqual(abbr(.00009, 0, 'common') + 'm', '90μm'); - assertEqual(abbr(.000009, 0, 'common') + 'm', '9μm'); - assertEqual(abbr(.0000009, 0, 'common') + 'm', '900nm'); - assertEqual(abbr(.00000009, 0, 'common') + 'm', '90nm'); - assertEqual(abbr(.000000009, 0, 'common') + 'm', '9nm'); - - // Full si - assertEqual(abbr(1, 0, 'metric'), '1'); - assertEqual(abbr(1000, 0, 'metric'), '1K'); - assertEqual(abbr(1000000, 0, 'metric'), '1M'); - assertEqual(abbr(1000000000, 0, 'metric'), '1G'); - assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); - assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); - assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); - assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); - assertEqual(abbr(1000000000000000000000000, 0, 'metric'), '1Y'); - assertEqual(abbr(1000000000000000000000000000, 0, 'metric'), '1,000Y'); - - assertEqual(abbr(.001, 0, 'metric'), '1m'); - assertEqual(abbr(.000001, 0, 'metric'), '1μ'); - assertEqual(abbr(.000000001, 0, 'metric'), '1n'); - assertEqual(abbr(.000000000001, 0, 'metric'), '1p'); - assertEqual(abbr(.000000000000001, 0, 'metric'), '1f'); - assertEqual(abbr(.000000000000000001, 0, 'metric'), '1a'); - assertEqual(abbr(.000000000000000000001, 0, 'metric'), '1z'); - assertEqual(abbr(.000000000000000000000001, 0, 'metric'), '1y'); - assertEqual(abbr(.000000000000000000000000001, 0, 'metric'), '0'); - assertEqual(abbr(.000000000000000000000000001, null, 'metric'), '0.001y'); - - // Binary (Base 2) - assertEqual(abbr(1, 0, 'binary'), '1'); - assertEqual(abbr(Math.pow(2, 10), 0, 'binary') + 'B', '1KB'); - assertEqual(abbr(Math.pow(2, 20), 0, 'binary') + 'B', '1MB'); - assertEqual(abbr(Math.pow(2, 30), 0, 'binary') + 'B', '1GB'); - assertEqual(abbr(Math.pow(2, 40), 0, 'binary') + 'B', '1TB'); - assertEqual(abbr(Math.pow(2, 50), 0, 'binary') + 'B', '1PB'); - assertEqual(abbr(Math.pow(2, 60), 0, 'binary') + 'B', '1EB'); - assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1ZB'); - - assertEqual(abbr(Math.pow(2, 10) - Math.pow(2, 0), 0, 'binary') + 'B', '1,023B'); - assertEqual(abbr(Math.pow(2, 20) - Math.pow(2, 10), 0, 'binary') + 'B', '1,023KB'); - assertEqual(abbr(Math.pow(2, 30) - Math.pow(2, 20), 0, 'binary') + 'B', '1,023MB'); - assertEqual(abbr(Math.pow(2, 40) - Math.pow(2, 30), 0, 'binary') + 'B', '1,023GB'); - assertEqual(abbr(Math.pow(2, 50) - Math.pow(2, 40), 0, 'binary') + 'B', '1,023TB'); - assertEqual(abbr(Math.pow(2, 60) - Math.pow(2, 50), 0, 'binary') + 'B', '1,023PB'); - assertEqual(abbr(Math.pow(2, 70) - Math.pow(2, 60), 0, 'binary') + 'B', '1,023EB'); - - // Memory (Base 10) - assertEqual(abbr(1, 0, 'metric'), '1'); - assertEqual(abbr(1000, 0, 'metric'), '1K'); - assertEqual(abbr(1000000, 0, 'metric'), '1M'); - assertEqual(abbr(1000000000, 0, 'metric'), '1G'); - assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); - assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); - assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); - assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); - - // Other - assertEqual(abbr(1755, 2, 'integer'), '1.75k'); - assertEqual(abbr(17555, 2, '|'), '17,555'); - assertEqual(abbr(.17555, 2, '|'), '0.17'); - assertEqual(abbr(.17555, null, '|'), '0.17555'); - assertEqual(abbr(17555, 0, 'x|y'), '17x'); - assertEqual(abbr(.17555, 0, 'x|y'), '175y'); - assertEqual(abbr(175000, null, 'm-|'), '0.175m'); - assertEqual(abbr(175000000, null, 'bm-|'), '175m'); - assertEqual(abbr(.175, 0, 'x|-μ'), '175,000μ'); - - // Errors - assertError(function() { abbr(NaN); }); - assertError(function() { abbr(Infinity); }); - assertError(function() { abbr(null); }); - assertError(function() { abbr(undefined); }); - - withNumberFormatter('de-DE', function(formatter) { - assertEqual(abbr(1755, 1, 'integer', formatter), '1,7k'); - assertEqual(abbr(1755, 2, 'integer', formatter), '1,75k'); - }); - - }); - -}); diff --git a/test/plugins/math-operators/add/define.js b/test/plugins/math-operators/add/define.js new file mode 100644 index 000000000..e65a962d6 --- /dev/null +++ b/test/plugins/math-operators/add/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../../../src/core/number'; +import add from './'; +defineInstance(add); diff --git a/test/plugins/math-operators/add/index.js b/test/plugins/math-operators/add/index.js new file mode 100644 index 000000000..92608bdd4 --- /dev/null +++ b/test/plugins/math-operators/add/index.js @@ -0,0 +1,3 @@ +export default function add(n1, n2) { + return n1 + n2; +} diff --git a/test/plugins/math-operators/index.js b/test/plugins/math-operators/index.js new file mode 100644 index 000000000..597b08eee --- /dev/null +++ b/test/plugins/math-operators/index.js @@ -0,0 +1,11 @@ +import SugarNumber from '../../../src/core/number'; + +import './add/define'; +import './mult/define'; + +export const { + add, + mult, +} = SugarNumber; + +export default SugarNumber; diff --git a/test/plugins/math-operators/mult/define.js b/test/plugins/math-operators/mult/define.js new file mode 100644 index 000000000..0cca1f5eb --- /dev/null +++ b/test/plugins/math-operators/mult/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../../../src/core/number'; +import mult from './'; +defineInstance(mult); diff --git a/test/plugins/math-operators/mult/index.js b/test/plugins/math-operators/mult/index.js new file mode 100644 index 000000000..47d7b9f3e --- /dev/null +++ b/test/plugins/math-operators/mult/index.js @@ -0,0 +1,3 @@ +export default function mult(n1, n2) { + return n1 * n2; +} diff --git a/test/chainable.js b/test/tests/chainable.js similarity index 100% rename from test/chainable.js rename to test/tests/chainable.js diff --git a/test/tests/core.js b/test/tests/core.js index c0d79d3cc..1427d93e2 100644 --- a/test/tests/core.js +++ b/test/tests/core.js @@ -1,3 +1,117 @@ -namespace('Core', function() { - 'use strict'; +'use strict'; + +describe('Core', function() { + + describe('Global', function() { + + it('should have a version', function() { + assertMatch(Sugar.VERSION, /^(\d+\.\d+\.\d+|edge)$/); + }); + + }); + + describe('Namespace', function() { + + it('should be able to create a new namespace', function() { + ensureNamespaceNotInitialized('Array', function() { + var namespace = Sugar.createNamespace('Array'); + assertEqual(namespace, Sugar.Array); + assertInstanceOf(namespace.defineInstance, Function); + }); + }); + + it('should not overwrite a created namespace', function() { + ensureNamespaceNotInitialized('Array', function() { + Sugar.createNamespace('Array'); + var oldNamespace = Sugar.Array; + Sugar.createNamespace('Array'); + assertEqual(oldNamespace, Sugar.Array); + }); + }); + + it('should error when namespace is not a built-in', function() { + assertError(function createUnknownNamespace() { + Sugar.createNamespace('Foo'); + }); + }); + + }); + + describe('Defining', function() { + + describe('Basic', function() { + + afterEach(function() { + delete Sugar.Number.add; + }); + + it('should be able to define static methods', function() { + Sugar.Number.defineStatic('add', add); + assertEqual(Sugar.Number.add(1, 2), 3); + }); + + it('should be able to define instance methods as static', function() { + Sugar.Number.defineInstance('add', add); + assertEqual(Sugar.Number.add(1, 2), 3); + }); + + it('should be able to define static with object', function() { + Sugar.Number.defineStatic({ add: add }); + assertEqual(Sugar.Number.add(1, 2), 3); + }); + + it('should be able to define instance with object', function() { + Sugar.Number.defineInstance({ add: add }); + assertEqual(Sugar.Number.add(1, 2), 3); + }); + + it('should be able to define instance with named function', function() { + Sugar.Number.defineInstance(add); + assertEqual(Sugar.Number.add(1, 2), 3); + }); + + it('should throw an error if function has no name', function() { + assertError(function() { + Sugar.Number.defineInstance(function() {}); + }); + }); + + }); + + describe('Aliases', function() { + + function alias(name) { + var add = Number(name.charAt(3)); + return function(n) { + return n + add; + }; + } + + afterEach(function() { + delete Sugar.Number.add1; + delete Sugar.Number.add2; + }); + + it('should be able to define static aliases', function() { + Sugar.Number.defineStaticAlias('add1 add2', alias); + assertEqual(Sugar.Number.add1(1), 2); + assertEqual(Sugar.Number.add2(1), 3); + }); + + it('should be able to define instance aliases', function() { + Sugar.Number.defineInstanceAlias('add1 add2', alias); + assertEqual(Sugar.Number.add1(1), 2); + assertEqual(Sugar.Number.add2(1), 3); + }); + + it('should be able to define aliases with a comma as well', function() { + Sugar.Number.defineInstanceAlias('add1,add2', alias); + assertEqual(Sugar.Number.add1(1), 2); + assertEqual(Sugar.Number.add2(1), 3); + }); + + }); + + }); + }); diff --git a/test/extended.js b/test/tests/extended.js similarity index 100% rename from test/extended.js rename to test/tests/extended.js diff --git a/test/tests/modules/plugin-method-define.js b/test/tests/modules/plugin-method-define.js new file mode 100644 index 000000000..9b42cb829 --- /dev/null +++ b/test/tests/modules/plugin-method-define.js @@ -0,0 +1,22 @@ +import SugarNumber from '../../../src/core/number'; +import * as Exports from '../../plugins/math-operators/add/define'; +import { expireCache } from '../../helpers/node'; + +// Hold a reference to the method as we'll lose it when we reset. +const NamespaceAdd = SugarNumber.add; + +describe('Plugin Method Define', function() { + + it('should not have any exports', function() { + assertEqual(Object.keys(Exports).length, 0); + }); + + it('should have defined the method', function() { + assertInstanceOf(NamespaceAdd, Function); + }); + +}); + +// Reset state after import. +delete SugarNumber.add; +expireCache(__dirname, '../../plugins/math-operators/add/define'); diff --git a/test/tests/modules/plugin-method.js b/test/tests/modules/plugin-method.js new file mode 100644 index 000000000..912a98679 --- /dev/null +++ b/test/tests/modules/plugin-method.js @@ -0,0 +1,14 @@ +import SugarNumber from '../../../src/core/number'; +import add from '../../plugins/math-operators/add'; + +describe('Plugin Method Entry', function() { + + it('should export the method as default', function() { + assertEqual(add(5, 5), 10); + }); + + it('should not have defined the method', function() { + assertUndefined(SugarNumber.add); + }); + +}); diff --git a/test/tests/modules/plugin.js b/test/tests/modules/plugin.js new file mode 100644 index 000000000..bd8f1d866 --- /dev/null +++ b/test/tests/modules/plugin.js @@ -0,0 +1,26 @@ +import SugarNumber from '../../../src/core/number'; +import DefaultExport, { add, mult } from '../../plugins/math-operators'; +import { expireCache } from '../../helpers/node'; + +describe('Plugin Entry', function() { + + it('should export the namespace as the default', function() { + assertEqual(DefaultExport, SugarNumber); + }); + + it('should export standalone methods', function() { + assertEqual(add(5, 5), 10); + assertEqual(mult(5, 5), 25); + }); + + it('should have defined methods on the chainable', function() { + assertEqual(new SugarNumber(5).add(5).mult(5).raw, 50); + }); + +}); + +// Reset state after import. +delete SugarNumber.add; +delete SugarNumber.mult; +expireCache(__dirname, '../../plugins/math-operators/add/define'); +expireCache(__dirname, '../../plugins/math-operators/mult/define'); diff --git a/test/tests/modules/sugar.js b/test/tests/modules/sugar.js new file mode 100644 index 000000000..2c05ab4c4 --- /dev/null +++ b/test/tests/modules/sugar.js @@ -0,0 +1,14 @@ +import * as Sugar from '../../../src'; +import * as SugarNumber from '../../../src/number'; + +describe('Modules', function() { + + it('should have exports for main entry point', function() { + assertMatchingNamedExports(Sugar); + }); + + it('should have exports for namespace entry points', function() { + assertMatchingNamedExports(SugarNumber); + }); + +}); diff --git a/test/tests/number.js b/test/tests/number.js index 8f3f2a334..82c88751e 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -1,1093 +1,541 @@ -namespace('Number', function () { - 'use strict'; +'use strict'; - group('Options', function() { - equal(Sugar.Number.getOption('thousands'), ',', 'Thousands should be comma by default'); - equal(Sugar.Number.getOption('decimal'), '.', 'Decimal should be dot by default'); - }); - - method('random', function() { - var rand; - - rand = run(Number); - equal(rand == 0 || rand == 1, true, 'no params = 0 or 1'); - - rand = run(Number, 'random', [10]); - equal(rand >= 0 && rand <= 10, true, 'min not defined, max is 10'); - equal(rand % 1, 0, 'number is whole'); - - rand = run(Number, 'random', [536224, 536280]); - equal(rand >= 536224 && rand <= 536280, true, 'min and max defined'); - - rand = run(Number, 'random', [6, -5]); - equal(rand >= -5 && rand <= 6, true, 'min and max can be reversed'); +namespace('Number', function() { - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); + method('random', function(random) { + assertOneOf(random(), [0,1]); + assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); + assertOneOf(random(25, 30), [25,26,27,28,29,30]); + assertOneOf(random(30, 25), [25,26,27,28,29,30]); + assertOneOf(random(-5, -2), [-5,-4,-3,-2]); + assertOneOf(random(0, 0), [0]); }); - method('toNumber', function() { - test(4, 4, '4 is 4'); - test(10000, 10000, '10000 is 10000'); - test(5.2345, 5.2345, '5.2345 is 5.2345'); + method('round', function(round) { + assertEqual(round(3), 3); + assertEqual(round(3.241), 3); + assertEqual(round(3.752), 4); + assertEqual(round(-3.241), -3); + assertEqual(round(-3.752), -4); + assertEqual(round(3.241, 1), 3.2); + assertEqual(round(3.752, 1), 3.8); + assertEqual(round(3.241, 2), 3.24); + assertEqual(round(3.752, 2), 3.75); + assertEqual(round(322855.241, -2), 322900); + assertEqual(round(322855.241, -3), 323000); + assertEqual(round(322855.241, -4), 320000); + assertEqual(round(322855.241, -6), 0); + assertEqual(round(722855.241, -6), 1000000); + assertEqual(round(722855.241, -8), 0); + assertEqual(round(1e-21, 1), 0); + assertEqual(round(1e-21, -1), 0); }); - method('ceil', function() { - test(5.5, 6, '5.5'); - test(5.14, 6, '5.14'); - test(5, 5, '5'); - test(-5.5, -5, '-5.5'); - test(-5.14, -5, '-5.14'); - test(-5, -5, '-5'); - test(4417.1318, [0], 4418, '0'); - test(4417.1318, [1], 4417.2, '1'); - test(4417.1318, [2], 4417.14, '2'); - test(4417.1318, [3], 4417.132, '3'); - test(4417.1318, [-1], 4420, '-1'); - test(4417.1318, [-2], 4500, '-2'); - test(4417.1318, [-3], 5000, '-3'); + method('ceil', function(ceil) { + assertEqual(ceil(5.5), 6); + assertEqual(ceil(5.14), 6); + assertEqual(ceil(5), 5); + assertEqual(ceil(-5.5), -5); + assertEqual(ceil(-5.14), -5); + assertEqual(ceil(-5), -5); + assertEqual(ceil(4417.1318, 0), 4418); + assertEqual(ceil(4417.1318, 1), 4417.2); + assertEqual(ceil(4417.1318, 2), 4417.14); + assertEqual(ceil(4417.1318, 3), 4417.132); + assertEqual(ceil(4417.1318, -1), 4420); + assertEqual(ceil(4417.1318, -2), 4500); + assertEqual(ceil(4417.1318, -3), 5000); }); - method('floor', function() { - test(5.5, 5, '5.5'); - test(5.14, 5, '5.14'); - test(5.9, 5, '5.9'); - test(5, 5, '5'); - test(-5.5, -6, '-5.5'); - test(-5.14, -6, '-5.14'); - test(-5, -5, '-5'); - test(4417.1318, [0], 4417, '0'); - test(4417.1318, [1], 4417.1, '1'); - test(4417.1318, [2], 4417.13, '2'); - test(4417.1318, [3], 4417.131, '3'); - test(4417.1318, [-1], 4410, '-1'); - test(4417.1318, [-2], 4400, '-2'); - test(4417.1318, [-3], 4000, '-3'); + method('floor', function(floor) { + assertEqual(floor(5.5), 5); + assertEqual(floor(5.14), 5); + assertEqual(floor(5.9), 5); + assertEqual(floor(5), 5); + assertEqual(floor(-5.5), -6); + assertEqual(floor(-5.14), -6); + assertEqual(floor(-5), -5); + assertEqual(floor(4417.1318, [0]), 4417); + assertEqual(floor(4417.1318, [1]), 4417.1); + assertEqual(floor(4417.1318, [2]), 4417.13); + assertEqual(floor(4417.1318, [3]), 4417.131); + assertEqual(floor(4417.1318, [-1]), 4410); + assertEqual(floor(4417.1318, [-2]), 4400); + assertEqual(floor(4417.1318, [-3]), 4000); }); - method('abs', function() { - test(-5, 5, '-5'); - test(5, 5, '5'); - test(-3.324, 3.324, '-3.324'); - test(3.324, 3.324, '3.324'); + method('trunc', function(trunc) { + assertEqual(trunc(5), 5); + assertEqual(trunc(5.25), 5); + assertEqual(trunc(NaN), NaN); + assertEqual(trunc(Infinity), Infinity); + assertEqual(trunc(5.25, 1), 5.2); + assertEqual(trunc(5.25, 2), 5.25); + assertEqual(trunc(-5.25, 1), -5.2); + assertEqual(trunc(-5.25, 2), -5.25); }); - method('pow', function() { - test(3, [2], 9, '3 ^ 2'); - test(3, [1], 3, '3 ^ 1'); - test(12, [2], 144, '12 ^ 2'); - test(3, [3], 27, '3 ^ 3'); - test(3, [0], 1, 'zero is allowed'); - test(3, NaN, 'defaults to no number'); + method('abs', function(abs) { + assertEqual(abs(-5), 5); + assertEqual(abs(5), 5); + assertEqual(abs(-3.324), 3.324); + assertEqual(abs(3.324), 3.324); }); - method('sin', function() { - // A recent change in the V8 engine now produces less accurate values for - // trigonomic functions in Chrome: https://code.google.com/p/v8/issues/detail?id=3006 - // This issue is flagged for landing in M35. - equalWithMargin(run(1, 'sin'), 0.8414709848078965, 0.000000000000001); - test(0, 0); - test(Math.PI/2, 1); + method('pow', function(pow) { + assertEqual(pow(3, [2]), 9); + assertEqual(pow(3, [1]), 3); + assertEqual(pow(12, [2]), 144); + assertEqual(pow(3, [3]), 27); + assertEqual(pow(3, [0]), 1); + assertEqual(pow(3), NaN); }); - method('cos', function() { - test(0, 1); - test(Math.PI, -1, 'PI'); - test(Math.PI*2, 1, 'PI*2'); + method('log', function(log) { + assertEqual(log(64, 2), 6); + assertEqual(log(32, 2), 5); + assertEqual(log(16, 2), 4); + assertEqual(log(Math.E), 1); }); - method('tan', function() { - test(0, 0); - // See above - equalWithMargin(run(45, 'tan'), 1.6197751905438615, 0.000000000000001); - equalWithMargin(run(90, 'tan'), -1.995200412208242, 0.000000000000001); + method('exp', function(exp) { + assertEqual(exp(0), 1); + assertEqual(exp(1), Math.exp(1)); }); - method('asin', function() { - test(0, 0); - test(1, Math.PI/2, '1 is PI/2'); + method('sqrt', function(sqrt) { + assertEqual(sqrt(9), 3); + assertEqual(sqrt(1024), 32); }); - method('acos', function() { - test(0, Math.PI/2, '0 is PI/2'); - test(1, 0); + method('toChar', function(toChar) { + assertEqual(toChar(65), 'A'); + assertEqual(toChar(24536), '忘'); + assertEqual(toChar(20294), '但'); }); - method('atan', function() { - test(0, 0); - test(45, 1.5485777614681775); + method('isMultipleOf', function(isMultipleOf) { + assertEqual(isMultipleOf(2, 2), true); + assertEqual(isMultipleOf(6, 2), true); + assertEqual(isMultipleOf(100, 2), true); + assertEqual(isMultipleOf(2, 100), false); + assertEqual(isMultipleOf(100, -2), true); + assertEqual(isMultipleOf(6, -2), true); + assertEqual(isMultipleOf(6, 3), true); + assertEqual(isMultipleOf(7, 3), false); + assertEqual(isMultipleOf(2.5, 1.25), true); + assertEqual(isMultipleOf(2, 'a'), false); + assertEqual(isMultipleOf(2, /af/), false); + assertEqual(isMultipleOf(2, null), false); + assertEqual(isMultipleOf(2), false); }); - method('log', function() { - test(64, [2], 6, '64 with base 2'); - equalWithMargin(run(9, 'log', [3]), 2, 0.000000000000001, '9 with base 3'); - test(5, 1.6094379124341003, '5'); - test(Math.E, 1, 'E'); + method('isOdd', function(isOdd) { + assertEqual(isOdd(0), false); + assertEqual(isOdd(1), true); + assertEqual(isOdd(2), false); + assertEqual(isOdd(24), false); + assertEqual(isOdd(200), false); + assertEqual(isOdd(1.1), false); + assertEqual(isOdd(NaN), false); + assertEqual(isOdd(Infinity), false); + assertEqual(isOdd(-Infinity), false); }); - method('exp', function() { - equalWithMargin(run(1, 'exp', []), Math.E, 0.000000000000001); - test(0, 1); + method('isEven', function(isEven) { + assertEqual(isEven(0), true); + assertEqual(isEven(1), false); + assertEqual(isEven(2), true); + assertEqual(isEven(24), true); + assertEqual(isEven(200), true); + assertEqual(isEven(1.1), false); + assertEqual(isEven(NaN), false); + assertEqual(isEven(Infinity), false); + assertEqual(isEven(-Infinity), false); }); - method('sqrt', function() { - test(9, 3); - test(1024, 32); - }); + method('toOrdinal', function(toOrdinal) { + + assertEqual(toOrdinal(0), '0th'); + assertEqual(toOrdinal(1), '1st'); + assertEqual(toOrdinal(2), '2nd'); + assertEqual(toOrdinal(3), '3rd'); + assertEqual(toOrdinal(4), '4th'); + assertEqual(toOrdinal(5), '5th'); + assertEqual(toOrdinal(6), '6th'); + assertEqual(toOrdinal(7), '7th'); + assertEqual(toOrdinal(8), '8th'); + assertEqual(toOrdinal(9), '9th'); + assertEqual(toOrdinal(10), '10th'); + assertEqual(toOrdinal(11), '11th'); + assertEqual(toOrdinal(12), '12th'); + assertEqual(toOrdinal(13), '13th'); + assertEqual(toOrdinal(14), '14th'); + assertEqual(toOrdinal(15), '15th'); + assertEqual(toOrdinal(20), '20th'); + assertEqual(toOrdinal(21), '21st'); + assertEqual(toOrdinal(22), '22nd'); + assertEqual(toOrdinal(23), '23rd'); + assertEqual(toOrdinal(24), '24th'); + assertEqual(toOrdinal(25), '25th'); + assertEqual(toOrdinal(100), '100th'); + assertEqual(toOrdinal(101), '101st'); + assertEqual(toOrdinal(102), '102nd'); + assertEqual(toOrdinal(103), '103rd'); + assertEqual(toOrdinal(104), '104th'); + assertEqual(toOrdinal(105), '105th'); + + assertEqual(toOrdinal(-0), '0th'); + assertEqual(toOrdinal(-1), '-1st'); + assertEqual(toOrdinal(-2), '-2nd'); + assertEqual(toOrdinal(-3), '-3rd'); + assertEqual(toOrdinal(-4), '-4th'); + assertEqual(toOrdinal(-5), '-5th'); + + assertError(toOrdinal.bind(null, NaN)); + assertError(toOrdinal.bind(null, 5.55)); + assertError(toOrdinal.bind(null, null)); + assertError(toOrdinal.bind(null, undefined)); + assertError(toOrdinal.bind(null, Infinity)); - method('round', function() { - test(3, 3); - test(3.241, 3); - test(3.752, 4); - test(-3.241, -3); - test(-3.752, -4); - test(3.241, [1], 3.2, '3.241 to 1 place'); - - test(3.752, [1], 3.8, '3.752 to 1 place'); - test(3.241, [2], 3.24, '3.241 to 2 places'); - test(3.752, [2], 3.75, '3.752 to 2 places'); - - test(322855.241, [-2], 322900, '322855.241 to -2 places'); - test(322855.241, [-3], 323000, '322855.241 to -3 places'); - test(322855.241, [-4], 320000, '322855.241 to -4 places'); - test(322855.241, [-6], 0, '322855.241 to -6 places'); - test(722855.241, [-6], 1000000, '722855.241 to -6 places'); - test(722855.241, [-8], 0, '722855.241 to -8 places'); }); - method('chr', function() { - test(65, 'A'); - test(24536, '忘'); - test(20294, '但'); + method('isInteger', function(isInteger) { + assertEqual(isInteger(15), true); + assertEqual(isInteger(15.2), false); + assertEqual(isInteger(15.2668), false); + assertEqual(isInteger(15.0), true); + assertEqual(isInteger('15'), false); + assertEqual(isInteger('15.8'), false); }); - method('times', function() { - var count = 0; - var callback = function(first) { - equal(first, count, 'first parameter is the index'); - count++; - return count; - }; - var result = run(5, 'times', [callback]); - equal(result, [1,2,3,4,5], 'result should be the collected return values'); - equal(count, 5, 'iterated 5 times'); - - var fn = function() {}; - var result = run(3, 'times', [fn]); - equal(result, undefined, 'Returning undefined should return nothing'); - - var fn = function(i) { - return i || undefined; - }; - var result = run(3, 'times', [fn]); - equal(result, [1, 2], 'Mixed return values only collects non-undefined'); - - raisesError(function() { run(5, 'times', []); }, 'no callback raises error', TypeError); + method('isSafeInteger', function(isSafeInteger) { + assertEqual(isSafeInteger(-0), true); + assertEqual(isSafeInteger(0), true); + assertEqual(isSafeInteger(1), true); + assertEqual(isSafeInteger(1e255), false); + assertEqual(isSafeInteger(NaN), false); + assertEqual(isSafeInteger(Infinity), false); }); - method('isMultipleOf', function() { - test(2, [2], true, '2 is a multiple of 2'); - test(6, [2], true, '6 is a multiple of 2'); - test(100, [2], true, '100 is a multiple of 2'); - test(2, [100], false, '2 is a multiple of 100'); - test(100, [-2], true, '100 is a multiple of -2'); - test(6, [-2], true, '6 is a multiple of -2'); - test(6, [3], true, '6 is a multiple of 3'); - test(7, [3], false, '7 is a multiple of 3'); - test(2.5, [1.25], true, '2.5 is a multiple of 1.25'); - test(2, ['a'], false, 'string arguments'); - test(2, [/af/], false, 'other random arguments'); - test(2, [null], false, 'null'); - test(2, false, 'no argument passed'); + method('isFinite', function(isFinite) { + assertEqual(isFinite(-0), true); + assertEqual(isFinite(0), true); + assertEqual(isFinite(1), true); + assertEqual(isFinite(1e255), true); + assertEqual(isFinite(NaN), false); + assertEqual(isFinite(Infinity), false); + assertEqual(isFinite(-Infinity), false); }); - method('isOdd', function() { - test(0, false); - test(1, true); - test(2, false); - test(24, false); - test(200, false); - test(1.1, false); - test(NaN, false); - test(Infinity, false); - test(-Infinity, false); + method('isNaN', function(isNaN) { + assertEqual(isNaN(1), false); + assertEqual(isNaN(NaN), true); + assertEqual(isNaN(Infinity), false); + assertEqual(isNaN(-Infinity), false); }); - method('isEven', function() { - test(0, true); - test(1, false); - test(2, true); - test(24, true); - test(200, true); - test(1.1, false); - test(NaN, false); - test(Infinity, false); - test(-Infinity, false); - }); + method('times', function(times) { - method('ordinalize', function() { - test(0, '0th'); - test(1, '1st'); - test(2, '2nd'); - test(3, '3rd'); - test(4, '4th'); - test(5, '5th'); - test(6, '6th'); - test(7, '7th'); - test(8, '8th'); - test(9, '9th'); - test(10, '10th'); - test(11, '11th'); - test(12, '12th'); - test(13, '13th'); - test(14, '14th'); - test(15, '15th'); - test(20, '20th'); - test(21, '21st'); - test(22, '22nd'); - test(23, '23rd'); - test(24, '24th'); - test(25, '25th'); - test(100, '100th'); - test(101, '101st'); - test(102, '102nd'); - test(103, '103rd'); - test(104, '104th'); - test(105, '105th'); - test(111, '111th'); - test(112, '112th'); - test(113, '113th'); - test(114, '114th'); - test(-1, '-1st'); - - var OrdinalNumbers = { - "-1" : "-1st", - "-2" : "-2nd", - "-3" : "-3rd", - "-4" : "-4th", - "-5" : "-5th", - "-6" : "-6th", - "-7" : "-7th", - "-8" : "-8th", - "-9" : "-9th", - "-10" : "-10th", - "-11" : "-11th", - "-12" : "-12th", - "-13" : "-13th", - "-14" : "-14th", - "-20" : "-20th", - "-21" : "-21st", - "-22" : "-22nd", - "-23" : "-23rd", - "-24" : "-24th", - "-100" : "-100th", - "-101" : "-101st", - "-102" : "-102nd", - "-103" : "-103rd", - "-104" : "-104th", - "-110" : "-110th", - "-111" : "-111th", - "-112" : "-112th", - "-113" : "-113th", - "-1000" : "-1000th", - "-1001" : "-1001st", - "0" : "0th", - "1" : "1st", - "2" : "2nd", - "3" : "3rd", - "4" : "4th", - "5" : "5th", - "6" : "6th", - "7" : "7th", - "8" : "8th", - "9" : "9th", - "10" : "10th", - "11" : "11th", - "12" : "12th", - "13" : "13th", - "14" : "14th", - "20" : "20th", - "21" : "21st", - "22" : "22nd", - "23" : "23rd", - "24" : "24th", - "100" : "100th", - "101" : "101st", - "102" : "102nd", - "103" : "103rd", - "104" : "104th", - "110" : "110th", - "111" : "111th", - "112" : "112th", - "113" : "113th", - "1000" : "1000th", - "1001" : "1001st" + function assertTimesRan(n, actual) { + var count = 0; + times(n, function() { + count++; + }); + assertEqual(count, actual); } - testIterateOverObject(OrdinalNumbers, function(str, ordinalized) { - test(+str, ordinalized); - }); + function assertInvalidInput(n) { + assertError(function() { + times(n, function() {}); + }, TypeError); + } - }); + assertTimesRan(1, 1); + assertTimesRan(5, 5); + assertTimesRan(10, 10); - method('format', function() { - - test(100, '100'); - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1,000'); - test(10000, '10,000'); - test(100000, '100,000'); - test(1000000, '1,000,000'); - test(1000000.01, '1,000,000.01'); - test(-100, '-100'); - test(-1, '-1'); - test(-1000, '-1,000'); - test(-1000000.01, '-1,000,000.01'); - test(0.52, '0.52'); - test(9999999.99, '9,999,999.99'); - - // These discrepancies are due to floating point variable limitations. - equal(run(100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '100,046,546,510,000'); - equal(run(-100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '-100,046,546,510,000'); - - Sugar.Number.setOption('thousands', ' '); - Sugar.Number.setOption('decimal', ','); - test(1000, [null, ' '], '1 000', 'with space'); - test(1532587, [null, ' '], '1 532 587', 'larget with space'); - test(1532587.5752, [null, ' ', ','], '1 532 587,5752', 'larger number with decimal'); - - Sugar.Number.setOption('thousands', '.'); - Sugar.Number.setOption('decimal', ','); - test(9999999.99, [null, '.',','], '9.999.999,99', 'Euro style!'); - - Sugar.Number.setOption('thousands', ''); - Sugar.Number.setOption('decimal', '.'); - test(9999999.99, [null, ''], '9999999.99', 'empty string'); - - Sugar.Number.setOption('thousands', ''); - Sugar.Number.setOption('decimal', ''); - test(9999999.99, [null, '', ''], '999999999', 'no punctuation'); - - Sugar.Number.setOption('thousands', null); - Sugar.Number.setOption('decimal', null); - test(9999999.99, [null, '', ''], '9,999,999.99', 'null returns to defaults'); - - withArgs([2], function() { - test(1, '1.00'); - test(10, '10.00'); - test(100, '100.00'); - test(1000, '1,000.00'); - test(10000, '10,000.00'); - test(100000, '100,000.00'); - test(1000000, '1,000,000.00'); - - test(-1, '-1.00'); - test(-10, '-10.00'); - test(-100, '-100.00'); - test(-1000, '-1,000.00'); - test(-10000, '-10,000.00'); - test(-100000, '-100,000.00'); - test(-1000000, '-1,000,000.00'); - - test(2.435, '2.44'); - }); + assertInvalidInput(-1); + assertInvalidInput(1.5); + assertInvalidInput(NaN); + assertInvalidInput(null); + assertInvalidInput(undefined); + assertInvalidInput(Infinity); + assertInvalidInput(-Infinity); - withArgs([4], function() { - test(1, '1.0000'); - test(10, '10.0000'); - test(100, '100.0000'); - test(1000, '1,000.0000'); - test(10000, '10,000.0000'); - test(100000, '100,000.0000'); - test(1000000, '1,000,000.0000'); - test(-1, '-1.0000'); - test(-10, '-10.0000'); - test(-100, '-100.0000'); - test(-1000, '-1,000.0000'); - test(-10000, '-10,000.0000'); - test(-100000, '-100,000.0000'); - test(-1000000, '-1,000,000.0000'); - }); + assertArrayEqual(times(3, function(i) { + return Math.pow(2, i); + }), [1,2,4]); - test(553599.435, [2], '553,599.44', 'to 2 places'); - test(553599.435, [1], '553,599.4', 'to 1 place'); - test(553599.435, [0], '553,599', 'to 0 places'); - test(553599.435, [-1], '553,600', 'to -1 places'); - test(553599.435, [-2], '553,600', 'to -2 places'); - test(553599.435, [-3], '554,000', 'to -3 places'); - test(553599.435, [-4], '550,000', 'to -4 places'); - test(553599.435, [-5], '600,000', 'to -5 places'); - - // Testing object form - Sugar.Number.setOption({ - thousands: 'y' - }); - test(1000, [null, ' '], '1y000', 'y as separator'); - Sugar.Number.setOption({ - thousands: null - }); + assertArrayEqual(times(1, function(i, n) { + return n; + }), [1]); - }); + assertError(function() { + times(1); + }, TypeError); - method('pad', function() { - test(1, [0], '1', '1 no padding'); - test(1, [1], '1', '1 padded to 1 place'); - test(1, [2], '01', '1 padded to 2 places'); - test(1, [3], '001', '1 padded to 3 places'); - test(1, [4], '0001', '1 padded to 4 places'); - test(547, [0], '547', '547 no padding'); - test(547, [1], '547', '547 padded to 1 place'); - test(547, [2], '547', '547 padded to 2 places'); - test(547, [3], '547', '547 padded to 3 places'); - test(547, [4], '0547', '547 padded to 4 places'); - test(0, [0], '0', '0 no padding'); - test(0, [1], '0', '0 padded to 1 place'); - test(0, [2], '00', '0 padded to 2 places'); - test(0, [3], '000', '0 padded to 3 places'); - test(0, [4], '0000', '0 padded to 4 places'); - test(-1, [1], '-1', '-1 padded to 1 places'); - test(-1, [2], '-01', '-1 padded to 2 places'); - test(-1, [3], '-001', '-1 padded to 3 places'); - test(-1, [4], '-0001', '-1 padded to 4 places'); - test(1, [1, true], '+1', '1 padded to 1 places and sign'); - test(1, [2, true], '+01', '1 padded to 2 places and sign'); - test(1, [3, true], '+001', '1 padded to 3 places and sign'); - test(1, [4, true], '+0001', '1 padded to 4 places and sign'); - test(0, [1, true], '+0', '0 padded to 1 place and sign'); - test(547.528, [4], '0547.528', 'does not take decimal places into account'); - - test(255, [4, false, 16], '00ff', 'handles hex'); - test(2, [4, false, 2], '0010', 'handles binary'); }); - method('hex', function() { - test(0, '0'); - test(10, 'a'); - test(255, 'ff'); - test(0.5, '0.8'); - test(2.5, '2.8'); - test(2553423, '26f64f'); - - withArgs([2], function() { - test(0, '00'); - test(10, '0a'); - test(255, 'ff'); - test(0.5, '00.8'); - test(2.5, '02.8'); - }); + method('format', function(format) { - withArgs([4], function() { - test(0, '0000'); - test(10, '000a'); - test(255, '00ff'); - test(0.5, '0000.8'); - test(2.5, '0002.8'); - }); - }); + assertEqual(format(1), '1'); + assertEqual(format(10), '10'); + assertEqual(format(100), '100'); + assertEqual(format(1000), '1,000'); + assertEqual(format(1000000), '1,000,000'); + assertEqual(format(1000000000), '1,000,000,000'); - method('isInteger', function() { - test(15, true); - test(15.2, false); - test(15.2668, false); - test(15.0, true); - test('15', true); - test('15.8', false); - }); + assertEqual(format(-1), '-1'); + assertEqual(format(-10), '-10'); + assertEqual(format(-100), '-100'); + assertEqual(format(-1000), '-1,000'); + assertEqual(format(-1000000), '-1,000,000'); + assertEqual(format(-1000000000), '-1,000,000,000'); - method('abbr', function() { - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1k'); - test(10000, '10k'); - test(100000, '100k'); - test(1000000, '1m'); - test(10000000, '10m'); - test(100000000, '100m'); - test(1000000000, '1b'); - test(10000000000, '10b'); - test(100000000000, '100b'); - test(1000000000000, '1t'); - test(1000000000000000000, '1,000,000t'); - - test(1, '1'); - test(12, '12'); - test(124, '124'); - test(1249, '1k'); - test(1749, '2k'); - test(12495, '12k'); - test(17495, '17k'); - test(124958, '125k'); - test(174958, '175k'); - test(1249584, '1m'); - test(1749584, '2m'); - - withArgs([1], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2k', 'decimal 1 place | 1,249'); - test(1749, '1.7k', 'decimal 1 place | 1,749'); - test(12495, '12.5k', 'decimal 1 place | 12,495'); - test(17495, '17.5k', 'decimal 1 place | 17,495'); - test(124958, '125k', 'decimal 1 place | 124,958'); - test(174958, '175k', 'decimal 1 place | 174,958'); - test(1249584, '1.2m', 'decimal 1 place | 1,249,584'); - test(1749584, '1.7m', 'decimal 1 place | 1,749,584'); - }); + assertEqual(format( 6666.66), '6,666.66'); + assertEqual(format(-6666.66), '-6,666.66'); - withArgs([2], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25k', 'decimal 2 places | 1,249'); - test(1749, '1.75k', 'decimal 2 places | 1,749'); - test(12495, '12.5k', 'decimal 2 places | 12,495'); - test(17495, '17.5k', 'decimal 2 places | 17,495'); - test(124958, '124.96k', 'decimal 2 places | 124,958'); - test(174958, '174.96k', 'decimal 2 places | 174,958'); - test(1249584, '1.25m', 'decimal 2 places | 1,249,584'); - test(1749584, '1.75m', 'decimal 2 places | 1,749,584'); - }); + assertEqual(format( 6666.66, 1), '6,666.7'); + assertEqual(format(-6666.66, 1), '-6,666.7'); - withArgs([3], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249k', 'decimal 3 places | 1,249'); - test(1749, '1.749k', 'decimal 3 places | 1,749'); - test(12495, '12.495k', 'decimal 3 places | 12,495'); - test(17495, '17.495k', 'decimal 3 places | 17,495'); - test(124958, '124.958k', 'decimal 3 places | 124,958'); - test(174958, '174.958k', 'decimal 3 places | 174,958'); - test(1249584, '1.25m', 'decimal 3 places | 1,249,584'); - test(1749584, '1.75m', 'decimal 3 places | 1,749,584'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(1749584, '1,75m', 'should respect global decimal marker'); - Sugar.Number.setOption('decimal', null); - }); + assertEqual(format( 1000, 2), '1,000.00'); + assertEqual(format(-1000, 2), '-1,000.00'); - withArgs([-1], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0k', 'decimal -1 places | 1,249'); - test(1749, '0k', 'decimal -1 places | 1,749'); - test(12495, '10k', 'decimal -1 places | 12,495'); - test(17495, '20k', 'decimal -1 places | 17,495'); - test(124958, '120k', 'decimal -1 places | 124,958'); - test(174958, '170k', 'decimal -1 places | 174,958'); - test(1249584, '0m', 'decimal -1 places | 1,249,584'); - test(1749584, '0m', 'decimal -1 places | 1,749,584'); - }); + assertEqual(format( 6666.66, -1), '6,670'); + assertEqual(format(-6666.66, -1), '-6,670'); - test(0.1, '0', '0.1'); - test(0.01, '0', '0.01'); - test(0.001, '0', '0.001'); - test(0.0001, '0', '0.00001'); - test(0.00001, '0', '0.000001'); - test(0.000001, '0', '0.0000001'); - test(0.0000001, '0', '0.00000001'); - test(0.00000001, '0', '0.000000001'); - - test(1.1, '1', '1.1'); - test(1.01, '1', '1.01'); - test(1.001, '1', '1.001'); - test(1.0001, '1', '1.00001'); - test(1.00001, '1', '1.000001'); - test(1.000001, '1', '1.0000001'); - test(1.0000001, '1', '1.00000001'); - test(1.00000001, '1', '1.000000001'); - - test(1000.004, '1k', '1000.004'); - test(10000.004, '10k', '10,000.004'); - test(100000.004, '100k', '100,000.004'); - test(1000000.004, '1m', '1,000,000.004'); - - withArgs([2], function() { - test(1000.004, '1k', '2 places | 1000.004'); - test(10000.004, '10k', '2 places | 10,000.004'); - test(100000.004, '100k', '2 places | 100,000.004'); - test(1000000.004, '1m', '2 places | 1,000,000.004'); - }); - }); - - method('metric', function() { - - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1k'); - test(10000, '10k'); - test(100000, '100k'); - test(1000000, '1,000k'); - test(10000000, '10,000k'); - test(100000000, '100,000k'); - test(1000000000, '1,000,000k'); - test(10000000000, '10,000,000k'); - test(100000000000, '100,000,000k'); - test(1000000000000, '1,000,000,000k'); - test(10000000000000, '10,000,000,000k'); - test(100000000000000, '100,000,000,000k'); - test(1000000000000000, '1,000,000,000,000k'); - test(10000000000000000, '10,000,000,000,000k'); - test(100000000000000000, '100,000,000,000,000k'); - - test(1, '1', 'decimal | 1'); - test(12, '12', 'decimal | 12'); - test(124, '124', 'decimal | 124'); - test(1249, '1k', 'decimal | 1,249'); - test(1749, '2k', 'decimal | 1,749'); - test(12495, '12k', 'decimal | 12,495'); - test(17495, '17k', 'decimal | 17,495'); - test(124958, '125k', 'decimal | 124,958'); - test(174958, '175k', 'decimal | 174,958'); - test(1249584, '1,250k', 'decimal | 1,249,584'); - test(1749584, '1,750k', 'decimal | 1,749,584'); - test(1249584000, '1,249,584k', 'decimal | 1,249,584,000'); - test(1749584000, '1,749,584k', 'decimal | 1,749,584,000'); - - test(0.1000000000000, '100m', 'fractional | 0.1'); - test(0.0100000000000, '10m', 'fractional | 0.01'); - test(0.0010000000000, '1m', 'fractional | 0.001'); - test(0.0001000000000, '100μ', 'fractional | 0.0001'); - test(0.0000100000000, '10μ', 'fractional | 0.00001'); - test(0.0000010000000, '1μ', 'fractional | 0.000001'); - test(0.0000001000000, '100n', 'fractional | 0.0000001'); - test(0.0000000100000, '10n', 'fractional | 0.00000001'); - test(0.0000000010000, '1n', 'fractional | 0.000000001'); - test(0.0000000001000, '0.1n', 'fractional | 0.0000000001'); - test(0.0000000000100, '0.01n', 'fractional | 0.00000000001'); - test(0.0000000000010, '0.001n', 'fractional | 0.000000000001'); - test(0.0000000000001, '0.0001n', 'fractional | 0.0000000000001'); - - test(0.1111111111111, '111m', 'fractional | 0 places | 0.1111111111111'); - test(0.0111111111111, '11m', 'fractional | 0 places | 0.0111111111111'); - test(0.0011111111111, '1m', 'fractional | 0 places | 0.0011111111111'); - test(0.0001111111111, '111μ', 'fractional | 0 places | 0.0001111111111'); - test(0.0000111111111, '11μ', 'fractional | 0 places | 0.0000111111111'); - test(0.0000011111111, '1μ', 'fractional | 0 places | 0.0000011111111'); - test(0.0000001111111, '111n', 'fractional | 0 places | 0.0000001111111'); - test(0.0000000111111, '11n', 'fractional | 0 places | 0.0000000111111'); - test(0.0000000011111, '1n', 'fractional | 0 places | 0.0000000011111'); - test(0.0000000001111, '0.1n', 'fractional | 0 places | 0.0000000001111'); - test(0.0000000000111, '0.01n', 'fractional | 0 places | 0.0000000000111'); - test(0.0000000000011, '0.001n', 'fractional | 0 places | 0.0000000000011'); - test(0.0000000000001, '0.0001n', 'fractional | 0 places | 0.0000000000001'); - - test(0.000000000000000001, '1e-9n', 'fractional | 0 places | 0.0000000000001'); - - test(1.1111111111111, '1', 'fractional | 0 places | 1.1111111111111'); - test(1.0111111111111, '1', 'fractional | 0 places | 1.0111111111111'); - test(1.0011111111111, '1', 'fractional | 0 places | 1.0011111111111'); - test(1.0001111111111, '1', 'fractional | 0 places | 1.0001111111111'); - test(1.0000111111111, '1', 'fractional | 0 places | 1.0000111111111'); - test(1.0000011111111, '1', 'fractional | 0 places | 1.0000011111111'); - test(1.0000001111111, '1', 'fractional | 0 places | 1.0000001111111'); - test(1.0000000111111, '1', 'fractional | 0 places | 1.0000000111111'); - test(1.0000000011111, '1', 'fractional | 0 places | 1.0000000011111'); - test(1.0000000001111, '1', 'fractional | 0 places | 1.0000000001111'); - test(1.0000000000111, '1', 'fractional | 0 places | 1.0000000000111'); - test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); - - test(1.1000000000001, '1', 'fractional | 0 places | 1.1000000000001'); - test(1.0100000000001, '1', 'fractional | 0 places | 1.0100000000001'); - test(1.0010000000001, '1', 'fractional | 0 places | 1.0010000000001'); - test(1.0001000000001, '1', 'fractional | 0 places | 1.0001000000001'); - test(1.0000100000001, '1', 'fractional | 0 places | 1.0000100000001'); - test(1.0000010000001, '1', 'fractional | 0 places | 1.0000010000001'); - test(1.0000001000001, '1', 'fractional | 0 places | 1.0000001000001'); - test(1.0000000100001, '1', 'fractional | 0 places | 1.0000000100001'); - test(1.0000000010001, '1', 'fractional | 0 places | 1.0000000010001'); - test(1.0000000001001, '1', 'fractional | 0 places | 1.0000000001001'); - test(1.0000000000101, '1', 'fractional | 0 places | 1.0000000000101'); - test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); - - withArgs([0, 'all'], function() { - test(10000000, '10M'); - test(100000000, '100M'); - test(1000000000, '1G'); - test(10000000000, '10G'); - test(100000000000, '100G'); - test(1000000000000, '1T'); - test(10000000000000, '10T'); - test(100000000000000, '100T'); - test(1000000000000000, '1P'); - test(10000000000000000, '10P'); - test(100000000000000000, '100P'); - - test(1, '1', 'decimal | 1'); - test(12, '12', 'decimal | 12'); - test(124, '124', 'decimal | 124'); - test(1249, '1K', 'decimal | 1,249'); - test(1749, '2K', 'decimal | 1,749'); - test(12495, '12K', 'decimal | 12,495'); - test(17495, '17K', 'decimal | 17,495'); - test(124958, '125K', 'decimal | 124,958'); - test(174958, '175K', 'decimal | 174,958'); - test(1249584, '1M', 'decimal | 1,249,584'); - test(1749584, '2M', 'decimal | 1,749,584'); - test(1249584000, '1G', 'decimal | 1,249,584,000'); - test(1749584000, '2G', 'decimal | 1,749,584,000'); - }); - - withArgs([1], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2k', 'decimal 1 place | 1,249'); - test(1749, '1.7k', 'decimal 1 place | 1,749'); - test(12495, '12.5k', 'decimal 1 place | 12,495'); - test(17495, '17.5k', 'decimal 1 place | 17,495'); - test(124958, '125k', 'decimal 1 place | 124,958'); - test(174958, '175k', 'decimal 1 place | 174,958'); - test(1249584, '1,249.6k', 'decimal 1 place | 1,249,584'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(3232, [1], '3,2k', 'should respect global decimal marker'); - Sugar.Number.setOption('decimal', null); - }); + assertEqual(format( 1e6), '1,000,000'); + assertEqual(format(-1e6), '-1,000,000'); - withArgs([1, 'all'], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2K', 'decimal 1 place | 1,249'); - test(1749, '1.7K', 'decimal 1 place | 1,749'); - test(12495, '12.5K', 'decimal 1 place | 12,495'); - test(17495, '17.5K', 'decimal 1 place | 17,495'); - test(124958, '125K', 'decimal 1 place | 124,958'); - test(174958, '175K', 'decimal 1 place | 174,958'); - test(1249584, '1.2M', 'decimal 1 place | 1,249,584'); - test(1749584, '1.7M', 'decimal 1 place | 1,749,584'); - test(1249584000, '1.2G', 'decimal 1 place | 1,249,584,000'); - test(1749584000, '1.7G', 'decimal 1 place | 1,749,584,000'); - }); + assertEqual(format( 1e6, 2), '1,000,000.00'); + assertEqual(format(-1e6, 2), '-1,000,000.00'); - withArgs([2], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25k', 'decimal 2 places | 1,249'); - test(1749, '1.75k', 'decimal 2 places | 1,749'); - test(12495, '12.5k', 'decimal 2 places | 12,495'); - test(17495, '17.5k', 'decimal 2 places | 17,495'); - test(124958, '124.96k', 'decimal 2 places | 124,958'); - test(174958, '174.96k', 'decimal 2 places | 174,958'); - test(1249584, '1,249.58k', 'decimal 2 places | 1,249,584'); - }); + assertEqual(format( 0), '0'); + assertEqual(format(-0), '0'); - withArgs([2, 'all'], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25K', 'decimal 2 places | 1,249'); - test(1749, '1.75K', 'decimal 2 places | 1,749'); - test(12495, '12.5K', 'decimal 2 places | 12,495'); - test(17495, '17.5K', 'decimal 2 places | 17,495'); - test(124958, '124.96K', 'decimal 2 places | 124,958'); - test(174958, '174.96K', 'decimal 2 places | 174,958'); - test(1249584, '1.25M', 'decimal 2 places | 1,249,584'); - test(1749584, '1.75M', 'decimal 2 places | 1,749,584'); - test(1249584000, '1.25G', 'decimal 2 places | 1,249,584,000'); - test(1749584000, '1.75G', 'decimal 2 places | 1,749,584,000'); - }); + assertEqual(format( 0, 2), '0.00'); + assertEqual(format(-0, 2), '0.00'); - withArgs([3], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249k', 'decimal 3 places | 1,249'); - test(1749, '1.749k', 'decimal 3 places | 1,749'); - test(12495, '12.495k', 'decimal 3 places | 12,495'); - test(17495, '17.495k', 'decimal 3 places | 17,495'); - test(124958, '124.958k', 'decimal 3 places | 124,958'); - test(174958, '174.958k', 'decimal 3 places | 174,958'); - test(1249584, '1,249.584k', 'decimal 3 places | 1,249,584'); - }); + assertEqual(format('1000'), '1,000'); - withArgs([3, 'all'], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249K', 'decimal 3 places | 1,249'); - test(1749, '1.749K', 'decimal 3 places | 1,749'); - test(12495, '12.495K', 'decimal 3 places | 12,495'); - test(17495, '17.495K', 'decimal 3 places | 17,495'); - test(124958, '124.958K', 'decimal 3 places | 124,958'); - test(174958, '174.958K', 'decimal 3 places | 174,958'); - test(1249584, '1.25M', 'decimal 3 places | 1,249,584'); - test(1749584, '1.75M', 'decimal 3 places | 1,749,584'); - test(1249584000, '1.25G', 'decimal 3 places | 1,249,584,000'); - test(1749584000, '1.75G', 'decimal 3 places | 1,749,584,000'); - }); + assertError(function() { format(NaN); }); + assertError(function() { format(1e21); }); + assertError(function() { format(1e-6); }); + assertError(function() { format(Infinity); }); - withArgs([-1], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0k', 'decimal -1 places | 1,249'); - test(1749, '0k', 'decimal -1 places | 1,749'); - test(12495, '10k', 'decimal -1 places | 12,495'); - test(17495, '20k', 'decimal -1 places | 17,495'); - test(124958, '120k', 'decimal -1 places | 124,958'); - test(174958, '170k', 'decimal -1 places | 174,958'); - test(1249584, '1,250k', 'decimal -1 places | 1,249,584'); - }); - - withArgs([-1, 'all'], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0K', 'decimal -1 places | 1,249'); - test(1749, '0K', 'decimal -1 places | 1,749'); - test(12495, '10K', 'decimal -1 places | 12,495'); - test(17495, '20K', 'decimal -1 places | 17,495'); - test(124958, '120K', 'decimal -1 places | 124,958'); - test(174958, '170K', 'decimal -1 places | 174,958'); - test(1249584, '0M', 'decimal -1 places | 1,249,584'); - test(1749584, '0M', 'decimal -1 places | 1,749,584'); - test(1249584000, '0G', 'decimal -1 places | 1,249,584,000'); - test(1749584000, '0G', 'decimal -1 places | 1,749,584,000'); - }); + }); - withArgs([2], function() { - test(0.1111111111111, '111.11m', 'fractional | 2 places | 0.1111111111111'); - test(0.0111111111111, '11.11m', 'fractional | 2 places | 0.0111111111111'); - test(0.0011111111111, '1.11m', 'fractional | 2 places | 0.0011111111111'); - test(0.0001111111111, '111.11μ', 'fractional | 2 places | 0.0001111111111'); - test(0.0000111111111, '11.11μ', 'fractional | 2 places | 0.0000111111111'); - test(0.0000011111111, '1.11μ', 'fractional | 2 places | 0.0000011111111'); - test(0.0000001111111, '111.11n', 'fractional | 2 places | 0.0000001111111'); - test(0.0000000111111, '11.11n', 'fractional | 2 places | 0.0000000111111'); - test(0.0000000011111, '1.11n', 'fractional | 2 places | 0.0000000011111'); - test(0.0000000001111, '0.1n', 'fractional | 2 places | 0.0000000001111'); - test(0.0000000000111, '0.01n', 'fractional | 2 places | 0.0000000000111'); - test(0.0000000000011, '0.001n', 'fractional | 2 places | 0.0000000000011'); - test(0.0000000000001, '0.0001n', 'fractional | 2 places | 0.0000000000001'); - - test(1.1111111111111, '1.11', 'fractional | 2 places | 1.1111111111111'); - test(1.0111111111111, '1.01', 'fractional | 2 places | 1.0111111111111'); - test(1.0011111111111, '1', 'fractional | 2 places | 1.0011111111111'); - test(1.0001111111111, '1', 'fractional | 2 places | 1.0001111111111'); - test(1.0000111111111, '1', 'fractional | 2 places | 1.0000111111111'); - test(1.0000011111111, '1', 'fractional | 2 places | 1.0000011111111'); - test(1.0000001111111, '1', 'fractional | 2 places | 1.0000001111111'); - test(1.0000000111111, '1', 'fractional | 2 places | 1.0000000111111'); - test(1.0000000011111, '1', 'fractional | 2 places | 1.0000000011111'); - test(1.0000000001111, '1', 'fractional | 2 places | 1.0000000001111'); - test(1.0000000000111, '1', 'fractional | 2 places | 1.0000000000111'); - test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); - - test(1.1000000000001, '1.1', 'fractional | 2 places | 1.1000000000001'); - test(1.0100000000001, '1.01', 'fractional | 2 places | 1.0100000000001'); - test(1.0010000000001, '1', 'fractional | 2 places | 1.0010000000001'); - test(1.0001000000001, '1', 'fractional | 2 places | 1.0001000000001'); - test(1.0000100000001, '1', 'fractional | 2 places | 1.0000100000001'); - test(1.0000010000001, '1', 'fractional | 2 places | 1.0000010000001'); - test(1.0000001000001, '1', 'fractional | 2 places | 1.0000001000001'); - test(1.0000000100001, '1', 'fractional | 2 places | 1.0000000100001'); - test(1.0000000010001, '1', 'fractional | 2 places | 1.0000000010001'); - test(1.0000000001001, '1', 'fractional | 2 places | 1.0000000001001'); - test(1.0000000000101, '1', 'fractional | 2 places | 1.0000000000101'); - test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); - }); + method('pad', function(pad) { - equal(run(0.0001) + 'm', '100μm', '100μm'); - equal(run(0.001) + 'm', '1mm', '1mm'); - equal(run(0.01) + 'm', '10mm', '10mm'); - equal(run(0.1) + 'm', '100mm', '100mm'); - equal(run(1) + 'm', '1m', '1m'); - equal(run(1000) + 'm', '1km', '1km'); - equal(run(1000000) + 'm', '1,000km', '1,000km'); - equal(run(1000000000) + 'm', '1,000,000km', '1,000,000km'); - - withArgs([0, '|'], function() { - equal(run(1000000000) + 'm', '1,000,000,000m', 'limited to meters | 1,000,000,000m'); - equal(run(1000000) + 'm', '1,000,000m', 'limited to meters | 1,000,000m'); - equal(run(1000) + 'm', '1,000m', 'limited to meters | 1,000m'); - equal(run(1) + 'm', '1m', 'limited to meters | 1m'); - }); + assertEqual(pad(1), '1'); + assertEqual(pad(1, 0), '1'); + assertEqual(pad(1, 1), '1'); + assertEqual(pad(1, 2), '01'); + assertEqual(pad(1, 3), '001'); - test(12334.5880, '12k', 'fractional | 0 places | 12334.5880'); - test(12334.5880, [3], '12.335k', 'fractional | 3 places | 12334.5880'); - test(.588500, [9], '588.5m', 'fractional | 9 places | .5885'); - test(.580085, [9], '580.085m', 'fractional | 9 places | .580085'); - test(.580085, [7], '580.085m', 'fractional | 7 places | .580085'); - test(.580085, [5], '580.085m', 'fractional | 5 places | .580085'); - test(.580085, [3], '580.085m', 'fractional | 3 places | .580085'); - test(.580085, [1], '580.1m', 'fractional | 1 places | .580085'); - test(12323.424558, [3, '|'], '12,323.425', 'limited and 3 decimals'); + assertEqual(pad(-1), '-1'); + assertEqual(pad(-1, 0), '-1'); + assertEqual(pad(-1, 1), '-1'); + assertEqual(pad(-1, 2), '-01'); - equal(run(1, 'metric', [0, '']) + 'm', '1m', 'no format uses short'); - equal(run(1000, 'metric', [0, '|']) + 'm', '1,000m', 'simple placeholder limits'); + assertEqual(pad( 1, 2, 0, true), '+01'); + assertEqual(pad(-1, 2, 0, true), '-01'); - equal(run(1, 'metric', [0, 'm']) + 'm', '1,000mm', 'millimeter max'); - equal(run(1, 'metric', [0, 'μ_']) + 'm', '1,000,000μm', 'micrometer max'); - equal(run(1, 'metric', [0, 'n__']) + 'm', '1,000,000,000nm', 'nanometer max'); - equal(run(1, 'metric', [3, '_k']) + 'm', '0.001km', 'kilometer min'); + assertEqual(pad(5.25, 4), '0005.25'); + assertEqual(pad(5.25, 4, 0), '0005'); + assertEqual(pad(5.25, 4, 1), '0005.3'); + assertEqual(pad(5, 4, 2, true), '+0005.00'); + assertEqual(pad(5, 4, null, true), '+0005'); - equal(run(0.0000001, 'metric', [0, 'nμ_']) + 'm', '100nm', '100nm with micrometer max'); - equal(run(0.0001, 'metric', [0, 'nμ_']) + 'm', '100μm', '100μm with micrometer max'); + assertError(function() { pad(NaN); }); + assertError(function() { pad(1e21); }); + assertError(function() { pad(1e-6); }); + assertError(function() { pad(Infinity); }); - equal(run(1000000, 'metric', [3, '_KG']) + 'W', '1GW', 'minimum can format higher'); }); - method('bytes', function() { - - test(1, '1B', 'default | 1B '); - test(10, '10B', 'default | 10B '); - test(100, '100B', 'default | 100B '); - test(1000, '1KB', 'default | 1KB '); - test(10000, '10KB', 'default | 10KB '); - test(100000, '100KB', 'default | 100KB'); - test(1000000, '1MB', 'default | 1MB '); - test(10000000, '10MB', 'default | 10MB '); - test(100000000, '100MB', 'default | 100MB'); - test(1000000000, '1GB', 'default | 1GB '); - test(10000000000, '10GB', 'default | 10GB '); - test(100000000000, '100GB', 'default | 100GB'); - test(1000000000000, '1TB', 'default | 1TB '); - test(10000000000000, '10TB', 'default | 10TB '); - test(100000000000000, '100TB', 'default | 100TB'); - test(1000000000000000, '1PB', 'default | 1PB '); - test(10000000000000000, '10PB', 'default | 10PB '); - test(100000000000000000, '100PB', 'default | 100PB'); - - withArgs([2], function() { - test(1, '1B', '2 places | 1B '); - test(10, '10B', '2 places | 10B '); - test(100, '100B', '2 places | 100B '); - test(1000, '1KB', '2 places | 1KB '); - test(10000, '10KB', '2 places | 10KB '); - test(100000, '100KB', '2 places | 100KB'); - test(1000000, '1MB', '2 places | 1MB '); - test(10000000, '10MB', '2 places | 10MB '); - test(100000000, '100MB', '2 places | 100MB'); - test(1000000000, '1GB', '2 places | 1GB '); - test(10000000000, '10GB', '2 places | 10GB '); - test(100000000000, '100GB', '2 places | 100GB'); - test(1000000000000, '1TB', '2 places | 1TB '); - test(10000000000000, '10TB', '2 places | 10TB '); - test(100000000000000, '100TB', '2 places | 100TB'); - test(1000000000000000, '1PB', '2 places | 1PB '); - test(10000000000000000, '10PB', '2 places | 10PB '); - test(100000000000000000, '100PB', '2 places | 100PB'); - }); + method('toHex', function(toHex) { - withArgs([0, true], function() { - test(1, '1B', '0 places | base 2 | 1B '); - test(10, '10B', '0 places | base 2 | 10B '); - test(100, '100B', '0 places | base 2 | 100B '); - test(1000, '1KiB', '0 places | base 2 | 1KiB '); - test(10000, '10KiB', '0 places | base 2 | 10KiB '); - test(100000, '98KiB', '0 places | base 2 | 100KiB'); - test(1000000, '1MiB', '0 places | base 2 | 1MiB '); - test(10000000, '10MiB', '0 places | base 2 | 10MiB '); - test(100000000, '95MiB', '0 places | base 2 | 100MiB'); - test(1000000000, '1GiB', '0 places | base 2 | 1GiB '); - test(10000000000, '9GiB', '0 places | base 2 | 10GiB '); - test(100000000000, '93GiB', '0 places | base 2 | 100GiB'); - test(1000000000000, '1TiB', '0 places | base 2 | 1TiB '); - test(10000000000000, '9TiB', '0 places | base 2 | 10TiB '); - test(100000000000000, '91TiB', '0 places | base 2 | 100TiB'); - test(1000000000000000, '1PiB', '0 places | base 2 | 1PiB '); - test(10000000000000000, '9PiB', '0 places | base 2 | 10PiB '); - test(100000000000000000, '89PiB', '0 places | base 2 | 100PiB'); - }); + assertEqual(toHex(0), '0'); + assertEqual(toHex(0, 2), '00'); - withArgs([2, true], function() { - - test(1, '1B', '2 places | base 2 | 1B '); - test(10, '10B', '2 places | base 2 | 10B '); - test(100, '100B', '2 places | base 2 | 100B '); - test(1000, '0.98KiB', '2 places | base 2 | 1KB '); - test(10000, '9.77KiB', '2 places | base 2 | 10KB '); - test(100000, '97.66KiB', '2 places | base 2 | 100KB'); - test(1000000, '0.95MiB', '2 places | base 2 | 1MB '); - test(10000000, '9.54MiB', '2 places | base 2 | 10MB '); - test(100000000, '95.37MiB', '2 places | base 2 | 100MB'); - test(1000000000, '0.93GiB', '2 places | base 2 | 1GB '); - test(10000000000, '9.31GiB', '2 places | base 2 | 10GB '); - test(100000000000, '93.13GiB', '2 places | base 2 | 100GB'); - test(1000000000000, '0.91TiB', '2 places | base 2 | 1TB '); - test(10000000000000, '9.09TiB', '2 places | base 2 | 10TB '); - test(100000000000000, '90.95TiB', '2 places | base 2 | 100TB'); - test(1000000000000000, '0.89PiB', '2 places | base 2 | 1PB '); - test(10000000000000000, '8.88PiB', '2 places | base 2 | 10PB '); - test(100000000000000000, '88.82PiB', '2 places | base 2 | 100PB'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(1000, '0,98KiB', 'should respect global decimal'); - Sugar.Number.setOption('decimal', null); + assertEqual(toHex(255), 'ff'); + assertEqual(toHex(255, 4), '00ff'); - }); + assertEqual(toHex(255.5, 4), '00ff.8'); - withArgs([0, true, 'si'], function() { - test(1, '1B', 'base 2 with si units | 1B '); - test(10, '10B', 'base 2 with si units | 10B '); - test(100, '100B', 'base 2 with si units | 100B '); - test(1000, '1KB', 'base 2 with si units | 1KB '); - test(10000, '10KB', 'base 2 with si units | 10KB '); - test(100000, '98KB', 'base 2 with si units | 100KB'); - test(1000000, '1MB', 'base 2 with si units | 1MB '); - test(10000000, '10MB', 'base 2 with si units | 10MB '); - test(100000000, '95MB', 'base 2 with si units | 100MB'); - test(1000000000, '1GB', 'base 2 with si units | 1GB '); - test(10000000000, '9GB', 'base 2 with si units | 10GB '); - test(100000000000, '93GB', 'base 2 with si units | 100GB'); - test(1000000000000, '1TB', 'base 2 with si units | 1TB '); - test(10000000000000, '9TB', 'base 2 with si units | 10TB '); - test(100000000000000, '91TB', 'base 2 with si units | 100TB'); - test(1000000000000000, '1PB', 'base 2 with si units | 1PB '); - test(10000000000000000, '9PB', 'base 2 with si units | 10PB '); - test(100000000000000000, '89PB', 'base 2 with si units | 100PB'); - }); + assertError(function() { toHex(NaN); }); + assertError(function() { toHex(1e21); }); + assertError(function() { toHex(1e-6); }); + assertError(function() { toHex(Infinity); }); - withArgs([0, false, 'binary'], function() { - - test(1, '1B', 'base 10 with binary units | 1B '); - test(10, '10B', 'base 10 with binary units | 10B '); - test(100, '100B', 'base 10 with binary units | 100B '); - test(1000, '1KiB', 'base 10 with binary units | 1KiB '); - test(10000, '10KiB', 'base 10 with binary units | 10KiB '); - test(100000, '100KiB', 'base 10 with binary units | 100KiB'); - test(1000000, '1MiB', 'base 10 with binary units | 1MiB '); - test(10000000, '10MiB', 'base 10 with binary units | 10MiB '); - test(100000000, '100MiB', 'base 10 with binary units | 100MiB'); - test(1000000000, '1GiB', 'base 10 with binary units | 1GiB '); - test(10000000000, '10GiB', 'base 10 with binary units | 10GiB '); - test(100000000000, '100GiB', 'base 10 with binary units | 100GiB'); - test(1000000000000, '1TiB', 'base 10 with binary units | 1TiB '); - test(10000000000000, '10TiB', 'base 10 with binary units | 10TiB '); - test(100000000000000, '100TiB', 'base 10 with binary units | 100TiB'); - test(1000000000000000, '1PiB', 'base 10 with binary units | 1PiB '); - test(10000000000000000, '10PiB', 'base 10 with binary units | 10PiB '); - test(100000000000000000, '100PiB', 'base 10 with binary units | 100PiB'); + }); + method('abbr', function(abbr) { + + // Positive + assertEqual(abbr(0), '0'); + assertEqual(abbr(1), '1'); + assertEqual(abbr(10), '10'); + assertEqual(abbr(100), '100'); + assertEqual(abbr(999), '999'); + assertEqual(abbr(1000), '1k'); + assertEqual(abbr(1999), '1k'); + assertEqual(abbr(10000), '10k'); + assertEqual(abbr(100000), '100k'); + assertEqual(abbr(1000000), '1m'); + assertEqual(abbr(1000000000), '1b'); + assertEqual(abbr(1000000000000), '1t'); + assertEqual(abbr(1000000000000000), '1,000t'); + + // Negative + assertEqual(abbr(-1), '-1'); + assertEqual(abbr(-10), '-10'); + assertEqual(abbr(-100), '-100'); + assertEqual(abbr(-1000), '-1k'); + assertEqual(abbr(-10000), '-10k'); + assertEqual(abbr(-100000), '-100k'); + assertEqual(abbr(-1000000), '-1m'); + assertEqual(abbr(-1000000000), '-1b'); + assertEqual(abbr(-1000000000000), '-1t'); + assertEqual(abbr(-1000000000000000), '-1,000t'); + + // Decimal + assertEqual(abbr(0.1), '0.1'); + assertEqual(abbr(0.01), '0.01'); + assertEqual(abbr(0.001), '0.001'); + assertEqual(abbr(0.0001), '0.0001'); + assertEqual(abbr(1000000.25), '1m'); + + // With Precision + assertEqual(abbr(0, 0), '0'); + assertEqual(abbr(0, -1), '0'); + assertEqual(abbr(1748), '1k'); + assertEqual(abbr(1748, 1), '1.7k'); + assertEqual(abbr(1748, 2), '1.74k'); + assertEqual(abbr(1748, 3), '1.748k'); + assertEqual(abbr(1748, -1), '1k'); + assertEqual(abbr(155555, 0), '155k'); + assertEqual(abbr(155555, -1), '150k'); + assertEqual(abbr(155555, -2), '100k'); + assertEqual(abbr(155555, -3), '100k'); + assertEqual(abbr(-1748), '-1k'); + assertEqual(abbr(-1748, 1), '-1.7k'); + assertEqual(abbr(-1748, 2), '-1.74k'); + assertEqual(abbr(-1748, 3), '-1.748k'); + assertEqual(abbr(-155555, 0), '-155k'); + assertEqual(abbr(-155555, -1), '-150k'); + assertEqual(abbr(-155555, -2), '-100k'); + + // Common si + assertEqual(abbr(1, 0, 'common') + 'm', '1m'); + assertEqual(abbr(10, 0, 'common') + 'm', '10m'); + assertEqual(abbr(100, 0, 'common') + 'm', '100m'); + assertEqual(abbr(1000, 0, 'common') + 'm', '1km'); + assertEqual(abbr(10000, 0, 'common') + 'm', '10km'); + assertEqual(abbr(10000000, 0, 'common') + 'm', '10,000km'); + + assertEqual(abbr(9, 0, 'common') + 'm', '9m'); + assertEqual(abbr(99, 0, 'common') + 'm', '99m'); + assertEqual(abbr(999, 0, 'common') + 'm', '999m'); + assertEqual(abbr(9999, 0, 'common') + 'm', '9km'); + assertEqual(abbr(99999, 0, 'common') + 'm', '99km'); + assertEqual(abbr(99999999, 0, 'common') + 'm', '99,999km'); + + assertEqual(abbr(.1, 0, 'common') + 'm', '100mm'); + assertEqual(abbr(.01, 0, 'common') + 'm', '10mm'); + assertEqual(abbr(.001, 0, 'common') + 'm', '1mm'); + assertEqual(abbr(.0001, 0, 'common') + 'm', '100μm'); + assertEqual(abbr(.00001, 0, 'common') + 'm', '10μm'); + assertEqual(abbr(.000001, 0, 'common') + 'm', '1μm'); + assertEqual(abbr(.0000001, 0, 'common') + 'm', '100nm'); + assertEqual(abbr(.00000001, 0, 'common') + 'm', '10nm'); + assertEqual(abbr(.000000001, 0, 'common') + 'm', '1nm'); + + assertEqual(abbr(.9, 0, 'common') + 'm', '900mm'); + assertEqual(abbr(.09, 0, 'common') + 'm', '90mm'); + assertEqual(abbr(.009, 0, 'common') + 'm', '9mm'); + assertEqual(abbr(.0009, 0, 'common') + 'm', '900μm'); + assertEqual(abbr(.00009, 0, 'common') + 'm', '90μm'); + assertEqual(abbr(.000009, 0, 'common') + 'm', '9μm'); + assertEqual(abbr(.0000009, 0, 'common') + 'm', '900nm'); + assertEqual(abbr(.00000009, 0, 'common') + 'm', '90nm'); + assertEqual(abbr(.000000009, 0, 'common') + 'm', '9nm'); + + // Full si + assertEqual(abbr(1, 0, 'metric'), '1'); + assertEqual(abbr(1000, 0, 'metric'), '1K'); + assertEqual(abbr(1000000, 0, 'metric'), '1M'); + assertEqual(abbr(1000000000, 0, 'metric'), '1G'); + assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); + assertEqual(abbr(1000000000000000000000000, 0, 'metric'), '1Y'); + assertEqual(abbr(1000000000000000000000000000, 0, 'metric'), '1,000Y'); + + assertEqual(abbr(.001, 0, 'metric'), '1m'); + assertEqual(abbr(.000001, 0, 'metric'), '1μ'); + assertEqual(abbr(.000000001, 0, 'metric'), '1n'); + assertEqual(abbr(.000000000001, 0, 'metric'), '1p'); + assertEqual(abbr(.000000000000001, 0, 'metric'), '1f'); + assertEqual(abbr(.000000000000000001, 0, 'metric'), '1a'); + assertEqual(abbr(.000000000000000000001, 0, 'metric'), '1z'); + assertEqual(abbr(.000000000000000000000001, 0, 'metric'), '1y'); + assertEqual(abbr(.000000000000000000000000001, 0, 'metric'), '0'); + assertEqual(abbr(.000000000000000000000000001, null, 'metric'), '0.001y'); + + // Binary (Base 2) + assertEqual(abbr(1, 0, 'binary'), '1'); + assertEqual(abbr(Math.pow(2, 10), 0, 'binary') + 'B', '1KB'); + assertEqual(abbr(Math.pow(2, 20), 0, 'binary') + 'B', '1MB'); + assertEqual(abbr(Math.pow(2, 30), 0, 'binary') + 'B', '1GB'); + assertEqual(abbr(Math.pow(2, 40), 0, 'binary') + 'B', '1TB'); + assertEqual(abbr(Math.pow(2, 50), 0, 'binary') + 'B', '1PB'); + assertEqual(abbr(Math.pow(2, 60), 0, 'binary') + 'B', '1EB'); + assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1ZB'); + + assertEqual(abbr(Math.pow(2, 10) - Math.pow(2, 0), 0, 'binary') + 'B', '1,023B'); + assertEqual(abbr(Math.pow(2, 20) - Math.pow(2, 10), 0, 'binary') + 'B', '1,023KB'); + assertEqual(abbr(Math.pow(2, 30) - Math.pow(2, 20), 0, 'binary') + 'B', '1,023MB'); + assertEqual(abbr(Math.pow(2, 40) - Math.pow(2, 30), 0, 'binary') + 'B', '1,023GB'); + assertEqual(abbr(Math.pow(2, 50) - Math.pow(2, 40), 0, 'binary') + 'B', '1,023TB'); + assertEqual(abbr(Math.pow(2, 60) - Math.pow(2, 50), 0, 'binary') + 'B', '1,023PB'); + assertEqual(abbr(Math.pow(2, 70) - Math.pow(2, 60), 0, 'binary') + 'B', '1,023EB'); + + // Memory (Base 10) + assertEqual(abbr(1, 0, 'metric'), '1'); + assertEqual(abbr(1000, 0, 'metric'), '1K'); + assertEqual(abbr(1000000, 0, 'metric'), '1M'); + assertEqual(abbr(1000000000, 0, 'metric'), '1G'); + assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); + + // Other + assertEqual(abbr(1755, 2, 'integer'), '1.75k'); + assertEqual(abbr(17555, 2, '|'), '17,555'); + assertEqual(abbr(.17555, 2, '|'), '0.17'); + assertEqual(abbr(.17555, null, '|'), '0.17555'); + assertEqual(abbr(17555, 0, 'x|y'), '17x'); + assertEqual(abbr(.17555, 0, 'x|y'), '175y'); + assertEqual(abbr(175000, null, 'm-|'), '0.175m'); + assertEqual(abbr(175000000, null, 'bm-|'), '175m'); + assertEqual(abbr(.175, 0, 'x|-μ'), '175,000μ'); + + // Errors + assertError(function() { abbr(NaN); }); + assertError(function() { abbr(Infinity); }); + assertError(function() { abbr(null); }); + assertError(function() { abbr(undefined); }); + + withNumberFormatter('de-DE', function(formatter) { + assertEqual(abbr(1755, 1, 'integer', formatter), '1,7k'); + assertEqual(abbr(1755, 2, 'integer', formatter), '1,75k'); }); - test(1024, [0, true], '1KiB', '1024 bytes is 1KiB'); - test(1048576, [0, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); - test(1024, [2, true], '1KiB', '2 places | 1024 bytes is 1KiB'); - test(1048576, [2, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); - - test(Math.pow(10, 16), [0, true], '9PiB', '10 ^ 16 bytes'); - test(Math.pow(10, 16), [-2, true], '0PiB', '10 ^ 16 bytes | -2 places'); }); }); From 761db84062bc8d62e34440e486d8730cea29bb78 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 22 Dec 2018 22:19:28 +0900 Subject: [PATCH 012/191] Ensuring that the namespace defines the methods. --- package.json | 2 +- src/core/index.js | 23 ++++----- src/number/abbr/define.js | 3 ++ src/number/{abbr.js => abbr/index.js} | 15 +++--- src/number/abs/define.js | 3 ++ src/number/{abs.js => abs/index.js} | 6 +-- src/number/ceil.js | 3 -- src/number/ceil/define.js | 3 ++ src/number/ceil/index.js | 1 + src/number/exp.js | 2 - src/number/exp/define.js | 3 ++ src/number/exp/index.js | 1 + src/number/floor.js | 3 -- src/number/floor/define.js | 3 ++ src/number/floor/index.js | 1 + src/number/format.js | 3 -- src/number/format/define.js | 3 ++ src/number/format/index.js | 1 + src/number/index.js | 48 +++++++++---------- src/number/isEven.js | 6 --- src/number/isEven/define.js | 3 ++ src/number/isEven/index.js | 5 ++ src/number/isFinite.js | 2 - src/number/isFinite/define.js | 3 ++ src/number/isFinite/index.js | 1 + src/number/isInteger.js | 2 - src/number/isInteger/define.js | 3 ++ src/number/isInteger/index.js | 1 + src/number/isMultipleOf.js | 3 -- src/number/isMultipleOf/define.js | 3 ++ src/number/isMultipleOf/index.js | 1 + src/number/isNaN.js | 2 - src/number/isNaN/define.js | 3 ++ src/number/isNaN/index.js | 1 + src/number/isOdd.js | 6 --- src/number/isOdd/define.js | 3 ++ src/number/isOdd/index.js | 5 ++ src/number/isSafeInteger.js | 2 - src/number/isSafeInteger/define.js | 3 ++ src/number/isSafeInteger/index.js | 1 + src/number/log.js | 9 ---- src/number/log/define.js | 3 ++ src/number/log/index.js | 7 +++ src/number/pad.js | 3 -- src/number/pad/define.js | 3 ++ src/number/pad/index.js | 1 + src/number/pow.js | 2 - src/number/pow/define.js | 3 ++ src/number/pow/index.js | 1 + src/number/random/define.js | 3 ++ src/number/{random.js => random/index.js} | 6 +-- src/number/round.js | 3 -- src/number/round/define.js | 3 ++ src/number/round/index.js | 1 + src/number/sqrt.js | 2 - src/number/sqrt/define.js | 3 ++ src/number/sqrt/index.js | 1 + src/number/times.js | 11 ----- src/number/times/define.js | 3 ++ src/number/times/index.js | 10 ++++ src/number/toChar/define.js | 3 ++ src/number/{toChar.js => toChar/index.js} | 6 +-- src/number/toHex.js | 6 --- src/number/toHex/define.js | 3 ++ src/number/toHex/index.js | 5 ++ src/number/toOrdinal.js | 4 -- src/number/toOrdinal/define.js | 3 ++ src/number/toOrdinal/index.js | 1 + src/number/trunc.js | 3 -- src/number/trunc/define.js | 3 ++ src/number/trunc/index.js | 1 + src/number/util/math.js | 39 +++++++++------ test/helpers/suite.js | 33 ++++++++++--- test/index.js | 8 ++-- .../modules/{plugin.js => plugin-entry.js} | 0 ...lugin-method.js => plugin-method-entry.js} | 0 test/tests/modules/sugar-entry.js | 22 +++++++++ test/tests/modules/sugar-method-entry.js | 15 ++++++ test/tests/modules/sugar-namespace-entry.js | 26 ++++++++++ test/tests/modules/sugar.js | 14 ------ test/tests/number.js | 48 +++++++++---------- 81 files changed, 306 insertions(+), 201 deletions(-) create mode 100644 src/number/abbr/define.js rename src/number/{abbr.js => abbr/index.js} (92%) create mode 100644 src/number/abs/define.js rename src/number/{abs.js => abs/index.js} (71%) delete mode 100644 src/number/ceil.js create mode 100644 src/number/ceil/define.js create mode 100644 src/number/ceil/index.js delete mode 100644 src/number/exp.js create mode 100644 src/number/exp/define.js create mode 100644 src/number/exp/index.js delete mode 100644 src/number/floor.js create mode 100644 src/number/floor/define.js create mode 100644 src/number/floor/index.js delete mode 100644 src/number/format.js create mode 100644 src/number/format/define.js create mode 100644 src/number/format/index.js delete mode 100644 src/number/isEven.js create mode 100644 src/number/isEven/define.js create mode 100644 src/number/isEven/index.js delete mode 100644 src/number/isFinite.js create mode 100644 src/number/isFinite/define.js create mode 100644 src/number/isFinite/index.js delete mode 100644 src/number/isInteger.js create mode 100644 src/number/isInteger/define.js create mode 100644 src/number/isInteger/index.js delete mode 100644 src/number/isMultipleOf.js create mode 100644 src/number/isMultipleOf/define.js create mode 100644 src/number/isMultipleOf/index.js delete mode 100644 src/number/isNaN.js create mode 100644 src/number/isNaN/define.js create mode 100644 src/number/isNaN/index.js delete mode 100644 src/number/isOdd.js create mode 100644 src/number/isOdd/define.js create mode 100644 src/number/isOdd/index.js delete mode 100644 src/number/isSafeInteger.js create mode 100644 src/number/isSafeInteger/define.js create mode 100644 src/number/isSafeInteger/index.js delete mode 100644 src/number/log.js create mode 100644 src/number/log/define.js create mode 100644 src/number/log/index.js delete mode 100644 src/number/pad.js create mode 100644 src/number/pad/define.js create mode 100644 src/number/pad/index.js delete mode 100644 src/number/pow.js create mode 100644 src/number/pow/define.js create mode 100644 src/number/pow/index.js create mode 100644 src/number/random/define.js rename src/number/{random.js => random/index.js} (52%) delete mode 100644 src/number/round.js create mode 100644 src/number/round/define.js create mode 100644 src/number/round/index.js delete mode 100644 src/number/sqrt.js create mode 100644 src/number/sqrt/define.js create mode 100644 src/number/sqrt/index.js delete mode 100644 src/number/times.js create mode 100644 src/number/times/define.js create mode 100644 src/number/times/index.js create mode 100644 src/number/toChar/define.js rename src/number/{toChar.js => toChar/index.js} (67%) delete mode 100644 src/number/toHex.js create mode 100644 src/number/toHex/define.js create mode 100644 src/number/toHex/index.js delete mode 100644 src/number/toOrdinal.js create mode 100644 src/number/toOrdinal/define.js create mode 100644 src/number/toOrdinal/index.js delete mode 100644 src/number/trunc.js create mode 100644 src/number/trunc/define.js create mode 100644 src/number/trunc/index.js rename test/tests/modules/{plugin.js => plugin-entry.js} (100%) rename test/tests/modules/{plugin-method.js => plugin-method-entry.js} (100%) create mode 100644 test/tests/modules/sugar-entry.js create mode 100644 test/tests/modules/sugar-method-entry.js create mode 100644 test/tests/modules/sugar-namespace-entry.js delete mode 100644 test/tests/modules/sugar.js diff --git a/package.json b/package.json index f38d69dec..8f421f66b 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.22", + "ready-test": "^1.0.23", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", diff --git a/src/core/index.js b/src/core/index.js index 4cb5c4eda..423f9a680 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -10,11 +10,6 @@ import { isString, isFunction } from '../util/typeChecks'; const SUGAR = 'Sugar'; -const ERROR_METHOD_DEFINED = 'Method already defined'; -const ERROR_NATIVE_UNKNOWN = 'Built-in class does not exist'; -const ERROR_EXTEND_CONFLICT = 'Extend options cannot have both include and exclude'; -const ERROR_UNNAMED_FUNCTION = 'Function requires a name'; - export const VERSION = 'edge'; @@ -25,7 +20,7 @@ const instanceMethods = new NamespaceStore(); export function createNamespace(globalName) { if (!globalContext[globalName]) { - throw new Error(ERROR_NATIVE_UNKNOWN); + throw new Error(`Built-in class ${globalName} does not exist`); } if (Sugar[globalName]) { @@ -39,19 +34,19 @@ export function createNamespace(globalName) { } static defineStatic(...args) { - return defineWithArgs(globalName, defineStatic, args); + defineWithArgs(globalName, defineStatic, args); } static defineInstance(...args) { - return defineWithArgs(globalName, defineInstance, args); + defineWithArgs(globalName, defineInstance, args); } static defineStaticAlias(str, fn) { - return defineAliases(globalName, defineStatic, str, fn); + defineAliases(globalName, defineStatic, str, fn); } static defineInstanceAlias(str, fn) { - return defineAliases(globalName, defineInstance, str, fn); + defineAliases(globalName, defineInstance, str, fn); } } @@ -91,7 +86,6 @@ function defineStatic(globalName, methodName, staticFn) { // is mostly for the test suite. instanceMethods.remove(globalName, methodName, true); SugarChainable[methodName] = staticFn; - return staticFn; } function defineInstance(globalName, methodName, staticFn) { @@ -101,18 +95,17 @@ function defineInstance(globalName, methodName, staticFn) { instanceMethods.set(globalName, methodName, instanceFn, true); SugarChainable.prototype[methodName] = wrapReturnWithChainable(instanceFn); SugarChainable[methodName] = staticFn; - return staticFn; } function assertMethodDoesNotExist(SugarChainable, methodName) { if (SugarChainable[methodName]) { - throw new Error(ERROR_METHOD_DEFINED); + throw new Error(`Method ${methodName} is already defined`); } } function assertNamedFunction(fn) { if (!fn.name) { - throw new TypeError(ERROR_UNNAMED_FUNCTION); + throw new TypeError(`Function requires a name: ${fn}`); } } @@ -162,7 +155,7 @@ function extendIsAllowed(name, opt) { const included = extendOptionsInclude(name, opt); const excluded = extendOptionsExclude(name, opt); if (included && excluded) { - throw new Error(ERROR_EXTEND_CONFLICT); + throw new Error('Extend options cannot have both include and exclude'); } const isImplicitlyIncluded = !opt || !opt.include; return included || (isImplicitlyIncluded && !excluded); diff --git a/src/number/abbr/define.js b/src/number/abbr/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/abbr/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/abbr.js b/src/number/abbr/index.js similarity index 92% rename from src/number/abbr.js rename to src/number/abbr/index.js index 8098f61c4..ef1d0188b 100644 --- a/src/number/abbr.js +++ b/src/number/abbr/index.js @@ -1,9 +1,8 @@ -import { defineInstance } from '../core/number'; -import { assertFinite } from '../util/assertions'; -import { trunc, round } from './util/math'; -import { isNumber } from '../util/typeChecks'; -import format from './util/format'; -import clamp from './util/clamp'; +import { assertFinite } from '../../util/assertions'; +import { trunc, round } from './../util/math'; +import { isNumber } from '../../util/typeChecks'; +import format from './../util/format'; +import clamp from './../util/clamp'; /** * @typedef {"integer"|"common"|"metric"|"binary"} UnitAlias @@ -64,7 +63,7 @@ const SAFE_PRECISION = 10; * abbr(1234, 2, null, deFormatter); // "1,23k" * */ -function abbr(n, precision, units, formatter) { +export default function abbr(n, precision, units, formatter) { assertFinite(n); @@ -162,5 +161,3 @@ function getSafe(n) { // Math.logN implementations by rounding up front. return round(n, SAFE_PRECISION); } - -export default defineInstance(abbr); diff --git a/src/number/abs/define.js b/src/number/abs/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/abs/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/abs.js b/src/number/abs/index.js similarity index 71% rename from src/number/abs.js rename to src/number/abs/index.js index 390073c81..7daf88b8b 100644 --- a/src/number/abs.js +++ b/src/number/abs/index.js @@ -1,9 +1,7 @@ -import { defineInstance } from '../core/number'; - -export default defineInstance(function abs(n) { +export default function abs(n) { // Note that .valueOf() here is only required due to a // very strange bug in iOS7 that only occurs occasionally // in which Math.abs() called on non-primitive numbers // returns a completely different number (Issue #400) return Math.abs(n.valueOf()); -}); +} diff --git a/src/number/ceil.js b/src/number/ceil.js deleted file mode 100644 index 14936e075..000000000 --- a/src/number/ceil.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import { ceil } from './util/math'; -export default defineInstance('ceil', ceil); diff --git a/src/number/ceil/define.js b/src/number/ceil/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/ceil/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/ceil/index.js b/src/number/ceil/index.js new file mode 100644 index 000000000..8997a2059 --- /dev/null +++ b/src/number/ceil/index.js @@ -0,0 +1 @@ +export { ceil as default } from '../util/math'; diff --git a/src/number/exp.js b/src/number/exp.js deleted file mode 100644 index 56d956c17..000000000 --- a/src/number/exp.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Math.exp); diff --git a/src/number/exp/define.js b/src/number/exp/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/exp/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/exp/index.js b/src/number/exp/index.js new file mode 100644 index 000000000..101a23811 --- /dev/null +++ b/src/number/exp/index.js @@ -0,0 +1 @@ +export default Math.exp; diff --git a/src/number/floor.js b/src/number/floor.js deleted file mode 100644 index 585859cfd..000000000 --- a/src/number/floor.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import { floor } from './util/math'; -export default defineInstance('floor', floor); diff --git a/src/number/floor/define.js b/src/number/floor/define.js new file mode 100644 index 000000000..55dd418ff --- /dev/null +++ b/src/number/floor/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance('floor', fn); diff --git a/src/number/floor/index.js b/src/number/floor/index.js new file mode 100644 index 000000000..6130cfa1b --- /dev/null +++ b/src/number/floor/index.js @@ -0,0 +1 @@ +export { floor as default } from '../util/math'; diff --git a/src/number/format.js b/src/number/format.js deleted file mode 100644 index 0afc2065b..000000000 --- a/src/number/format.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import format from './util/format'; -export default defineInstance(format); diff --git a/src/number/format/define.js b/src/number/format/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/format/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/format/index.js b/src/number/format/index.js new file mode 100644 index 000000000..be007f329 --- /dev/null +++ b/src/number/format/index.js @@ -0,0 +1 @@ +export { default } from '../util/format'; diff --git a/src/number/index.js b/src/number/index.js index cc2ec4cba..c105841a5 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -1,29 +1,29 @@ import SugarNumber from '../core/number'; -import './abbr'; -import './abs'; -import './ceil'; -import './exp'; -import './floor'; -import './format'; -import './isEven'; -import './isFinite'; -import './isInteger'; -import './isMultipleOf'; -import './isNaN'; -import './isOdd'; -import './isSafeInteger'; -import './log'; -import './pad'; -import './pow'; -import './random'; -import './round'; -import './sqrt'; -import './times'; -import './toChar'; -import './toHex'; -import './toOrdinal'; -import './trunc'; +import './abbr/define'; +import './abs/define'; +import './ceil/define'; +import './exp/define'; +import './floor/define'; +import './format/define'; +import './isEven/define'; +import './isFinite/define'; +import './isInteger/define'; +import './isMultipleOf/define'; +import './isNaN/define'; +import './isOdd/define'; +import './isSafeInteger/define'; +import './log/define'; +import './pad/define'; +import './pow/define'; +import './random/define'; +import './round/define'; +import './sqrt/define'; +import './times/define'; +import './toChar/define'; +import './toHex/define'; +import './toOrdinal/define'; +import './trunc/define'; export const { abbr, diff --git a/src/number/isEven.js b/src/number/isEven.js deleted file mode 100644 index 76828caee..000000000 --- a/src/number/isEven.js +++ /dev/null @@ -1,6 +0,0 @@ -import { defineInstance } from '../core/number'; -import isMultipleOf from './util/isMultipleOf'; - -export default defineInstance(function isEven(n) { - return Number.isInteger(n) && isMultipleOf(n, 2); -}); diff --git a/src/number/isEven/define.js b/src/number/isEven/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isEven/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isEven/index.js b/src/number/isEven/index.js new file mode 100644 index 000000000..239dc0a15 --- /dev/null +++ b/src/number/isEven/index.js @@ -0,0 +1,5 @@ +import isMultipleOf from '../util/isMultipleOf'; + +export default function isEven(n) { + return Number.isInteger(n) && isMultipleOf(n, 2); +} diff --git a/src/number/isFinite.js b/src/number/isFinite.js deleted file mode 100644 index aa09d296e..000000000 --- a/src/number/isFinite.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Number.isFinite); diff --git a/src/number/isFinite/define.js b/src/number/isFinite/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isFinite/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isFinite/index.js b/src/number/isFinite/index.js new file mode 100644 index 000000000..3f566a350 --- /dev/null +++ b/src/number/isFinite/index.js @@ -0,0 +1 @@ +export default Number.isFinite; diff --git a/src/number/isInteger.js b/src/number/isInteger.js deleted file mode 100644 index 1d8fe44ab..000000000 --- a/src/number/isInteger.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Number.isInteger); diff --git a/src/number/isInteger/define.js b/src/number/isInteger/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isInteger/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isInteger/index.js b/src/number/isInteger/index.js new file mode 100644 index 000000000..66ee1a4ba --- /dev/null +++ b/src/number/isInteger/index.js @@ -0,0 +1 @@ +export default Number.isInteger; diff --git a/src/number/isMultipleOf.js b/src/number/isMultipleOf.js deleted file mode 100644 index f0a6861ac..000000000 --- a/src/number/isMultipleOf.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import isMultipleOf from './util/isMultipleOf'; -export default defineInstance(isMultipleOf); diff --git a/src/number/isMultipleOf/define.js b/src/number/isMultipleOf/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isMultipleOf/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isMultipleOf/index.js b/src/number/isMultipleOf/index.js new file mode 100644 index 000000000..fd2a42943 --- /dev/null +++ b/src/number/isMultipleOf/index.js @@ -0,0 +1 @@ +export { default } from '../util/isMultipleOf'; diff --git a/src/number/isNaN.js b/src/number/isNaN.js deleted file mode 100644 index 3add7120c..000000000 --- a/src/number/isNaN.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Number.isNaN); diff --git a/src/number/isNaN/define.js b/src/number/isNaN/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isNaN/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isNaN/index.js b/src/number/isNaN/index.js new file mode 100644 index 000000000..3cceafd24 --- /dev/null +++ b/src/number/isNaN/index.js @@ -0,0 +1 @@ +export default Number.isNaN; diff --git a/src/number/isOdd.js b/src/number/isOdd.js deleted file mode 100644 index 114daf99f..000000000 --- a/src/number/isOdd.js +++ /dev/null @@ -1,6 +0,0 @@ -import { defineInstance } from '../core/number'; -import isMultipleOf from './util/isMultipleOf'; - -export default defineInstance(function isOdd(n) { - return Number.isInteger(n) && !isMultipleOf(n, 2); -}); diff --git a/src/number/isOdd/define.js b/src/number/isOdd/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isOdd/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isOdd/index.js b/src/number/isOdd/index.js new file mode 100644 index 000000000..ad59dd294 --- /dev/null +++ b/src/number/isOdd/index.js @@ -0,0 +1,5 @@ +import isMultipleOf from '../util/isMultipleOf'; + +export default function isOdd(n) { + return Number.isInteger(n) && !isMultipleOf(n, 2); +} diff --git a/src/number/isSafeInteger.js b/src/number/isSafeInteger.js deleted file mode 100644 index 19871c416..000000000 --- a/src/number/isSafeInteger.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Number.isSafeInteger); diff --git a/src/number/isSafeInteger/define.js b/src/number/isSafeInteger/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/isSafeInteger/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/isSafeInteger/index.js b/src/number/isSafeInteger/index.js new file mode 100644 index 000000000..00b03cc7d --- /dev/null +++ b/src/number/isSafeInteger/index.js @@ -0,0 +1 @@ +export default Number.isSafeInteger; diff --git a/src/number/log.js b/src/number/log.js deleted file mode 100644 index e17c77227..000000000 --- a/src/number/log.js +++ /dev/null @@ -1,9 +0,0 @@ -import { defineInstance } from '../core/number'; - -export default defineInstance(function log(n, base) { - let log = Math.log(n); - if (base) { - log /= Math.log(base); - } - return log; -}); diff --git a/src/number/log/define.js b/src/number/log/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/log/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/log/index.js b/src/number/log/index.js new file mode 100644 index 000000000..b75f6efdd --- /dev/null +++ b/src/number/log/index.js @@ -0,0 +1,7 @@ +export default function log(n, base) { + let log = Math.log(n); + if (base) { + log /= Math.log(base); + } + return log; +} diff --git a/src/number/pad.js b/src/number/pad.js deleted file mode 100644 index 3465d2626..000000000 --- a/src/number/pad.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import pad from './util/pad'; -export default defineInstance(pad); diff --git a/src/number/pad/define.js b/src/number/pad/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/pad/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/pad/index.js b/src/number/pad/index.js new file mode 100644 index 000000000..ed3a6b1ff --- /dev/null +++ b/src/number/pad/index.js @@ -0,0 +1 @@ +export { default } from '../util/pad'; diff --git a/src/number/pow.js b/src/number/pow.js deleted file mode 100644 index b61170e10..000000000 --- a/src/number/pow.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Math.pow); diff --git a/src/number/pow/define.js b/src/number/pow/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/pow/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/pow/index.js b/src/number/pow/index.js new file mode 100644 index 000000000..b1202ada3 --- /dev/null +++ b/src/number/pow/index.js @@ -0,0 +1 @@ +export default Math.pow; diff --git a/src/number/random/define.js b/src/number/random/define.js new file mode 100644 index 000000000..724f91195 --- /dev/null +++ b/src/number/random/define.js @@ -0,0 +1,3 @@ +import { defineStatic } from '../../core/number'; +import fn from './'; +defineStatic(fn); diff --git a/src/number/random.js b/src/number/random/index.js similarity index 52% rename from src/number/random.js rename to src/number/random/index.js index fde52b792..acec9aea0 100644 --- a/src/number/random.js +++ b/src/number/random/index.js @@ -1,7 +1,5 @@ -import { defineStatic } from '../core/number'; - -export default defineStatic(function random(n1 = 1, n2 = 0) { +export default function random(n1 = 1, n2 = 0) { const min = Math.min(n1, n2); const max = Math.max(n1, n2) + 1; return Math.floor((Math.random() * (max - min)) + min); -}); +} diff --git a/src/number/round.js b/src/number/round.js deleted file mode 100644 index fe026e94c..000000000 --- a/src/number/round.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import { round } from './util/math'; -export default defineInstance('round', round); diff --git a/src/number/round/define.js b/src/number/round/define.js new file mode 100644 index 000000000..724f91195 --- /dev/null +++ b/src/number/round/define.js @@ -0,0 +1,3 @@ +import { defineStatic } from '../../core/number'; +import fn from './'; +defineStatic(fn); diff --git a/src/number/round/index.js b/src/number/round/index.js new file mode 100644 index 000000000..f198b85de --- /dev/null +++ b/src/number/round/index.js @@ -0,0 +1 @@ +export { round as default } from '../util/math'; diff --git a/src/number/sqrt.js b/src/number/sqrt.js deleted file mode 100644 index 05980f4bb..000000000 --- a/src/number/sqrt.js +++ /dev/null @@ -1,2 +0,0 @@ -import { defineInstance } from '../core/number'; -export default defineInstance(Math.sqrt); diff --git a/src/number/sqrt/define.js b/src/number/sqrt/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/sqrt/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/sqrt/index.js b/src/number/sqrt/index.js new file mode 100644 index 000000000..e9b996f50 --- /dev/null +++ b/src/number/sqrt/index.js @@ -0,0 +1 @@ +export default Math.sqrt; diff --git a/src/number/times.js b/src/number/times.js deleted file mode 100644 index af6765720..000000000 --- a/src/number/times.js +++ /dev/null @@ -1,11 +0,0 @@ -import { defineInstance } from '../core/number'; -import { assertPositiveInteger } from '../util/assertions'; - -export default defineInstance(function times(n, fn) { - assertPositiveInteger(n); - const arr = []; - for (let i = 0; i < n; i++) { - arr.push(fn(i, n)); - } - return arr; -}); diff --git a/src/number/times/define.js b/src/number/times/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/times/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/times/index.js b/src/number/times/index.js new file mode 100644 index 000000000..9b064e51f --- /dev/null +++ b/src/number/times/index.js @@ -0,0 +1,10 @@ +import { assertPositiveInteger } from '../../util/assertions'; + +export default function times(n, fn) { + assertPositiveInteger(n); + const arr = []; + for (let i = 0; i < n; i++) { + arr.push(fn(i, n)); + } + return arr; +} diff --git a/src/number/toChar/define.js b/src/number/toChar/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/toChar/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/toChar.js b/src/number/toChar/index.js similarity index 67% rename from src/number/toChar.js rename to src/number/toChar/index.js index ad29bc6c3..7358a4969 100644 --- a/src/number/toChar.js +++ b/src/number/toChar/index.js @@ -1,8 +1,6 @@ -import { defineInstance } from '../core/number'; - -export default defineInstance(function toChar(n) { +export default function toChar(n) { // Note that fromCharCode was historically 2x faster than // fromCodePoint, however this no longer seems to be the case. // https://jsperf.com/fromcharcode-vs-fromcodepoint/6 return String.fromCodePoint(n); -}); +} diff --git a/src/number/toHex.js b/src/number/toHex.js deleted file mode 100644 index a3870877a..000000000 --- a/src/number/toHex.js +++ /dev/null @@ -1,6 +0,0 @@ -import { defineInstance } from '../core/number'; -import pad from './util/pad'; - -export default defineInstance(function toHex(n, digits) { - return pad(n, digits, null, false, 16); -}); diff --git a/src/number/toHex/define.js b/src/number/toHex/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/toHex/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/toHex/index.js b/src/number/toHex/index.js new file mode 100644 index 000000000..0d54d2e7c --- /dev/null +++ b/src/number/toHex/index.js @@ -0,0 +1,5 @@ +import pad from '../util/pad'; + +export default function toHex(n, digits) { + return pad(n, digits, null, false, 16); +} diff --git a/src/number/toOrdinal.js b/src/number/toOrdinal.js deleted file mode 100644 index cc6986da4..000000000 --- a/src/number/toOrdinal.js +++ /dev/null @@ -1,4 +0,0 @@ -import { defineInstance } from '../core/number'; -import toOrdinal from '../util/toOrdinal'; - -export default defineInstance(toOrdinal); diff --git a/src/number/toOrdinal/define.js b/src/number/toOrdinal/define.js new file mode 100644 index 000000000..8bc342ec7 --- /dev/null +++ b/src/number/toOrdinal/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance(fn); diff --git a/src/number/toOrdinal/index.js b/src/number/toOrdinal/index.js new file mode 100644 index 000000000..f679d9415 --- /dev/null +++ b/src/number/toOrdinal/index.js @@ -0,0 +1 @@ +export { default } from '../../util/toOrdinal'; diff --git a/src/number/trunc.js b/src/number/trunc.js deleted file mode 100644 index 5158b0481..000000000 --- a/src/number/trunc.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../core/number'; -import { trunc } from './util/math'; -export default defineInstance('trunc', trunc); diff --git a/src/number/trunc/define.js b/src/number/trunc/define.js new file mode 100644 index 000000000..ac70a1bbc --- /dev/null +++ b/src/number/trunc/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import fn from './'; +defineInstance('trunc', fn); diff --git a/src/number/trunc/index.js b/src/number/trunc/index.js new file mode 100644 index 000000000..86aae00f1 --- /dev/null +++ b/src/number/trunc/index.js @@ -0,0 +1 @@ +export { trunc as default } from '../util/math'; diff --git a/src/number/util/math.js b/src/number/util/math.js index 16f108dc4..7c90047b7 100644 --- a/src/number/util/math.js +++ b/src/number/util/math.js @@ -1,17 +1,26 @@ -function alias(fn) { - return function(n, place) { - if (!place) { - return fn(n); - } - let mult = Math.pow(10, Math.abs(place)); - if (place < 0) { - mult = 1 / mult; - } - return fn(n * mult) / mult; - }; +function withPrecision(n, place, fn) { + if (!place) { + return fn(n); + } + let mult = Math.pow(10, Math.abs(place)); + if (place < 0) { + mult = 1 / mult; + } + return fn(n * mult) / mult; } -export const trunc = alias(Math.trunc); -export const round = alias(Math.round); -export const floor = alias(Math.floor); -export const ceil = alias(Math.ceil); +export function trunc(n, place) { + return withPrecision(n, place, Math.trunc); +} + +export function round(n, place) { + return withPrecision(n, place, Math.round); +} + +export function floor(n, place) { + return withPrecision(n, place, Math.floor); +} + +export function ceil(n, place) { + return withPrecision(n, place, Math.ceil); +} diff --git a/test/helpers/suite.js b/test/helpers/suite.js index 2dd255a0f..567d2bec1 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -2,6 +2,20 @@ var currentNamespace; + function assertStatic(methodName, instanceFn) { + assertUndefined(currentNamespace.prototype[methodName], { + message: '{methodName} should be a static method', + methodName: methodName + }); + } + + function assertInstance(methodName) { + assertInstanceOf(currentNamespace.prototype[methodName], Function, { + message: '{methodName} should be a static method', + methodName: methodName + }); + } + function withSuite(describeFn) { return function(name, suite) { describeFn(name, function() { @@ -16,10 +30,11 @@ }; } - function withTest(testFn) { - return function(name, test) { - testFn(name, function() { - test(currentNamespace[name]); + function withTest(typeFn, testFn) { + return function(methodName, test) { + testFn(methodName, function() { + typeFn(methodName, currentNamespace.prototype[methodName]); + test(currentNamespace[methodName]); }); }; } @@ -28,8 +43,12 @@ fnamespace = withSuite(fdescribe); xnamespace = withSuite(xdescribe); - method = withTest(it); - fmethod = withTest(fit); - xmethod = withTest(xit); + staticMethod = withTest(assertStatic, it); + fstaticMethod = withTest(assertStatic, fit); + xstaticMethod = withTest(assertStatic, xit); + + instanceMethod = withTest(assertInstance, it); + finstanceMethod = withTest(assertInstance, fit); + xinstanceMethod = withTest(assertInstance, xit); })(); diff --git a/test/index.js b/test/index.js index cebcea3b7..08cd0c6f1 100644 --- a/test/index.js +++ b/test/index.js @@ -12,9 +12,11 @@ import './tests/core'; import './tests/number'; import './tests/extended'; import './tests/chainable'; -import './tests/modules/sugar'; -import './tests/modules/plugin'; -import './tests/modules/plugin-method'; +import './tests/modules/sugar-entry'; +import './tests/modules/sugar-namespace-entry'; +import './tests/modules/sugar-method-entry'; +import './tests/modules/plugin-entry'; +import './tests/modules/plugin-method-entry'; import './tests/modules/plugin-method-define'; // Export Sugar to global for tests. diff --git a/test/tests/modules/plugin.js b/test/tests/modules/plugin-entry.js similarity index 100% rename from test/tests/modules/plugin.js rename to test/tests/modules/plugin-entry.js diff --git a/test/tests/modules/plugin-method.js b/test/tests/modules/plugin-method-entry.js similarity index 100% rename from test/tests/modules/plugin-method.js rename to test/tests/modules/plugin-method-entry.js diff --git a/test/tests/modules/sugar-entry.js b/test/tests/modules/sugar-entry.js new file mode 100644 index 000000000..6333477ac --- /dev/null +++ b/test/tests/modules/sugar-entry.js @@ -0,0 +1,22 @@ +import Sugar from '../../../src/core'; +import * as SugarExports from '../../../src'; +import { expireCache } from '../../helpers/node'; + +describe('Sugar Entry', function() { + + it('should have exports for main entry point', function() { + assertMatchingNamedExports(SugarExports); + }); + + it('should have core object as default', function() { + assertEqual(SugarExports.default, Sugar); + }); + + it('should have exported core methods', function() { + assertInstanceOf(SugarExports.createNamespace, Function); + }); + +}); + +// Reset state after import. +expireCache(__dirname, '../../../src'); diff --git a/test/tests/modules/sugar-method-entry.js b/test/tests/modules/sugar-method-entry.js new file mode 100644 index 000000000..db663365a --- /dev/null +++ b/test/tests/modules/sugar-method-entry.js @@ -0,0 +1,15 @@ +import SugarNumber from '../../../src/core/number'; +import abs from '../../../src/number/abs'; + +describe('Sugar Method Entry', function() { + + // Note that we can't assert that the method has + // not been defined here as the rest of the suite + // has been imported by the time these tests are + // run. Relying on the plugin to ensure this. + + it('should export the method as default', function() { + assertEqual(abs(-5), 5); + }); + +}); diff --git a/test/tests/modules/sugar-namespace-entry.js b/test/tests/modules/sugar-namespace-entry.js new file mode 100644 index 000000000..70621938d --- /dev/null +++ b/test/tests/modules/sugar-namespace-entry.js @@ -0,0 +1,26 @@ +import Sugar from '../../../src/core'; +import SugarNumber from '../../../src/core/number'; +import * as SugarNumberExports from '../../../src/number'; +import { expireCache } from '../../helpers/node'; + +// Hold a reference to the method as we'll lose it when we reset. +const NamespaceAbs = SugarNumber.abs; + +describe('Sugar Namespace Entry', function() { + + it('should have exports for namespace entry points', function() { + assertMatchingNamedExports(SugarNumberExports); + }); + + it('should have exported static methods', function() { + assertEqual(SugarNumberExports.abs(-5), 5); + }); + + it('should have defined the method on the namespace', function() { + assertInstanceOf(NamespaceAbs, Function); + }); + +}); + +// Reset state after import. +expireCache(__dirname, '../../../src/number'); diff --git a/test/tests/modules/sugar.js b/test/tests/modules/sugar.js deleted file mode 100644 index 2c05ab4c4..000000000 --- a/test/tests/modules/sugar.js +++ /dev/null @@ -1,14 +0,0 @@ -import * as Sugar from '../../../src'; -import * as SugarNumber from '../../../src/number'; - -describe('Modules', function() { - - it('should have exports for main entry point', function() { - assertMatchingNamedExports(Sugar); - }); - - it('should have exports for namespace entry points', function() { - assertMatchingNamedExports(SugarNumber); - }); - -}); diff --git a/test/tests/number.js b/test/tests/number.js index 82c88751e..b8627d652 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -2,7 +2,7 @@ namespace('Number', function() { - method('random', function(random) { + staticMethod('random', function(random) { assertOneOf(random(), [0,1]); assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); assertOneOf(random(25, 30), [25,26,27,28,29,30]); @@ -11,7 +11,7 @@ namespace('Number', function() { assertOneOf(random(0, 0), [0]); }); - method('round', function(round) { + staticMethod('round', function(round) { assertEqual(round(3), 3); assertEqual(round(3.241), 3); assertEqual(round(3.752), 4); @@ -31,7 +31,7 @@ namespace('Number', function() { assertEqual(round(1e-21, -1), 0); }); - method('ceil', function(ceil) { + instanceMethod('ceil', function(ceil) { assertEqual(ceil(5.5), 6); assertEqual(ceil(5.14), 6); assertEqual(ceil(5), 5); @@ -47,7 +47,7 @@ namespace('Number', function() { assertEqual(ceil(4417.1318, -3), 5000); }); - method('floor', function(floor) { + instanceMethod('floor', function(floor) { assertEqual(floor(5.5), 5); assertEqual(floor(5.14), 5); assertEqual(floor(5.9), 5); @@ -64,7 +64,7 @@ namespace('Number', function() { assertEqual(floor(4417.1318, [-3]), 4000); }); - method('trunc', function(trunc) { + instanceMethod('trunc', function(trunc) { assertEqual(trunc(5), 5); assertEqual(trunc(5.25), 5); assertEqual(trunc(NaN), NaN); @@ -75,14 +75,14 @@ namespace('Number', function() { assertEqual(trunc(-5.25, 2), -5.25); }); - method('abs', function(abs) { + instanceMethod('abs', function(abs) { assertEqual(abs(-5), 5); assertEqual(abs(5), 5); assertEqual(abs(-3.324), 3.324); assertEqual(abs(3.324), 3.324); }); - method('pow', function(pow) { + instanceMethod('pow', function(pow) { assertEqual(pow(3, [2]), 9); assertEqual(pow(3, [1]), 3); assertEqual(pow(12, [2]), 144); @@ -91,30 +91,30 @@ namespace('Number', function() { assertEqual(pow(3), NaN); }); - method('log', function(log) { + instanceMethod('log', function(log) { assertEqual(log(64, 2), 6); assertEqual(log(32, 2), 5); assertEqual(log(16, 2), 4); assertEqual(log(Math.E), 1); }); - method('exp', function(exp) { + instanceMethod('exp', function(exp) { assertEqual(exp(0), 1); assertEqual(exp(1), Math.exp(1)); }); - method('sqrt', function(sqrt) { + instanceMethod('sqrt', function(sqrt) { assertEqual(sqrt(9), 3); assertEqual(sqrt(1024), 32); }); - method('toChar', function(toChar) { + instanceMethod('toChar', function(toChar) { assertEqual(toChar(65), 'A'); assertEqual(toChar(24536), '忘'); assertEqual(toChar(20294), '但'); }); - method('isMultipleOf', function(isMultipleOf) { + instanceMethod('isMultipleOf', function(isMultipleOf) { assertEqual(isMultipleOf(2, 2), true); assertEqual(isMultipleOf(6, 2), true); assertEqual(isMultipleOf(100, 2), true); @@ -130,7 +130,7 @@ namespace('Number', function() { assertEqual(isMultipleOf(2), false); }); - method('isOdd', function(isOdd) { + instanceMethod('isOdd', function(isOdd) { assertEqual(isOdd(0), false); assertEqual(isOdd(1), true); assertEqual(isOdd(2), false); @@ -142,7 +142,7 @@ namespace('Number', function() { assertEqual(isOdd(-Infinity), false); }); - method('isEven', function(isEven) { + instanceMethod('isEven', function(isEven) { assertEqual(isEven(0), true); assertEqual(isEven(1), false); assertEqual(isEven(2), true); @@ -154,7 +154,7 @@ namespace('Number', function() { assertEqual(isEven(-Infinity), false); }); - method('toOrdinal', function(toOrdinal) { + instanceMethod('toOrdinal', function(toOrdinal) { assertEqual(toOrdinal(0), '0th'); assertEqual(toOrdinal(1), '1st'); @@ -200,7 +200,7 @@ namespace('Number', function() { }); - method('isInteger', function(isInteger) { + instanceMethod('isInteger', function(isInteger) { assertEqual(isInteger(15), true); assertEqual(isInteger(15.2), false); assertEqual(isInteger(15.2668), false); @@ -209,7 +209,7 @@ namespace('Number', function() { assertEqual(isInteger('15.8'), false); }); - method('isSafeInteger', function(isSafeInteger) { + instanceMethod('isSafeInteger', function(isSafeInteger) { assertEqual(isSafeInteger(-0), true); assertEqual(isSafeInteger(0), true); assertEqual(isSafeInteger(1), true); @@ -218,7 +218,7 @@ namespace('Number', function() { assertEqual(isSafeInteger(Infinity), false); }); - method('isFinite', function(isFinite) { + instanceMethod('isFinite', function(isFinite) { assertEqual(isFinite(-0), true); assertEqual(isFinite(0), true); assertEqual(isFinite(1), true); @@ -228,14 +228,14 @@ namespace('Number', function() { assertEqual(isFinite(-Infinity), false); }); - method('isNaN', function(isNaN) { + instanceMethod('isNaN', function(isNaN) { assertEqual(isNaN(1), false); assertEqual(isNaN(NaN), true); assertEqual(isNaN(Infinity), false); assertEqual(isNaN(-Infinity), false); }); - method('times', function(times) { + instanceMethod('times', function(times) { function assertTimesRan(n, actual) { var count = 0; @@ -277,7 +277,7 @@ namespace('Number', function() { }); - method('format', function(format) { + instanceMethod('format', function(format) { assertEqual(format(1), '1'); assertEqual(format(10), '10'); @@ -326,7 +326,7 @@ namespace('Number', function() { }); - method('pad', function(pad) { + instanceMethod('pad', function(pad) { assertEqual(pad(1), '1'); assertEqual(pad(1, 0), '1'); @@ -355,7 +355,7 @@ namespace('Number', function() { }); - method('toHex', function(toHex) { + instanceMethod('toHex', function(toHex) { assertEqual(toHex(0), '0'); assertEqual(toHex(0, 2), '00'); @@ -372,7 +372,7 @@ namespace('Number', function() { }); - method('abbr', function(abbr) { + instanceMethod('abbr', function(abbr) { // Positive assertEqual(abbr(0), '0'); From 9ce16c1301a206029c3e5bfd8a9be6afa49fa1cd Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 23 Dec 2018 09:24:00 +0900 Subject: [PATCH 013/191] Enforcing defining functions with name due to mangling on minification. --- src/core/index.js | 3 --- src/number/abbr/define.js | 4 +-- src/number/abs/define.js | 4 +-- src/number/ceil/define.js | 4 +-- src/number/exp/define.js | 4 +-- src/number/floor/define.js | 4 +-- src/number/format/define.js | 4 +-- src/number/isEven/define.js | 4 +-- src/number/isFinite/define.js | 4 +-- src/number/isInteger/define.js | 4 +-- src/number/isMultipleOf/define.js | 4 +-- src/number/isNaN/define.js | 4 +-- src/number/isOdd/define.js | 4 +-- src/number/isSafeInteger/define.js | 4 +-- src/number/log/define.js | 4 +-- src/number/pad/define.js | 4 +-- src/number/pow/define.js | 4 +-- src/number/random/define.js | 4 +-- src/number/round/define.js | 4 +-- src/number/sqrt/define.js | 4 +-- src/number/times/define.js | 4 +-- src/number/toChar/define.js | 4 +-- src/number/toHex/define.js | 4 +-- src/number/toOrdinal/define.js | 4 +-- src/number/trunc/define.js | 4 +-- src/number/util/math.js | 39 ++++++++++++------------------ test/tests/core.js | 11 --------- 27 files changed, 63 insertions(+), 86 deletions(-) diff --git a/src/core/index.js b/src/core/index.js index 423f9a680..23360fc21 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -62,9 +62,6 @@ export function createNamespace(globalName) { function defineWithArgs(globalName, defineMethod, args) { if (isString(args[0])) { defineMethod(globalName, args[0], args[1]); - } else if (isFunction(args[0])) { - assertNamedFunction(args[0]); - defineMethod(globalName, args[0].name, args[0]); } else { forEachProperty(args[0], (methodName, fn) => { defineMethod(globalName, methodName, fn); diff --git a/src/number/abbr/define.js b/src/number/abbr/define.js index 8bc342ec7..a48679bf2 100644 --- a/src/number/abbr/define.js +++ b/src/number/abbr/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import abbr from './'; +defineInstance('abbr', abbr); diff --git a/src/number/abs/define.js b/src/number/abs/define.js index 8bc342ec7..1d44ba662 100644 --- a/src/number/abs/define.js +++ b/src/number/abs/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import abs from './'; +defineInstance('abs', abs); diff --git a/src/number/ceil/define.js b/src/number/ceil/define.js index 8bc342ec7..f4706d62e 100644 --- a/src/number/ceil/define.js +++ b/src/number/ceil/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import ceil from './'; +defineInstance('ceil', ceil); diff --git a/src/number/exp/define.js b/src/number/exp/define.js index 8bc342ec7..216cc113a 100644 --- a/src/number/exp/define.js +++ b/src/number/exp/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import exp from './'; +defineInstance('exp', exp); diff --git a/src/number/floor/define.js b/src/number/floor/define.js index 55dd418ff..644fd980e 100644 --- a/src/number/floor/define.js +++ b/src/number/floor/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance('floor', fn); +import floor from './'; +defineInstance('floor', floor); diff --git a/src/number/format/define.js b/src/number/format/define.js index 8bc342ec7..ce8001bbf 100644 --- a/src/number/format/define.js +++ b/src/number/format/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import format from './'; +defineInstance('format', format); diff --git a/src/number/isEven/define.js b/src/number/isEven/define.js index 8bc342ec7..ec4de9820 100644 --- a/src/number/isEven/define.js +++ b/src/number/isEven/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isEven from './'; +defineInstance('isEven', isEven); diff --git a/src/number/isFinite/define.js b/src/number/isFinite/define.js index 8bc342ec7..00a8cd6b9 100644 --- a/src/number/isFinite/define.js +++ b/src/number/isFinite/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isFinite from './'; +defineInstance('isFinite', isFinite); diff --git a/src/number/isInteger/define.js b/src/number/isInteger/define.js index 8bc342ec7..d41fa4f4e 100644 --- a/src/number/isInteger/define.js +++ b/src/number/isInteger/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isInteger from './'; +defineInstance('isInteger', isInteger); diff --git a/src/number/isMultipleOf/define.js b/src/number/isMultipleOf/define.js index 8bc342ec7..9322f2aa2 100644 --- a/src/number/isMultipleOf/define.js +++ b/src/number/isMultipleOf/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isMultipleOf from './'; +defineInstance('isMultipleOf', isMultipleOf); diff --git a/src/number/isNaN/define.js b/src/number/isNaN/define.js index 8bc342ec7..ec65b1532 100644 --- a/src/number/isNaN/define.js +++ b/src/number/isNaN/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isNaN from './'; +defineInstance('isNaN', isNaN); diff --git a/src/number/isOdd/define.js b/src/number/isOdd/define.js index 8bc342ec7..fdc92de02 100644 --- a/src/number/isOdd/define.js +++ b/src/number/isOdd/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isOdd from './'; +defineInstance('isOdd', isOdd); diff --git a/src/number/isSafeInteger/define.js b/src/number/isSafeInteger/define.js index 8bc342ec7..44435e254 100644 --- a/src/number/isSafeInteger/define.js +++ b/src/number/isSafeInteger/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import isSafeInteger from './'; +defineInstance('isSafeInteger', isSafeInteger); diff --git a/src/number/log/define.js b/src/number/log/define.js index 8bc342ec7..0b1912f66 100644 --- a/src/number/log/define.js +++ b/src/number/log/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import log from './'; +defineInstance('log', log); diff --git a/src/number/pad/define.js b/src/number/pad/define.js index 8bc342ec7..508d96d04 100644 --- a/src/number/pad/define.js +++ b/src/number/pad/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import pad from './'; +defineInstance('pad', pad); diff --git a/src/number/pow/define.js b/src/number/pow/define.js index 8bc342ec7..8768e8415 100644 --- a/src/number/pow/define.js +++ b/src/number/pow/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import pow from './'; +defineInstance('pow', pow); diff --git a/src/number/random/define.js b/src/number/random/define.js index 724f91195..1e902c73d 100644 --- a/src/number/random/define.js +++ b/src/number/random/define.js @@ -1,3 +1,3 @@ import { defineStatic } from '../../core/number'; -import fn from './'; -defineStatic(fn); +import random from './'; +defineStatic('random', random); diff --git a/src/number/round/define.js b/src/number/round/define.js index 724f91195..f512b895b 100644 --- a/src/number/round/define.js +++ b/src/number/round/define.js @@ -1,3 +1,3 @@ import { defineStatic } from '../../core/number'; -import fn from './'; -defineStatic(fn); +import round from './'; +defineStatic('round', round); diff --git a/src/number/sqrt/define.js b/src/number/sqrt/define.js index 8bc342ec7..f73bcc9bf 100644 --- a/src/number/sqrt/define.js +++ b/src/number/sqrt/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import sqrt from './'; +defineInstance('sqrt', sqrt); diff --git a/src/number/times/define.js b/src/number/times/define.js index 8bc342ec7..75cfce696 100644 --- a/src/number/times/define.js +++ b/src/number/times/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import times from './'; +defineInstance('times', times); diff --git a/src/number/toChar/define.js b/src/number/toChar/define.js index 8bc342ec7..d122e80d3 100644 --- a/src/number/toChar/define.js +++ b/src/number/toChar/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import toChar from './'; +defineInstance('toChar', toChar); diff --git a/src/number/toHex/define.js b/src/number/toHex/define.js index 8bc342ec7..94b835bf8 100644 --- a/src/number/toHex/define.js +++ b/src/number/toHex/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import toHex from './'; +defineInstance('toHex', toHex); diff --git a/src/number/toOrdinal/define.js b/src/number/toOrdinal/define.js index 8bc342ec7..f9c24c485 100644 --- a/src/number/toOrdinal/define.js +++ b/src/number/toOrdinal/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance(fn); +import toOrdinal from './'; +defineInstance('toOrdinal', toOrdinal); diff --git a/src/number/trunc/define.js b/src/number/trunc/define.js index ac70a1bbc..d0c16ef9e 100644 --- a/src/number/trunc/define.js +++ b/src/number/trunc/define.js @@ -1,3 +1,3 @@ import { defineInstance } from '../../core/number'; -import fn from './'; -defineInstance('trunc', fn); +import trunc from './'; +defineInstance('trunc', trunc); diff --git a/src/number/util/math.js b/src/number/util/math.js index 7c90047b7..16f108dc4 100644 --- a/src/number/util/math.js +++ b/src/number/util/math.js @@ -1,26 +1,17 @@ -function withPrecision(n, place, fn) { - if (!place) { - return fn(n); - } - let mult = Math.pow(10, Math.abs(place)); - if (place < 0) { - mult = 1 / mult; - } - return fn(n * mult) / mult; +function alias(fn) { + return function(n, place) { + if (!place) { + return fn(n); + } + let mult = Math.pow(10, Math.abs(place)); + if (place < 0) { + mult = 1 / mult; + } + return fn(n * mult) / mult; + }; } -export function trunc(n, place) { - return withPrecision(n, place, Math.trunc); -} - -export function round(n, place) { - return withPrecision(n, place, Math.round); -} - -export function floor(n, place) { - return withPrecision(n, place, Math.floor); -} - -export function ceil(n, place) { - return withPrecision(n, place, Math.ceil); -} +export const trunc = alias(Math.trunc); +export const round = alias(Math.round); +export const floor = alias(Math.floor); +export const ceil = alias(Math.ceil); diff --git a/test/tests/core.js b/test/tests/core.js index 1427d93e2..4c63581c2 100644 --- a/test/tests/core.js +++ b/test/tests/core.js @@ -65,17 +65,6 @@ describe('Core', function() { assertEqual(Sugar.Number.add(1, 2), 3); }); - it('should be able to define instance with named function', function() { - Sugar.Number.defineInstance(add); - assertEqual(Sugar.Number.add(1, 2), 3); - }); - - it('should throw an error if function has no name', function() { - assertError(function() { - Sugar.Number.defineInstance(function() {}); - }); - }); - }); describe('Aliases', function() { From bb2f71f83ee4b91c5ce5e348fa4694844af42e21 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 23 Dec 2018 19:48:21 +0900 Subject: [PATCH 014/191] Worked out final issues with modules. Cleaned up exporting to browser. --- src/all.js | 4 ++ src/core/array.js | 12 ++++ src/core/index.js | 32 ++------- src/core/number.js | 8 +-- src/core/object.js | 12 ++++ src/core/string.js | 12 ++++ src/index.js | 17 ++--- src/number/all.js | 27 +++++++ src/number/index.js | 80 +++++++-------------- test/helpers/node.js | 8 --- test/index.js | 20 +++--- test/plugins/math-operators/add/define.js | 3 - test/plugins/math-operators/add/index.js | 3 - test/plugins/math-operators/index.js | 11 --- test/plugins/math-operators/mult/define.js | 3 - test/plugins/math-operators/mult/index.js | 3 - test/tests/core.js | 6 +- test/tests/modules/customized.js | 23 ++++++ test/tests/modules/index.js | 31 ++++++++ test/tests/modules/method-define.js | 15 ++++ test/tests/modules/method-entry.js | 19 +++++ test/tests/modules/namespace-all.js | 26 +++++++ test/tests/modules/namespace-entry.js | 26 +++++++ test/tests/modules/plugin-entry.js | 26 ------- test/tests/modules/plugin-method-define.js | 22 ------ test/tests/modules/plugin-method-entry.js | 14 ---- test/tests/modules/plugin.js | 26 +++++++ test/tests/modules/sugar-all.js | 26 +++++++ test/tests/modules/sugar-entry.js | 28 ++++---- test/tests/modules/sugar-method-entry.js | 15 ---- test/tests/modules/sugar-namespace-entry.js | 26 ------- webpack.config.js | 13 ++-- 32 files changed, 337 insertions(+), 260 deletions(-) create mode 100644 src/all.js create mode 100644 src/core/array.js create mode 100644 src/core/object.js create mode 100644 src/core/string.js create mode 100644 src/number/all.js delete mode 100644 test/helpers/node.js delete mode 100644 test/plugins/math-operators/add/define.js delete mode 100644 test/plugins/math-operators/add/index.js delete mode 100644 test/plugins/math-operators/index.js delete mode 100644 test/plugins/math-operators/mult/define.js delete mode 100644 test/plugins/math-operators/mult/index.js create mode 100644 test/tests/modules/customized.js create mode 100644 test/tests/modules/index.js create mode 100644 test/tests/modules/method-define.js create mode 100644 test/tests/modules/method-entry.js create mode 100644 test/tests/modules/namespace-all.js create mode 100644 test/tests/modules/namespace-entry.js delete mode 100644 test/tests/modules/plugin-entry.js delete mode 100644 test/tests/modules/plugin-method-define.js delete mode 100644 test/tests/modules/plugin-method-entry.js create mode 100644 test/tests/modules/plugin.js create mode 100644 test/tests/modules/sugar-all.js delete mode 100644 test/tests/modules/sugar-method-entry.js delete mode 100644 test/tests/modules/sugar-namespace-entry.js diff --git a/src/all.js b/src/all.js new file mode 100644 index 000000000..549c9a3e2 --- /dev/null +++ b/src/all.js @@ -0,0 +1,4 @@ +import './number/all'; + +export * from './'; +export { default } from './'; diff --git a/src/core/array.js b/src/core/array.js new file mode 100644 index 000000000..71d5685c9 --- /dev/null +++ b/src/core/array.js @@ -0,0 +1,12 @@ +import Sugar, { createNamespace } from '../core'; + +createNamespace('Array'); + +export const { + defineStatic, + defineInstance, + defineStaticAlias, + defineInstanceAlias, +} = Sugar.Array; + +export default Sugar.Array; diff --git a/src/core/index.js b/src/core/index.js index 23360fc21..f67a3b063 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -5,7 +5,6 @@ import { extendNative, restoreNative } from './util/extend'; import { hasOwnProperty, forEachProperty, arrayIncludes } from './util/helpers'; import { isString, isFunction } from '../util/typeChecks'; - // --- Constants const SUGAR = 'Sugar'; @@ -15,8 +14,6 @@ export const VERSION = 'edge'; // --- Setup -const instanceMethods = new NamespaceStore(); - export function createNamespace(globalName) { if (!globalContext[globalName]) { @@ -24,7 +21,7 @@ export function createNamespace(globalName) { } if (Sugar[globalName]) { - return Sugar[globalName]; + return; } class SugarChainable extends SugarChainableBase { @@ -53,12 +50,14 @@ export function createNamespace(globalName) { mapNativeToChainable(globalName, SugarChainable); - return Sugar[globalName] = SugarChainable; + Sugar[globalName] = SugarChainable; } // --- Defining methods +const instanceMethods = new NamespaceStore(); + function defineWithArgs(globalName, defineMethod, args) { if (isString(args[0])) { defineMethod(globalName, args[0], args[1]); @@ -233,7 +232,8 @@ function wrapReturnWithChainable(fn) { const globalName = ctor ? ctor.name : 'Object'; let SugarChainable = Sugar[globalName]; if (!SugarChainable && (!ctor || ctor === globalContext[globalName])) { - SugarChainable = createNamespace(globalName); + createNamespace(globalName); + SugarChainable = Sugar[globalName]; } return SugarChainable ? new SugarChainable(result) : result; }; @@ -279,25 +279,6 @@ function nativeMethodProhibitedOnChainable(methodName) { || methodName === '__proto__'; } - -// --- Misc - -function exportToBrowser(obj) { - // TODO: test browserify - // TODO: test broccoli - // TODO: test rhino - // TODO: test QML - if (typeof window !== 'undefined') { - try { - // Reuse already defined Sugar global object. - globalContext[SUGAR] = globalContext[SUGAR] || obj; - } catch { - // Contexts such as QML have a read-only global context. - } - } -} - - // --- Default exports const Sugar = { @@ -307,5 +288,4 @@ const Sugar = { createNamespace }; -exportToBrowser(Sugar); export default Sugar; diff --git a/src/core/number.js b/src/core/number.js index aff889288..31d6fc460 100644 --- a/src/core/number.js +++ b/src/core/number.js @@ -1,12 +1,12 @@ -import { createNamespace } from '../core'; +import Sugar, { createNamespace } from '../core'; -const namespace = createNamespace('Number'); +createNamespace('Number'); export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = namespace; +} = Sugar.Number; -export default namespace; +export default Sugar.Number; diff --git a/src/core/object.js b/src/core/object.js new file mode 100644 index 000000000..a7256039e --- /dev/null +++ b/src/core/object.js @@ -0,0 +1,12 @@ +import Sugar, { createNamespace } from '../core'; + +createNamespace('Object'); + +export const { + defineStatic, + defineInstance, + defineStaticAlias, + defineInstanceAlias, +} = Sugar.Object; + +export default Sugar.Object; diff --git a/src/core/string.js b/src/core/string.js new file mode 100644 index 000000000..d028216bd --- /dev/null +++ b/src/core/string.js @@ -0,0 +1,12 @@ +import Sugar, { createNamespace } from '../core'; + +createNamespace('String'); + +export const { + defineStatic, + defineInstance, + defineStaticAlias, + defineInstanceAlias, +} = Sugar.String; + +export default Sugar.String; diff --git a/src/index.js b/src/index.js index 30f544930..a08fa8ee7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,12 +1,7 @@ -export { default as Number } from './number'; -export { default as String } from './string'; -export { default as Object } from './object'; -export { default as Array } from './array'; +export { default as String } from './core/string'; +export { default as Number } from './core/number'; +export { default as Object } from './core/object'; +export { default as Array } from './core/array'; -export { - VERSION, - extend, - restore, - createNamespace, - default, -} from './core'; +export * from './core'; +export { default } from './core'; diff --git a/src/number/all.js b/src/number/all.js new file mode 100644 index 000000000..56701b014 --- /dev/null +++ b/src/number/all.js @@ -0,0 +1,27 @@ +import './abbr/define'; +import './abs/define'; +import './ceil/define'; +import './exp/define'; +import './floor/define'; +import './format/define'; +import './isEven/define'; +import './isFinite/define'; +import './isInteger/define'; +import './isMultipleOf/define'; +import './isNaN/define'; +import './isOdd/define'; +import './isSafeInteger/define'; +import './log/define'; +import './pad/define'; +import './pow/define'; +import './random/define'; +import './round/define'; +import './sqrt/define'; +import './times/define'; +import './toChar/define'; +import './toHex/define'; +import './toOrdinal/define'; +import './trunc/define'; + +export * from '../core/number'; +export { default } from '../core/number'; diff --git a/src/number/index.js b/src/number/index.js index c105841a5..0322b5794 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -1,55 +1,27 @@ -import SugarNumber from '../core/number'; +export { default as abbr } from './abbr'; +export { default as abs } from './abs'; +export { default as ceil } from './ceil'; +export { default as exp } from './exp'; +export { default as floor } from './floor'; +export { default as format } from './format'; +export { default as isEven } from './isEven'; +export { default as isFinite } from './isFinite'; +export { default as isInteger } from './isInteger'; +export { default as isMultipleOf } from './isMultipleOf'; +export { default as isNaN } from './isNaN'; +export { default as isOdd } from './isOdd'; +export { default as isSafeInteger } from './isSafeInteger'; +export { default as log } from './log'; +export { default as pad } from './pad'; +export { default as pow } from './pow'; +export { default as random } from './random'; +export { default as round } from './round'; +export { default as sqrt } from './sqrt'; +export { default as times } from './times'; +export { default as toChar } from './toChar'; +export { default as toHex } from './toHex'; +export { default as toOrdinal } from './toOrdinal'; +export { default as trunc } from './trunc'; -import './abbr/define'; -import './abs/define'; -import './ceil/define'; -import './exp/define'; -import './floor/define'; -import './format/define'; -import './isEven/define'; -import './isFinite/define'; -import './isInteger/define'; -import './isMultipleOf/define'; -import './isNaN/define'; -import './isOdd/define'; -import './isSafeInteger/define'; -import './log/define'; -import './pad/define'; -import './pow/define'; -import './random/define'; -import './round/define'; -import './sqrt/define'; -import './times/define'; -import './toChar/define'; -import './toHex/define'; -import './toOrdinal/define'; -import './trunc/define'; - -export const { - abbr, - abs, - ceil, - exp, - floor, - format, - isEven, - isFinite, - isInteger, - isMultipleOf, - isNaN, - isOdd, - isSafeInteger, - log, - pad, - pow, - random, - round, - sqrt, - times, - toChar, - toHex, - toOrdinal, - trunc -} = SugarNumber; - -export default SugarNumber; +export * from '../core/number'; +export { default } from '../core/number'; diff --git a/test/helpers/node.js b/test/helpers/node.js deleted file mode 100644 index 4fbe35dd2..000000000 --- a/test/helpers/node.js +++ /dev/null @@ -1,8 +0,0 @@ -const path = require('path'); - -module.exports = { - expireCache: function(dir, p) { - const fullPath = path.resolve(dir, p) + '.js'; - delete require.cache[fullPath]; - } -}; diff --git a/test/index.js b/test/index.js index 08cd0c6f1..1d03d4e8e 100644 --- a/test/index.js +++ b/test/index.js @@ -1,4 +1,12 @@ -import Sugar from '../src'; +import Sugar from '../src/all'; + +// TODO: test browserify +// TODO: test broccoli +// TODO: test rhino +// TODO: test QML + +// Export Sugar to global for tests. +global.Sugar = Sugar; // Helpers import './helpers/namespace'; @@ -12,12 +20,4 @@ import './tests/core'; import './tests/number'; import './tests/extended'; import './tests/chainable'; -import './tests/modules/sugar-entry'; -import './tests/modules/sugar-namespace-entry'; -import './tests/modules/sugar-method-entry'; -import './tests/modules/plugin-entry'; -import './tests/modules/plugin-method-entry'; -import './tests/modules/plugin-method-define'; - -// Export Sugar to global for tests. -global.Sugar = Sugar; +import './tests/modules'; diff --git a/test/plugins/math-operators/add/define.js b/test/plugins/math-operators/add/define.js deleted file mode 100644 index e65a962d6..000000000 --- a/test/plugins/math-operators/add/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../../../src/core/number'; -import add from './'; -defineInstance(add); diff --git a/test/plugins/math-operators/add/index.js b/test/plugins/math-operators/add/index.js deleted file mode 100644 index 92608bdd4..000000000 --- a/test/plugins/math-operators/add/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function add(n1, n2) { - return n1 + n2; -} diff --git a/test/plugins/math-operators/index.js b/test/plugins/math-operators/index.js deleted file mode 100644 index 597b08eee..000000000 --- a/test/plugins/math-operators/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import SugarNumber from '../../../src/core/number'; - -import './add/define'; -import './mult/define'; - -export const { - add, - mult, -} = SugarNumber; - -export default SugarNumber; diff --git a/test/plugins/math-operators/mult/define.js b/test/plugins/math-operators/mult/define.js deleted file mode 100644 index 0cca1f5eb..000000000 --- a/test/plugins/math-operators/mult/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../../../src/core/number'; -import mult from './'; -defineInstance(mult); diff --git a/test/plugins/math-operators/mult/index.js b/test/plugins/math-operators/mult/index.js deleted file mode 100644 index 47d7b9f3e..000000000 --- a/test/plugins/math-operators/mult/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function mult(n1, n2) { - return n1 * n2; -} diff --git a/test/tests/core.js b/test/tests/core.js index 4c63581c2..3f2547676 100644 --- a/test/tests/core.js +++ b/test/tests/core.js @@ -14,9 +14,9 @@ describe('Core', function() { it('should be able to create a new namespace', function() { ensureNamespaceNotInitialized('Array', function() { - var namespace = Sugar.createNamespace('Array'); - assertEqual(namespace, Sugar.Array); - assertInstanceOf(namespace.defineInstance, Function); + Sugar.createNamespace('Array'); + assertInstanceOf(Sugar.Array, Function); + assertInstanceOf(Sugar.Array.defineInstance, Function); }); }); diff --git a/test/tests/modules/customized.js b/test/tests/modules/customized.js new file mode 100644 index 000000000..c42887aa5 --- /dev/null +++ b/test/tests/modules/customized.js @@ -0,0 +1,23 @@ +import '../../../src/number/abbr/define'; +import '../../../src/number/abs/define'; +// TODO +//import 'sugar/string/capitalize/define'; +import { Number, String } from '../../../src'; + +describe('Customized Module', function() { + + it('should have defined static', function() { + assertEqual(Number.abbr(5000), '5k'); + assertEqual(Number.abs(-5), 5); + }); + + it('should have defined instance', function() { + assertEqual(new Number(-5000).abs().abbr().raw, '5k'); + }); + + it('should not have defined other methods', function() { + assertUndefined(Number.pow); + assertUndefined(Number.prototype.pow); + }); + +}); diff --git a/test/tests/modules/index.js b/test/tests/modules/index.js new file mode 100644 index 000000000..97ec360e5 --- /dev/null +++ b/test/tests/modules/index.js @@ -0,0 +1,31 @@ +import path from 'path'; + +const base = path.resolve(__dirname, '../../../src'); + +function clearCache() { + Object.keys(require.cache).forEach(key => { + if (key.indexOf(base) !== -1) { + delete require.cache[key]; + } + }); +} + +// To correctly test modules we need to clear the require +// cache and dynamically import with require each time. + +clearCache(); +require('./sugar-entry'); +clearCache(); +require('./sugar-all'); +clearCache(); +require('./namespace-entry'); +clearCache(); +require('./namespace-all'); +clearCache(); +require('./method-entry'); +clearCache(); +require('./method-define'); +clearCache(); +require('./customized'); +clearCache(); +require('./plugin'); diff --git a/test/tests/modules/method-define.js b/test/tests/modules/method-define.js new file mode 100644 index 000000000..b257716d5 --- /dev/null +++ b/test/tests/modules/method-define.js @@ -0,0 +1,15 @@ +import Number from '../../../src/core/number'; +import * as Exports from '../../../src/number/abs/define'; + +describe('Method Define Module', function() { + + it('should not have any exports', function() { + assertEqual(Object.keys(Exports).length, 0); + }); + + it('should not have defined the method', function() { + assertEqual(Number.abs(-5), 5); + assertEqual(new Number(-5).abs().raw, 5); + }); + +}); diff --git a/test/tests/modules/method-entry.js b/test/tests/modules/method-entry.js new file mode 100644 index 000000000..7faa7fcbe --- /dev/null +++ b/test/tests/modules/method-entry.js @@ -0,0 +1,19 @@ +import Number from '../../../src/core/number'; +import * as Exports from '../../../src/number/abs'; + +describe('Method Entry Module', function() { + + it('should export the method as default', function() { + assertEqual(Exports.default(-5), 5); + }); + + it('should not have any named exports', function() { + assertEqual(Object.keys(Exports).length, 1); + }); + + it('should not have defined the method', function() { + assertUndefined(Number.abs); + assertUndefined(Number.prototype.abs); + }); + +}); diff --git a/test/tests/modules/namespace-all.js b/test/tests/modules/namespace-all.js new file mode 100644 index 000000000..7436399d7 --- /dev/null +++ b/test/tests/modules/namespace-all.js @@ -0,0 +1,26 @@ +import Number from '../../../src/core/number'; +import * as Exports from '../../../src/number/all'; + +describe('Namespace All Module', function() { + + it('should export the namespace as default', function() { + assertEqual(Exports.default, Number); + }); + + it('should have named exports equal to those of the namespace', function() { + assertEqual(Exports.defineStatic, Number.defineStatic); + assertEqual(Exports.defineInstance, Number.defineInstance); + assertEqual(Exports.defineStaticAlias, Number.defineStaticAlias); + assertEqual(Exports.defineInstanceAlias, Number.defineInstanceAlias); + }); + + it('should not have static functions as named exports', function() { + assertUndefined(Exports.abs); + }); + + it('should have defined methods', function() { + assertEqual(Exports.default.abs(-5), 5); + assertEqual(new Exports.default(-5).abs().raw, 5); + }); + +}); diff --git a/test/tests/modules/namespace-entry.js b/test/tests/modules/namespace-entry.js new file mode 100644 index 000000000..45a2fda5a --- /dev/null +++ b/test/tests/modules/namespace-entry.js @@ -0,0 +1,26 @@ +import Number from '../../../src/core/number'; +import * as Exports from '../../../src/number'; + +describe('Namespace Entry Module', function() { + + it('should export the namespace as default', function() { + assertEqual(Exports.default, Number); + }); + + it('should have named exports equal to those of the namespace', function() { + assertEqual(Exports.defineStatic, Number.defineStatic); + assertEqual(Exports.defineInstance, Number.defineInstance); + assertEqual(Exports.defineStaticAlias, Number.defineStaticAlias); + assertEqual(Exports.defineInstanceAlias, Number.defineInstanceAlias); + }); + + it('should have static functions as named exports', function() { + assertEqual(Exports.abs(-5), 5); + }); + + it('should have not have defined chainable methods', function() { + assertUndefined(Exports.default.abs); + assertUndefined(Exports.default.prototype.abs); + }); + +}); diff --git a/test/tests/modules/plugin-entry.js b/test/tests/modules/plugin-entry.js deleted file mode 100644 index bd8f1d866..000000000 --- a/test/tests/modules/plugin-entry.js +++ /dev/null @@ -1,26 +0,0 @@ -import SugarNumber from '../../../src/core/number'; -import DefaultExport, { add, mult } from '../../plugins/math-operators'; -import { expireCache } from '../../helpers/node'; - -describe('Plugin Entry', function() { - - it('should export the namespace as the default', function() { - assertEqual(DefaultExport, SugarNumber); - }); - - it('should export standalone methods', function() { - assertEqual(add(5, 5), 10); - assertEqual(mult(5, 5), 25); - }); - - it('should have defined methods on the chainable', function() { - assertEqual(new SugarNumber(5).add(5).mult(5).raw, 50); - }); - -}); - -// Reset state after import. -delete SugarNumber.add; -delete SugarNumber.mult; -expireCache(__dirname, '../../plugins/math-operators/add/define'); -expireCache(__dirname, '../../plugins/math-operators/mult/define'); diff --git a/test/tests/modules/plugin-method-define.js b/test/tests/modules/plugin-method-define.js deleted file mode 100644 index 9b42cb829..000000000 --- a/test/tests/modules/plugin-method-define.js +++ /dev/null @@ -1,22 +0,0 @@ -import SugarNumber from '../../../src/core/number'; -import * as Exports from '../../plugins/math-operators/add/define'; -import { expireCache } from '../../helpers/node'; - -// Hold a reference to the method as we'll lose it when we reset. -const NamespaceAdd = SugarNumber.add; - -describe('Plugin Method Define', function() { - - it('should not have any exports', function() { - assertEqual(Object.keys(Exports).length, 0); - }); - - it('should have defined the method', function() { - assertInstanceOf(NamespaceAdd, Function); - }); - -}); - -// Reset state after import. -delete SugarNumber.add; -expireCache(__dirname, '../../plugins/math-operators/add/define'); diff --git a/test/tests/modules/plugin-method-entry.js b/test/tests/modules/plugin-method-entry.js deleted file mode 100644 index 912a98679..000000000 --- a/test/tests/modules/plugin-method-entry.js +++ /dev/null @@ -1,14 +0,0 @@ -import SugarNumber from '../../../src/core/number'; -import add from '../../plugins/math-operators/add'; - -describe('Plugin Method Entry', function() { - - it('should export the method as default', function() { - assertEqual(add(5, 5), 10); - }); - - it('should not have defined the method', function() { - assertUndefined(SugarNumber.add); - }); - -}); diff --git a/test/tests/modules/plugin.js b/test/tests/modules/plugin.js new file mode 100644 index 000000000..38de53e57 --- /dev/null +++ b/test/tests/modules/plugin.js @@ -0,0 +1,26 @@ +import Sugar, { createNamespace } from '../../../src/core'; +import String, { defineInstance } from '../../../src/core/string'; + +defineInstance('hi', function(str) { + return 'hi ' + str; +}); + +createNamespace('Boolean'); + +Sugar.Boolean.defineInstance('maybe', function() { + return 0.5; +}); + +describe('Plugin Module', function() { + + it('should have defined a new method on String', function() { + assertEqual(String.hi('there'), 'hi there'); + assertEqual(new String('there').hi().raw, 'hi there'); + }); + + it('should have defined a new method on Boolean', function() { + assertEqual(Sugar.Boolean.maybe(), 0.5); + assertEqual(new Sugar.Boolean().maybe().raw, 0.5); + }); + +}); diff --git a/test/tests/modules/sugar-all.js b/test/tests/modules/sugar-all.js new file mode 100644 index 000000000..008e53e69 --- /dev/null +++ b/test/tests/modules/sugar-all.js @@ -0,0 +1,26 @@ +import Sugar from '../../../src/core'; +import * as Exports from '../../../src/all'; + +describe('All Module', function() { + + it('should export the core as default', function() { + assertEqual(Exports.default, Sugar); + }); + + it('should have named exports equal to those of the core', function() { + assertEqual(Exports.VERSION, Sugar.VERSION); + assertEqual(Exports.extend, Sugar.extend); + assertEqual(Exports.restore, Sugar.restore); + assertEqual(Exports.createNamespace, Sugar.createNamespace); + }); + + it('should have exported namespaces', function() { + assertInstanceOf(Exports.Number, Function); + }); + + it('should have defined methods', function() { + assertEqual(Exports.Number.abs(-5), 5); + assertEqual(new Exports.Number(-5).abs().raw, 5); + }); + +}); diff --git a/test/tests/modules/sugar-entry.js b/test/tests/modules/sugar-entry.js index 6333477ac..1d51ccd7f 100644 --- a/test/tests/modules/sugar-entry.js +++ b/test/tests/modules/sugar-entry.js @@ -1,22 +1,26 @@ import Sugar from '../../../src/core'; -import * as SugarExports from '../../../src'; -import { expireCache } from '../../helpers/node'; +import * as Exports from '../../../src'; -describe('Sugar Entry', function() { +describe('Entry Module', function() { - it('should have exports for main entry point', function() { - assertMatchingNamedExports(SugarExports); + it('should export the core as default', function() { + assertEqual(Exports.default, Sugar); }); - it('should have core object as default', function() { - assertEqual(SugarExports.default, Sugar); + it('should have named exports equal to those of the core', function() { + assertEqual(Exports.VERSION, Sugar.VERSION); + assertEqual(Exports.extend, Sugar.extend); + assertEqual(Exports.restore, Sugar.restore); + assertEqual(Exports.createNamespace, Sugar.createNamespace); }); - it('should have exported core methods', function() { - assertInstanceOf(SugarExports.createNamespace, Function); + it('should have exported namespaces', function() { + assertInstanceOf(Exports.Number, Function); }); -}); + it('should not have defined methods', function() { + assertUndefined(Exports.Number.abs); + assertUndefined(Exports.Number.prototype.abs); + }); -// Reset state after import. -expireCache(__dirname, '../../../src'); +}); diff --git a/test/tests/modules/sugar-method-entry.js b/test/tests/modules/sugar-method-entry.js deleted file mode 100644 index db663365a..000000000 --- a/test/tests/modules/sugar-method-entry.js +++ /dev/null @@ -1,15 +0,0 @@ -import SugarNumber from '../../../src/core/number'; -import abs from '../../../src/number/abs'; - -describe('Sugar Method Entry', function() { - - // Note that we can't assert that the method has - // not been defined here as the rest of the suite - // has been imported by the time these tests are - // run. Relying on the plugin to ensure this. - - it('should export the method as default', function() { - assertEqual(abs(-5), 5); - }); - -}); diff --git a/test/tests/modules/sugar-namespace-entry.js b/test/tests/modules/sugar-namespace-entry.js deleted file mode 100644 index 70621938d..000000000 --- a/test/tests/modules/sugar-namespace-entry.js +++ /dev/null @@ -1,26 +0,0 @@ -import Sugar from '../../../src/core'; -import SugarNumber from '../../../src/core/number'; -import * as SugarNumberExports from '../../../src/number'; -import { expireCache } from '../../helpers/node'; - -// Hold a reference to the method as we'll lose it when we reset. -const NamespaceAbs = SugarNumber.abs; - -describe('Sugar Namespace Entry', function() { - - it('should have exports for namespace entry points', function() { - assertMatchingNamedExports(SugarNumberExports); - }); - - it('should have exported static methods', function() { - assertEqual(SugarNumberExports.abs(-5), 5); - }); - - it('should have defined the method on the namespace', function() { - assertInstanceOf(NamespaceAbs, Function); - }); - -}); - -// Reset state after import. -expireCache(__dirname, '../../../src/number'); diff --git a/webpack.config.js b/webpack.config.js index f329b3b9a..41210b515 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -6,14 +6,15 @@ module.exports = { mode: 'development', devtool: 'cheap-module-eval-source-map', output: { - filename: 'sugar.js' + filename: 'sugar.js', + library: 'Sugar', + libraryExport: 'default' }, - entry: { - sugar: [ - './src/polyfills', - './src' - ] + optimization: { + usedExports: true }, + // This can't be an array: https://webpack.js.org/guides/author-libraries/ + entry: './src/all', module: { rules: [ { From e837000dffd8c7f7c70aef8af0f99f361ca90d76 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 23 Dec 2018 22:26:18 +0900 Subject: [PATCH 015/191] Added Number#clamp. --- CHANGELOG.md | 1 + src/number/all.js | 1 + src/number/clamp/define.js | 3 +++ src/number/clamp/index.js | 1 + src/number/index.js | 1 + src/number/util/clamp.js | 11 +++++++++ src/util/assertions.js | 6 +++++ test/tests/number.js | 49 +++++++++++++++++++++++++++++++------- 8 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 src/number/clamp/define.js create mode 100644 src/number/clamp/index.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 548ab59eb..24a7adfad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ v3.0.0 - Removed `base` param of `Number#pad` in favor of `Number#toHex`. - Removed trigonometric aliases sin, cos, etc in favor of native Math. - Changed `Number#metric` placeholder token from `_` to `-`. +- Removed `Number#cap` in favor of `Number#clamp` with one argument. TODO: diff --git a/src/number/all.js b/src/number/all.js index 56701b014..19ceeb249 100644 --- a/src/number/all.js +++ b/src/number/all.js @@ -1,6 +1,7 @@ import './abbr/define'; import './abs/define'; import './ceil/define'; +import './clamp/define'; import './exp/define'; import './floor/define'; import './format/define'; diff --git a/src/number/clamp/define.js b/src/number/clamp/define.js new file mode 100644 index 000000000..69ba9cfe2 --- /dev/null +++ b/src/number/clamp/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import clamp from './'; +defineInstance('clamp', clamp); diff --git a/src/number/clamp/index.js b/src/number/clamp/index.js new file mode 100644 index 000000000..2f3a8c215 --- /dev/null +++ b/src/number/clamp/index.js @@ -0,0 +1 @@ +export { default } from '../util/clamp'; diff --git a/src/number/index.js b/src/number/index.js index 0322b5794..e91a6987d 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -1,6 +1,7 @@ export { default as abbr } from './abbr'; export { default as abs } from './abs'; export { default as ceil } from './ceil'; +export { default as clamp } from './clamp'; export { default as exp } from './exp'; export { default as floor } from './floor'; export { default as format } from './format'; diff --git a/src/number/util/clamp.js b/src/number/util/clamp.js index d3ba0c6dc..b180aa9dd 100644 --- a/src/number/util/clamp.js +++ b/src/number/util/clamp.js @@ -1,3 +1,14 @@ +import { isNumber } from '../../util/typeChecks'; +import { assertValidNumber } from '../../util/assertions'; + export default function(n, min, max) { + assertValidNumber(n); + if (!isNumber(min)) { + min = n; + } + if (!isNumber(max)) { + max = min; + min = n; + } return Math.min(max, Math.max(min, n)); } diff --git a/src/util/assertions.js b/src/util/assertions.js index f98e2f802..6dd0b8bee 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -18,6 +18,12 @@ function isInteger(n) { return Number.isInteger(n); } +export function assertValidNumber(n) { + if (!n && n !== 0) { + throw new TypeError(n + ' is not a valid number'); + } +} + export function assertFinite(n) { if (!isFinite(n)) { throw new TypeError(n + ' is not a finite number'); diff --git a/test/tests/number.js b/test/tests/number.js index b8627d652..338fd5f73 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -112,6 +112,39 @@ namespace('Number', function() { assertEqual(toChar(65), 'A'); assertEqual(toChar(24536), '忘'); assertEqual(toChar(20294), '但'); + assertError(function() { toChar(NaN); }, RangeError); + assertError(function() { toChar(-1); }, RangeError); + assertError(function() { toChar(.5); }, RangeError); + assertError(function() { toChar(0x110000); }, RangeError); + }); + + instanceMethod('clamp', function(clamp) { + + assertEqual(clamp(0, 1, 10), 1); + assertEqual(clamp(1, 1, 10), 1); + assertEqual(clamp(5, 1, 10), 5); + assertEqual(clamp(10, 1, 10), 10); + assertEqual(clamp(20, 1, 10), 10); + assertEqual(clamp(1e21, 1, 10), 10); + assertEqual(clamp(Infinity, 1, 10), 10); + assertEqual(clamp(-Infinity, 1, 10), 1); + + assertEqual(clamp(-5.5, 1, 10), 1); + assertEqual(clamp(5.5, 1, 10), 5.5); + assertEqual(clamp(15.5, 1, 10), 10); + + assertEqual(clamp(-1, 10), -1); + assertEqual(clamp(0, 10), 0); + assertEqual(clamp(5, 10), 5); + assertEqual(clamp(10, 10), 10); + assertEqual(clamp(20, 10), 10); + + assertEqual(clamp(5), 5); + + assertError(function() { clamp(NaN); }); + assertError(function() { clamp(null); }); + assertError(function() { clamp(undefined); }); + }); instanceMethod('isMultipleOf', function(isMultipleOf) { @@ -192,11 +225,11 @@ namespace('Number', function() { assertEqual(toOrdinal(-4), '-4th'); assertEqual(toOrdinal(-5), '-5th'); - assertError(toOrdinal.bind(null, NaN)); - assertError(toOrdinal.bind(null, 5.55)); - assertError(toOrdinal.bind(null, null)); - assertError(toOrdinal.bind(null, undefined)); - assertError(toOrdinal.bind(null, Infinity)); + assertError(function() { toOrdinal(NaN); }); + assertError(function() { toOrdinal(5.55); }); + assertError(function() { toOrdinal(null); }); + assertError(function() { toOrdinal(undefined); }); + assertError(function() { toOrdinal(Infinity); }); }); @@ -248,7 +281,7 @@ namespace('Number', function() { function assertInvalidInput(n) { assertError(function() { times(n, function() {}); - }, TypeError); + }); } assertTimesRan(1, 1); @@ -271,9 +304,7 @@ namespace('Number', function() { return n; }), [1]); - assertError(function() { - times(1); - }, TypeError); + assertError(function() { times(1); }); }); From c41ec4e9bf451b496c79d2a4c22b7b19474218f3 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 23 Dec 2018 23:30:44 +0900 Subject: [PATCH 016/191] Added Number#upto and Number#downto. --- CHANGELOG.md | 2 + src/number/all.js | 2 + src/number/downto/define.js | 3 ++ src/number/downto/index.js | 7 ++++ src/number/index.js | 2 + src/number/upto/define.js | 3 ++ src/number/upto/index.js | 7 ++++ src/number/util/clamp.js | 25 +++++++----- src/number/util/step.js | 27 +++++++++++++ src/util/assertions.js | 18 +++------ test/helpers/suite.js | 2 +- test/tests/number.js | 77 ++++++++++++++++++++++++++++++++++--- 12 files changed, 147 insertions(+), 28 deletions(-) create mode 100644 src/number/downto/define.js create mode 100644 src/number/downto/index.js create mode 100644 src/number/upto/define.js create mode 100644 src/number/upto/index.js create mode 100644 src/number/util/step.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 24a7adfad..9676bfa13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ v3.0.0 - Removed trigonometric aliases sin, cos, etc in favor of native Math. - Changed `Number#metric` placeholder token from `_` to `-`. - Removed `Number#cap` in favor of `Number#clamp` with one argument. +- Changed `Number#upto` to always iterate from min to max. +- Changed `Number#downto` to always iterate from max to min. TODO: diff --git a/src/number/all.js b/src/number/all.js index 19ceeb249..286b95993 100644 --- a/src/number/all.js +++ b/src/number/all.js @@ -2,6 +2,7 @@ import './abbr/define'; import './abs/define'; import './ceil/define'; import './clamp/define'; +import './downto/define'; import './exp/define'; import './floor/define'; import './format/define'; @@ -23,6 +24,7 @@ import './toChar/define'; import './toHex/define'; import './toOrdinal/define'; import './trunc/define'; +import './upto/define'; export * from '../core/number'; export { default } from '../core/number'; diff --git a/src/number/downto/define.js b/src/number/downto/define.js new file mode 100644 index 000000000..09d73a169 --- /dev/null +++ b/src/number/downto/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import downto from './'; +defineInstance('downto', downto); diff --git a/src/number/downto/index.js b/src/number/downto/index.js new file mode 100644 index 000000000..0b2c6660b --- /dev/null +++ b/src/number/downto/index.js @@ -0,0 +1,7 @@ +import step from '../util/step'; +export default function(n1, n2, ...args) { + if (n1 < n2) { + [n2, n1] = [n1, n2]; + } + return step(n1, n2, args); +} diff --git a/src/number/index.js b/src/number/index.js index e91a6987d..937234d33 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -2,6 +2,7 @@ export { default as abbr } from './abbr'; export { default as abs } from './abs'; export { default as ceil } from './ceil'; export { default as clamp } from './clamp'; +export { default as downto } from './downto'; export { default as exp } from './exp'; export { default as floor } from './floor'; export { default as format } from './format'; @@ -23,6 +24,7 @@ export { default as toChar } from './toChar'; export { default as toHex } from './toHex'; export { default as toOrdinal } from './toOrdinal'; export { default as trunc } from './trunc'; +export { default as upto } from './trunc'; export * from '../core/number'; export { default } from '../core/number'; diff --git a/src/number/upto/define.js b/src/number/upto/define.js new file mode 100644 index 000000000..1bc68dc50 --- /dev/null +++ b/src/number/upto/define.js @@ -0,0 +1,3 @@ +import { defineInstance } from '../../core/number'; +import upto from './'; +defineInstance('upto', upto); diff --git a/src/number/upto/index.js b/src/number/upto/index.js new file mode 100644 index 000000000..172e17b70 --- /dev/null +++ b/src/number/upto/index.js @@ -0,0 +1,7 @@ +import step from '../util/step'; +export default function(n1, n2, ...args) { + if (n1 > n2) { + [n2, n1] = [n1, n2]; + } + return step(n1, n2, args); +} diff --git a/src/number/util/clamp.js b/src/number/util/clamp.js index b180aa9dd..f7b34128f 100644 --- a/src/number/util/clamp.js +++ b/src/number/util/clamp.js @@ -1,14 +1,21 @@ import { isNumber } from '../../util/typeChecks'; -import { assertValidNumber } from '../../util/assertions'; +import { assertNumber } from '../../util/assertions'; -export default function(n, min, max) { - assertValidNumber(n); - if (!isNumber(min)) { - min = n; +export default function(n, ...args) { + const [min, max] = collectArgs(args); + assertNumber(n); + if (isNumber(min)) { + n = Math.max(n, min); } - if (!isNumber(max)) { - max = min; - min = n; + if (isNumber(max)) { + n = Math.min(n, max); } - return Math.min(max, Math.max(min, n)); + return n; +} + +function collectArgs(args) { + if (args.length === 2) { + return [args[0], args[1]]; + } + return [null, args[0]]; } diff --git a/src/number/util/step.js b/src/number/util/step.js new file mode 100644 index 000000000..084d5ffd9 --- /dev/null +++ b/src/number/util/step.js @@ -0,0 +1,27 @@ +import { assertFinite } from '../../util/assertions'; + +export default function(n1, n2, args) { + + assertFinite(n1); + assertFinite(n2); + + const [step, fn] = collectArgs(args); + const inc = (step || 1) * (n1 < n2 ? 1 : -1); + const len = Math.abs(n2 - n1); + const result = []; + + for (let i = 0, n = n1; i <= len; i++) { + result.push(n); + fn(n, i); + n += inc; + } + + return result; +} + +function collectArgs(args) { + if (args.length === 2) { + return [args[0] || 1, args[1]]; + } + return [1, args[0]]; +} diff --git a/src/util/assertions.js b/src/util/assertions.js index 6dd0b8bee..73978591a 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -10,40 +10,32 @@ function usesScientificNotation(n) { return abs >= MAX || abs <= MIN; } -function isFinite(n) { - return Number.isFinite(n); -} - -function isInteger(n) { - return Number.isInteger(n); -} - -export function assertValidNumber(n) { +export function assertNumber(n) { if (!n && n !== 0) { throw new TypeError(n + ' is not a valid number'); } } export function assertFinite(n) { - if (!isFinite(n)) { + if (!Number.isFinite(n)) { throw new TypeError(n + ' is not a finite number'); } } export function assertInteger(n) { - if (!isInteger(n)) { + if (!Number.isInteger(n)) { throw new TypeError(n + ' is not an integer'); } } export function assertPositiveInteger(n) { - if (!isInteger(n) || n <= 0) { + if (!Number.isInteger(n) || n <= 0) { throw new TypeError(n + ' is not a positive integer'); } } export function assertDecimal(n) { - if (!isFinite(n) || usesScientificNotation(n)) { + if (!Number.isFinite(n) || usesScientificNotation(n)) { throw new TypeError(n + ' cannot be represented as a decimal'); } } diff --git a/test/helpers/suite.js b/test/helpers/suite.js index 567d2bec1..447bc2020 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -11,7 +11,7 @@ function assertInstance(methodName) { assertInstanceOf(currentNamespace.prototype[methodName], Function, { - message: '{methodName} should be a static method', + message: '{methodName} should be an instance method', methodName: methodName }); } diff --git a/test/tests/number.js b/test/tests/number.js index 338fd5f73..29f4295b4 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -270,12 +270,12 @@ namespace('Number', function() { instanceMethod('times', function(times) { - function assertTimesRan(n, actual) { + function assertCount(n, expected) { var count = 0; times(n, function() { count++; }); - assertEqual(count, actual); + assertEqual(count, expected); } function assertInvalidInput(n) { @@ -284,9 +284,9 @@ namespace('Number', function() { }); } - assertTimesRan(1, 1); - assertTimesRan(5, 5); - assertTimesRan(10, 10); + assertCount(1, 1); + assertCount(5, 5); + assertCount(10, 10); assertInvalidInput(-1); assertInvalidInput(1.5); @@ -569,4 +569,71 @@ namespace('Number', function() { }); + describe('step', function() { + + function assertPasses(fn, from, to, eCount, eResult) { + var count = 0; + var result = fn(from, to, function() { + count++; + }); + assertEqual(count, eCount); + assertArrayEqual(result, eResult); + } + + function assertArgs(fn, from, to, eResult) { + var result = []; + fn(from, to, function(n, i) { + result.push(Array.prototype.slice.call(arguments)); + }); + assertArrayEqual(result, eResult); + } + + instanceMethod('upto', function(upto) { + + assertPasses(upto, 0, 0, 1, [0]); + assertPasses(upto, 0, 1, 2, [0,1]); + assertPasses(upto, 0, 5, 6, [0,1,2,3,4,5]); + assertPasses(upto, 2,-2, 5, [-2,-1,0,1,2]); + assertPasses(upto,-2, 2, 5, [-2,-1,0,1,2]); + + assertPasses(upto, -.5, .5, 2, [-.5,.5]); + assertPasses(upto, -.5, .6, 2, [-.5,.5]); + assertPasses(upto, -.5, .4, 1, [-.5]); + + assertArgs(upto, -1, 1, [[-1,0],[0,1],[1,2]]); + + assertError(function() { upto(null, 1); }); + assertError(function() { upto(1, null); }); + assertError(function() { upto(NaN, 1); }); + assertError(function() { upto(1, NaN); }); + assertError(function() { upto(-Infinity, 0); }); + assertError(function() { upto(0, Infinity); }); + + }); + + instanceMethod('downto', function(downto) { + + assertPasses(downto, 0, 0, 1, [0]); + assertPasses(downto, 1, 0, 2, [1,0]); + assertPasses(downto, 5, 0, 6, [5,4,3,2,1,0]); + assertPasses(downto, 2,-2, 5, [2,1,0,-1,-2]); + assertPasses(downto,-2, 2, 5, [2,1,0,-1,-2]); + + assertPasses(downto, .5, -.5, 2, [.5,-.5]); + assertPasses(downto, .5, -.6, 2, [.5,-.5]); + assertPasses(downto, .5, -.4, 1, [.5]); + + assertArgs(downto, 1, -1, [[1,0],[0,1],[-1,2]]); + + assertError(function() { downto(null, 1); }); + assertError(function() { downto(1, null); }); + assertError(function() { downto(NaN, 1); }); + assertError(function() { downto(1, NaN); }); + assertError(function() { downto(-Infinity, 0); }); + assertError(function() { downto(0, Infinity); }); + + }); + + }); + }); From 590ccd843418ccd93816c90e6465c2dd8c581057 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 23 Dec 2018 23:46:54 +0900 Subject: [PATCH 017/191] Number#upto and Number#downto should collect arguments. --- CHANGELOG.md | 1 - package.json | 2 +- src/number/util/step.js | 3 +-- test/helpers/methods.js | 2 ++ test/tests/number.js | 11 +++++++++-- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9676bfa13..616581b5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,6 @@ v3.0.0 ====== - Added defineAlias to core. -- Added `Number#atan2` to math aliases. - Added Number aliases `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. - Renamed `Number#chr` to `Number#toChar`. - Renamed `Number#ordinalize` to `Number#toOrdinal`. diff --git a/package.json b/package.json index 8f421f66b..d373e2320 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.23", + "ready-test": "^1.0.24", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", diff --git a/src/number/util/step.js b/src/number/util/step.js index 084d5ffd9..c6d9da6f2 100644 --- a/src/number/util/step.js +++ b/src/number/util/step.js @@ -11,8 +11,7 @@ export default function(n1, n2, args) { const result = []; for (let i = 0, n = n1; i <= len; i++) { - result.push(n); - fn(n, i); + result.push(fn ? fn(n, i) : n); n += inc; } diff --git a/test/helpers/methods.js b/test/helpers/methods.js index 1915c696a..bb0c10b7c 100644 --- a/test/helpers/methods.js +++ b/test/helpers/methods.js @@ -1,3 +1,5 @@ +noop = function() {}; + arg = function(obj, arg) { return arg; }; diff --git a/test/tests/number.js b/test/tests/number.js index 29f4295b4..4cf0bdab8 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -280,7 +280,7 @@ namespace('Number', function() { function assertInvalidInput(n) { assertError(function() { - times(n, function() {}); + times(n, noop); }); } @@ -573,8 +573,9 @@ namespace('Number', function() { function assertPasses(fn, from, to, eCount, eResult) { var count = 0; - var result = fn(from, to, function() { + var result = fn(from, to, function(n) { count++; + return n; }); assertEqual(count, eCount); assertArrayEqual(result, eResult); @@ -602,6 +603,9 @@ namespace('Number', function() { assertArgs(upto, -1, 1, [[-1,0],[0,1],[1,2]]); + assertArrayEqual(upto(0, 5), [0,1,2,3,4,5]); + assertArrayEqual(upto(0, 1, noop), [undefined, undefined]); + assertError(function() { upto(null, 1); }); assertError(function() { upto(1, null); }); assertError(function() { upto(NaN, 1); }); @@ -625,6 +629,9 @@ namespace('Number', function() { assertArgs(downto, 1, -1, [[1,0],[0,1],[-1,2]]); + assertArrayEqual(downto(5, 0), [5,4,3,2,1,0]); + assertArrayEqual(downto(0, 1, noop), [undefined, undefined]); + assertError(function() { downto(null, 1); }); assertError(function() { downto(1, null); }); assertError(function() { downto(NaN, 1); }); From 1e0478ae93bb557df6620303b3cb22326f9038b9 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 24 Dec 2018 05:03:59 +0900 Subject: [PATCH 018/191] Added Number.range. --- src/number/all.js | 1 + src/number/downto/index.js | 5 +- src/number/index.js | 1 + src/number/range/define.js | 3 + src/number/range/index.js | 9 +++ src/number/upto/index.js | 5 +- src/number/util/step.js | 26 -------- src/util/Range.js | 92 ++++++++++++++++++++++++++ src/util/assertions.js | 6 ++ src/util/step.js | 33 ++++++++++ test/helpers/methods.js | 12 +++- test/tests/chainable.js | 6 +- test/tests/extended.js | 4 +- test/tests/number.js | 129 ++++++++++++++++++++++++++++++++----- 14 files changed, 280 insertions(+), 52 deletions(-) create mode 100644 src/number/range/define.js create mode 100644 src/number/range/index.js delete mode 100644 src/number/util/step.js create mode 100644 src/util/Range.js create mode 100644 src/util/step.js diff --git a/src/number/all.js b/src/number/all.js index 286b95993..1f924ad46 100644 --- a/src/number/all.js +++ b/src/number/all.js @@ -17,6 +17,7 @@ import './log/define'; import './pad/define'; import './pow/define'; import './random/define'; +import './range/define'; import './round/define'; import './sqrt/define'; import './times/define'; diff --git a/src/number/downto/index.js b/src/number/downto/index.js index 0b2c6660b..c08d9c905 100644 --- a/src/number/downto/index.js +++ b/src/number/downto/index.js @@ -1,7 +1,8 @@ -import step from '../util/step'; +import step from '../../util/step'; + export default function(n1, n2, ...args) { if (n1 < n2) { [n2, n1] = [n1, n2]; } - return step(n1, n2, args); + return step(n1, n2, ...args); } diff --git a/src/number/index.js b/src/number/index.js index 937234d33..9d17f20b4 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -17,6 +17,7 @@ export { default as log } from './log'; export { default as pad } from './pad'; export { default as pow } from './pow'; export { default as random } from './random'; +export { default as range } from './range'; export { default as round } from './round'; export { default as sqrt } from './sqrt'; export { default as times } from './times'; diff --git a/src/number/range/define.js b/src/number/range/define.js new file mode 100644 index 000000000..644c5f77e --- /dev/null +++ b/src/number/range/define.js @@ -0,0 +1,3 @@ +import { defineStatic } from '../../core/number'; +import range from './'; +defineStatic('range', range); diff --git a/src/number/range/index.js b/src/number/range/index.js new file mode 100644 index 000000000..6cd025601 --- /dev/null +++ b/src/number/range/index.js @@ -0,0 +1,9 @@ +import Range from '../../util/Range'; + +export default function(start, end) { + return new NumberRange(start, end); +} + +class NumberRange extends Range { +} + diff --git a/src/number/upto/index.js b/src/number/upto/index.js index 172e17b70..1392484f0 100644 --- a/src/number/upto/index.js +++ b/src/number/upto/index.js @@ -1,7 +1,8 @@ -import step from '../util/step'; +import step from '../../util/step'; + export default function(n1, n2, ...args) { if (n1 > n2) { [n2, n1] = [n1, n2]; } - return step(n1, n2, args); + return step(n1, n2, ...args); } diff --git a/src/number/util/step.js b/src/number/util/step.js deleted file mode 100644 index c6d9da6f2..000000000 --- a/src/number/util/step.js +++ /dev/null @@ -1,26 +0,0 @@ -import { assertFinite } from '../../util/assertions'; - -export default function(n1, n2, args) { - - assertFinite(n1); - assertFinite(n2); - - const [step, fn] = collectArgs(args); - const inc = (step || 1) * (n1 < n2 ? 1 : -1); - const len = Math.abs(n2 - n1); - const result = []; - - for (let i = 0, n = n1; i <= len; i++) { - result.push(fn ? fn(n, i) : n); - n += inc; - } - - return result; -} - -function collectArgs(args) { - if (args.length === 2) { - return [args[0] || 1, args[1]]; - } - return [1, args[0]]; -} diff --git a/src/util/Range.js b/src/util/Range.js new file mode 100644 index 000000000..397fb4271 --- /dev/null +++ b/src/util/Range.js @@ -0,0 +1,92 @@ +import step from './step'; + +export default class Range { + + constructor(start, end) { + this.start = start; + this.end = end; + } + + toString() { + return this.isValid() ? this.start + '..' + this.end : 'Invalid Range'; + } + + isValid() { + return this.isValidMember(this.start) && this.isValidMember(this.end); + } + + toArray() { + return this.every(1); + } + + span() { + return Math.abs(this.end - this.start) + 1; + } + + clone() { + return create(this, this.start, this.end); + } + + clamp(val) { + return Math.min(getMax(this), Math.max(getMin(this), val)); + } + + every(...args) { + return step(...getValues(this), ...args); + } + + contains(obj) { + if (obj instanceof Range) { + return getMin(obj) >= getMin(this) && getMax(obj) <= getMax(this); + } + return obj >= this.start && obj <= this.end; + } + + intersect(r) { + let start, end; + const [rMin, rMax] = [getMin(r), getMax(r)]; + const [tMin, tMax] = [getMin(this), getMax(this)]; + if (rMin > tMax || rMax < tMin) { + start = NaN; + end = NaN; + } else { + start = Math.max(rMin, tMin); + end = Math.min(rMax, tMax); + } + return create(this, start, end); + } + + union(r) { + const start = Math.min(getMin(r), getMin(this)); + const end = Math.max(getMax(r), getMax(this)); + return create(this, start, end); + } + + // Protected + + isValidMember(member) { + return Number.isFinite(this.toValue(member)); + } + + toValue(val) { + return val.valueOf(); + } + +} + +function create(r, start, end) { + return new r.constructor(start, end); +} + +function getMin(range) { + return Math.min(...getValues(range)); +} + +function getMax(range) { + return Math.max(...getValues(range)); +} + +function getValues(range) { + return [range.toValue(range.start), range.toValue(range.end)]; +} + diff --git a/src/util/assertions.js b/src/util/assertions.js index 73978591a..22e79646f 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -16,6 +16,12 @@ export function assertNumber(n) { } } +export function assertPositiveNumber(n) { + if (n <= 0) { + throw new TypeError(n + ' is not a positive number'); + } +} + export function assertFinite(n) { if (!Number.isFinite(n)) { throw new TypeError(n + ' is not a finite number'); diff --git a/src/util/step.js b/src/util/step.js new file mode 100644 index 000000000..db21a2d83 --- /dev/null +++ b/src/util/step.js @@ -0,0 +1,33 @@ +import { isNumber } from './typeChecks'; +import { assertFinite, assertPositiveNumber } from './assertions'; + +export default function(n1, n2, ...args) { + + assertFinite(n1); + assertFinite(n2); + + const [step, fn] = collectArgs(args); + + assertFinite(step); + assertPositiveNumber(step); + + const inc = (step || 1) * (n1 < n2 ? 1 : -1); + const len = Math.abs(n2 - n1); + const result = []; + + for (let i = 0, n = n1; i <= len; i += step) { + result.push(fn ? fn(n, i) : n); + n += inc; + } + + return result; +} + +function collectArgs(args) { + if (args.length === 0) { + return [1]; + } else if (args.length === 1) { + return [args[0]]; + } + return [args[0], args[1]]; +} diff --git a/test/helpers/methods.js b/test/helpers/methods.js index bb0c10b7c..394f79a13 100644 --- a/test/helpers/methods.js +++ b/test/helpers/methods.js @@ -1,7 +1,7 @@ noop = function() {}; -arg = function(obj, arg) { - return arg; +arg2 = function() { + return arguments[1]; }; add = function(n1, n2) { @@ -11,3 +11,11 @@ add = function(n1, n2) { mult = function(n1, n2) { return n1 * n2; }; + +square = function(n) { + return n * n; +}; + +args = function() { + return Array.prototype.slice.call(arguments); +} diff --git a/test/tests/chainable.js b/test/tests/chainable.js index 91474d38e..e10b2fa14 100644 --- a/test/tests/chainable.js +++ b/test/tests/chainable.js @@ -59,8 +59,8 @@ describe('Chainable', function() { it('should allow chaining across namespaces', function() { // Note that Object is being used here as a safeguard as // it's behavior differs slightly when extending. - Sugar.Number.defineInstance('argObject', arg); - Sugar.Object.defineInstance('argNumber', arg); + Sugar.Number.defineInstance('argObject', arg2); + Sugar.Object.defineInstance('argNumber', arg2); assertEqual(new Sugar.Number().argObject({}).argNumber(1).raw, 1); delete Sugar.Number.argObject; delete Sugar.Object.argNumber; @@ -71,7 +71,7 @@ describe('Chainable', function() { describe('Wrapping Behavior', function() { beforeEach(function() { - Sugar.Number.defineInstance('arg', arg); + Sugar.Number.defineInstance('arg', arg2); }); afterEach(function() { diff --git a/test/tests/extended.js b/test/tests/extended.js index 82d7af40b..1f22529f8 100644 --- a/test/tests/extended.js +++ b/test/tests/extended.js @@ -8,11 +8,11 @@ describe('Extended', function() { beforeEach(function() { Sugar.Number.defineStatic('addStatic', add); - Sugar.Object.defineStatic('argStatic', arg); + Sugar.Object.defineStatic('argStatic', arg2); Sugar.Number.defineInstance('add', add); Sugar.Number.defineInstance('mult', mult); Sugar.String.defineInstance('add', add); - Sugar.Object.defineInstance('arg', arg); + Sugar.Object.defineInstance('arg', arg2); }); afterEach(function() { diff --git a/test/tests/number.js b/test/tests/number.js index 4cf0bdab8..2e4b68c41 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -31,6 +31,89 @@ namespace('Number', function() { assertEqual(round(1e-21, -1), 0); }); + staticMethod('range', function(range) { + + // toString + assertEqual(range(1, 5).toString(), '1..5'); + assertEqual(range(1, NaN).toString(), 'Invalid Range'); + + // isValid + assertTrue(range(1, 5).isValid()); + assertTrue(range(5, 1).isValid()); + assertTrue(range(0, 0).isValid()); + assertFalse(range(5, NaN).isValid()); + assertFalse(range(NaN, 5).isValid()); + assertFalse(range(5, Infinity).isValid()); + assertFalse(range(Infinity, 5).isValid()); + + // span + assertEqual(range(1, 5).span(), 5); + assertEqual(range(5, 1).span(), 5); + assertNaN(range(NaN, NaN).span()); + + // toArray + assertArrayEqual(range(1, 5).toArray(), [1,2,3,4,5]); + assertArrayEqual(range(5, 1).toArray(), [5,4,3,2,1]); + assertArrayEqual(range(-2, 2).toArray(), [-2,-1,0,1,2]); + assertArrayEqual(range(2, -2).toArray(), [2,1,0,-1,-2]); + + // clone + assertEqual(range(1, 5).clone().toString(), '1..5'); + + // clamp + assertEqual(range(1, 5).clamp(8), 5); + assertEqual(range(1, 5).clamp(0), 1); + assertEqual(range(5, 1).clamp(8), 5); + assertEqual(range(5, 1).clamp(0), 1); + + // contains + assertTrue(range(1, 5).contains(range(1, 3))); + assertTrue(range(1, 5).contains(range(1, 1))); + assertTrue(range(1, 5).contains(range(5, 5))); + assertTrue(range(1, 5).contains(range(5, 4))); + assertFalse(range(1, 5).contains(range(6, 8))); + assertFalse(range(1, 5).contains(range(0, 1))); + assertFalse(range(1, 5).contains(range(0, 2))); + assertFalse(range(1, 5).contains(range(2, 0))); + assertFalse(range(1, 5).contains(range(4, 6))); + assertFalse(range(1, 5).contains(range(6, 4))); + assertFalse(range(1, 5).contains(range(0, 6))); + + // every + assertArrayEqual(range(1, 5).every(1), [1,2,3,4,5]); + assertArrayEqual(range(1, 5).every(2), [1,3,5]); + assertArrayEqual(range(1, 5).every(2, square), [1,9,25]); + assertArrayEqual(range(1, 2).every(1, args), [[1,0], [2,1]]); + + // intersect + assertEqual(range(1,10).intersect(range(5,15)).toString(), '5..10'); + assertEqual(range(1,10).intersect(range(15,5)).toString(), '5..10'); + assertEqual(range(1,10).intersect(range(0,3)).toString(), '1..3'); + assertEqual(range(1,10).intersect(range(3,0)).toString(), '1..3'); + assertEqual(range(10,1).intersect(range(5,15)).toString(), '5..10'); + assertEqual(range(10,1).intersect(range(15,5)).toString(), '5..10'); + assertEqual(range(10,1).intersect(range(0,3)).toString(), '1..3'); + assertEqual(range(10,1).intersect(range(3,0)).toString(), '1..3'); + + assertEqual(range(0,5).intersect(range(8,10)).toString(), 'Invalid Range'); + assertEqual(range(0,5).intersect(range(NaN,NaN)).toString(), 'Invalid Range'); + assertEqual(range(NaN,NaN).intersect(range(8,10)).toString(), 'Invalid Range'); + + // union + assertEqual(range(1,10).union(range(5,15)).toString(), '1..15'); + assertEqual(range(1,10).union(range(15,5)).toString(), '1..15'); + assertEqual(range(1,10).union(range(0,3)).toString(), '0..10'); + assertEqual(range(1,10).union(range(3,0)).toString(), '0..10'); + assertEqual(range(10,1).union(range(5,15)).toString(), '1..15'); + assertEqual(range(10,1).union(range(15,5)).toString(), '1..15'); + assertEqual(range(10,1).union(range(0,3)).toString(), '0..10'); + assertEqual(range(10,1).union(range(3,0)).toString(), '0..10'); + + assertEqual(range(0,5).union(range(NaN,NaN)).toString(), 'Invalid Range'); + assertEqual(range(NaN,NaN).union(range(8,10)).toString(), 'Invalid Range'); + + }); + instanceMethod('ceil', function(ceil) { assertEqual(ceil(5.5), 6); assertEqual(ceil(5.14), 6); @@ -573,7 +656,7 @@ namespace('Number', function() { function assertPasses(fn, from, to, eCount, eResult) { var count = 0; - var result = fn(from, to, function(n) { + var result = fn(from, to, 1, function(n) { count++; return n; }); @@ -581,14 +664,6 @@ namespace('Number', function() { assertArrayEqual(result, eResult); } - function assertArgs(fn, from, to, eResult) { - var result = []; - fn(from, to, function(n, i) { - result.push(Array.prototype.slice.call(arguments)); - }); - assertArrayEqual(result, eResult); - } - instanceMethod('upto', function(upto) { assertPasses(upto, 0, 0, 1, [0]); @@ -601,11 +676,17 @@ namespace('Number', function() { assertPasses(upto, -.5, .6, 2, [-.5,.5]); assertPasses(upto, -.5, .4, 1, [-.5]); - assertArgs(upto, -1, 1, [[-1,0],[0,1],[1,2]]); - assertArrayEqual(upto(0, 5), [0,1,2,3,4,5]); - assertArrayEqual(upto(0, 1, noop), [undefined, undefined]); + assertArrayEqual(upto(0, 1, 1, noop), [undefined, undefined]); + assertArrayEqual(upto(0, 6, 10), [0]); + assertArrayEqual(upto(0, 6, 2), [0,2,4,6]); + assertArrayEqual(upto(0, 2, .5), [0,0.5,1,1.5,2]); + + // Callback arguments + assertArrayEqual(upto(-1, 1, 1, args), [[-1,0],[0,1],[1,2]]); + + // Invalid input assertError(function() { upto(null, 1); }); assertError(function() { upto(1, null); }); assertError(function() { upto(NaN, 1); }); @@ -613,6 +694,12 @@ namespace('Number', function() { assertError(function() { upto(-Infinity, 0); }); assertError(function() { upto(0, Infinity); }); + // Invalid step + assertError(function() { upto(1, 4, 0); }); + assertError(function() { upto(1, 4, -2); }); + assertError(function() { upto(1, 4, Infinity); }); + assertError(function() { upto(1, 4, NaN); }); + }); instanceMethod('downto', function(downto) { @@ -627,11 +714,17 @@ namespace('Number', function() { assertPasses(downto, .5, -.6, 2, [.5,-.5]); assertPasses(downto, .5, -.4, 1, [.5]); - assertArgs(downto, 1, -1, [[1,0],[0,1],[-1,2]]); - assertArrayEqual(downto(5, 0), [5,4,3,2,1,0]); - assertArrayEqual(downto(0, 1, noop), [undefined, undefined]); + assertArrayEqual(downto(0, 1, 1, noop), [undefined, undefined]); + assertArrayEqual(downto(0, 6, 10), [6]); + assertArrayEqual(downto(5, 0, 2), [5,3,1]); + assertArrayEqual(downto(2, 0, .5), [2,1.5,1,0.5,0]); + + // Callback arguments + assertArrayEqual(downto(1,-1,1,args), [[1,0],[0,1],[-1,2]]); + + // Invalid input assertError(function() { downto(null, 1); }); assertError(function() { downto(1, null); }); assertError(function() { downto(NaN, 1); }); @@ -639,6 +732,12 @@ namespace('Number', function() { assertError(function() { downto(-Infinity, 0); }); assertError(function() { downto(0, Infinity); }); + // Invalid step + assertError(function() { upto(1, 4, 0); }); + assertError(function() { upto(1, 4, -2); }); + assertError(function() { upto(1, 4, Infinity); }); + assertError(function() { upto(1, 4, NaN); }); + }); }); From 85bbe4e097a7339f2d94db6a38dfc9164954a557 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 24 Dec 2018 17:10:04 +0900 Subject: [PATCH 019/191] Added String.range. --- .eslintignore | 6 +- package.json | 2 +- src/all.js | 1 + src/core/index.js | 8 --- src/number/range/index.js | 4 +- src/string/all.js | 4 ++ src/string/index.js | 4 ++ src/string/range/define.js | 3 + src/string/range/index.js | 29 +++++++++ src/util/Range.js | 83 +++++++++++++++---------- src/util/step.js | 3 +- test/.eslintrc | 39 +----------- test/helpers/intl.js | 2 +- test/helpers/methods.js | 6 +- test/helpers/module.js | 23 ------- test/helpers/suite.js | 3 +- test/index.html | 1 + test/index.js | 2 +- test/tests/modules/namespace-all.js | 1 + test/tests/number.js | 9 +-- test/tests/string.js | 94 +++++++++++++++++++++++++++++ 21 files changed, 208 insertions(+), 119 deletions(-) create mode 100644 src/string/all.js create mode 100644 src/string/range/define.js create mode 100644 src/string/range/index.js delete mode 100644 test/helpers/module.js create mode 100644 test/tests/string.js diff --git a/.eslintignore b/.eslintignore index c07a79c88..151ad50d2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,8 +1,4 @@ -test/tests -test/suite -test/rhino -test/node -test/browser +test/OLD dist lib gulpfile.js diff --git a/package.json b/package.json index d373e2320..25959b0b1 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "merge-stream": "^0.1.8", "mkdirp": "^0.5.1", "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.24", + "ready-test": "^1.0.25", "rimraf": "^2.4.4", "sinon": "^1.15.4", "string-replace-loader": "^2.1.1", diff --git a/src/all.js b/src/all.js index 549c9a3e2..550918a37 100644 --- a/src/all.js +++ b/src/all.js @@ -1,4 +1,5 @@ import './number/all'; +import './string/all'; export * from './'; export { default } from './'; diff --git a/src/core/index.js b/src/core/index.js index f67a3b063..17fd5897b 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -7,8 +7,6 @@ import { isString, isFunction } from '../util/typeChecks'; // --- Constants -const SUGAR = 'Sugar'; - export const VERSION = 'edge'; @@ -99,12 +97,6 @@ function assertMethodDoesNotExist(SugarChainable, methodName) { } } -function assertNamedFunction(fn) { - if (!fn.name) { - throw new TypeError(`Function requires a name: ${fn}`); - } -} - function wrapStaticMethodAsInstance(SugarChainable, fn) { return function(...args) { args.unshift(this); diff --git a/src/number/range/index.js b/src/number/range/index.js index 6cd025601..4f51200b5 100644 --- a/src/number/range/index.js +++ b/src/number/range/index.js @@ -4,6 +4,4 @@ export default function(start, end) { return new NumberRange(start, end); } -class NumberRange extends Range { -} - +class NumberRange extends Range {} diff --git a/src/string/all.js b/src/string/all.js new file mode 100644 index 000000000..132928a2d --- /dev/null +++ b/src/string/all.js @@ -0,0 +1,4 @@ +import './range/define'; + +export * from '../core/string'; +export { default } from '../core/string'; diff --git a/src/string/index.js b/src/string/index.js index e69de29bb..ba03ffc90 100644 --- a/src/string/index.js +++ b/src/string/index.js @@ -0,0 +1,4 @@ +export { default as range } from './range'; + +export * from '../core/string'; +export { default } from '../core/string'; diff --git a/src/string/range/define.js b/src/string/range/define.js new file mode 100644 index 000000000..527e75033 --- /dev/null +++ b/src/string/range/define.js @@ -0,0 +1,3 @@ +import { defineStatic } from '../../core/string'; +import range from './'; +defineStatic('range', range); diff --git a/src/string/range/index.js b/src/string/range/index.js new file mode 100644 index 000000000..789a9392b --- /dev/null +++ b/src/string/range/index.js @@ -0,0 +1,29 @@ +import Range from '../../util/Range'; +import { isString } from '../../util/typeChecks'; + +const MULTIBYTE_START = 0xD800; + +export default function(start, end) { + return new CharRange(start, end); +} + +class CharRange extends Range { + + isValidMember(m) { + if (!m) { + return false; + } + const len = this.getValue(m) > MULTIBYTE_START ? 2 : 1; + return m.length === len; + } + + getValue(m) { + return isString(m) ? m.codePointAt(0) : null; + } + + getMember(val) { + // Let an empty string stand in for an unknown invalid value. + return val >= 0 ? String.fromCodePoint(val) : ''; + } + +} diff --git a/src/util/Range.js b/src/util/Range.js index 397fb4271..632646cc5 100644 --- a/src/util/Range.js +++ b/src/util/Range.js @@ -1,4 +1,4 @@ -import step from './step'; +import step, { collectArgs } from './step'; export default class Range { @@ -15,37 +15,45 @@ export default class Range { return this.isValidMember(this.start) && this.isValidMember(this.end); } + clone() { + return create(this, this.start, this.end); + } + toArray() { return this.every(1); } span() { - return Math.abs(this.end - this.start) + 1; + return Math.abs(this.getStart() - this.getEnd()) + 1; } - clone() { - return create(this, this.start, this.end); - } - - clamp(val) { - return Math.min(getMax(this), Math.max(getMin(this), val)); + clamp(m) { + const val = Math.min(this.getMax(), Math.max(this.getMin(), this.getValue(m))); + return this.getMember(val); } every(...args) { - return step(...getValues(this), ...args); + if (!this.isValid()) { + return []; + } + const [n, fn] = collectArgs(args); + return step(this.getStart(), this.getEnd(), n, (val, ...args) => { + const m = this.getMember(val); + return fn ? fn.apply(this, [m, ...args]) : m; + }); } contains(obj) { if (obj instanceof Range) { - return getMin(obj) >= getMin(this) && getMax(obj) <= getMax(this); + return obj.getMin() >= this.getMin() && obj.getMax() <= this.getMax(); } return obj >= this.start && obj <= this.end; } intersect(r) { let start, end; - const [rMin, rMax] = [getMin(r), getMax(r)]; - const [tMin, tMax] = [getMin(this), getMax(this)]; + const [rMin, rMax] = [r.getMin(), r.getMax()]; + const [tMin, tMax] = [this.getMin(), this.getMax()]; if (rMin > tMax || rMax < tMin) { start = NaN; end = NaN; @@ -53,40 +61,53 @@ export default class Range { start = Math.max(rMin, tMin); end = Math.min(rMax, tMax); } - return create(this, start, end); + return createFromValues(this, start, end); } union(r) { - const start = Math.min(getMin(r), getMin(this)); - const end = Math.max(getMax(r), getMax(this)); - return create(this, start, end); + const start = Math.min(r.getMin(), this.getMin()); + const end = Math.max(r.getMax(), this.getMax()); + return createFromValues(this, start, end); } // Protected - isValidMember(member) { - return Number.isFinite(this.toValue(member)); + isValidMember(m) { + return Number.isFinite(this.getValue(m)); } - toValue(val) { - return val.valueOf(); + getValue(m) { + return m.valueOf(); } -} + getMember(val) { + return val; + } -function create(r, start, end) { - return new r.constructor(start, end); -} + // Private -function getMin(range) { - return Math.min(...getValues(range)); -} + getStart() { + return this.getValue(this.start); + } + + getEnd() { + return this.getValue(this.end); + } + + getMin() { + return Math.min(this.getStart(), this.getEnd()); + } + + getMax() { + return Math.max(this.getStart(), this.getEnd()); + } -function getMax(range) { - return Math.max(...getValues(range)); } -function getValues(range) { - return [range.toValue(range.start), range.toValue(range.end)]; +function create(r, start, end) { + return new r.constructor(start, end); } +function createFromValues(r, start, end) { + return create(r, r.getMember(start), r.getMember(end)); +} diff --git a/src/util/step.js b/src/util/step.js index db21a2d83..3af5f58ea 100644 --- a/src/util/step.js +++ b/src/util/step.js @@ -1,4 +1,3 @@ -import { isNumber } from './typeChecks'; import { assertFinite, assertPositiveNumber } from './assertions'; export default function(n1, n2, ...args) { @@ -23,7 +22,7 @@ export default function(n1, n2, ...args) { return result; } -function collectArgs(args) { +export function collectArgs(args) { if (args.length === 0) { return [1]; } else if (args.length === 1) { diff --git a/test/.eslintrc b/test/.eslintrc index 004578b60..7a2b6468c 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,43 +1,6 @@ { - "globals": { - "it": true, - "fit": true, - "xit": true, - "arg": true, - "add": true, - "mult": true, - "Sugar": true, - "method": true, - "xmethod": true, - "fmethod": true, - "namespace": true, - "xnamespace": true, - "fnamespace": true, - "describe": true, - "xdescribe": true, - "fdescribe": true, - "afterAll": true, - "afterEach": true, - "afterFalse": true, - "beforeAll": true, - "beforeEach": true, - "assertNaN": true, - "assertNull": true, - "assertTrue": true, - "assertFalse": true, - "assertError": true, - "assertEqual": true, - "assertOneOf": true, - "assertMatch": true, - "assertNoError": true, - "assertUndefined": true, - "assertArrayEqual": true, - "assertInstanceOf": true, - "withNumberFormatter": true, - "assertMatchingNamedExports": true, - "ensureNamespaceNotInitialized": true, - }, "rules": { + "no-undef": ["off"], "comma-dangle": ["error"], "no-global-assign": [ "error", { diff --git a/test/helpers/intl.js b/test/helpers/intl.js index cab59d215..8d0da6597 100644 --- a/test/helpers/intl.js +++ b/test/helpers/intl.js @@ -1,6 +1,6 @@ (function() { - const INTL_SUPPORT = checkFullIntlSupport(); + var INTL_SUPPORT = checkFullIntlSupport(); function checkFullIntlSupport() { try { diff --git a/test/helpers/methods.js b/test/helpers/methods.js index 394f79a13..6a965251e 100644 --- a/test/helpers/methods.js +++ b/test/helpers/methods.js @@ -18,4 +18,8 @@ square = function(n) { args = function() { return Array.prototype.slice.call(arguments); -} +}; + +concatA = function(str) { + return str + 'A'; +}; diff --git a/test/helpers/module.js b/test/helpers/module.js deleted file mode 100644 index 9f6c41771..000000000 --- a/test/helpers/module.js +++ /dev/null @@ -1,23 +0,0 @@ - -function getModuleNamedExports(module) { - return Object.keys(module).filter(function(name) { - return name !== 'default'; - }); -} - -assertMatchingNamedExports = function(module) { - var allNames = getModuleNamedExports(module).concat(Object.keys(module.default)); - var asserted = {}; - allNames.forEach(function(name) { - if (asserted[name]) { - return; - } - asserted[name] = true; - - var exportExists = Object.prototype.hasOwnProperty.call(module, name); - var propertyExists = module.default.hasOwnProperty(name); - - var msg = name + ' should be a named export and property'; - assertTrue(exportExists && propertyExists, msg); - }); -}; diff --git a/test/helpers/suite.js b/test/helpers/suite.js index 447bc2020..574546067 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -1,8 +1,9 @@ (function() { + /* eslint-disable no-undef */ var currentNamespace; - function assertStatic(methodName, instanceFn) { + function assertStatic(methodName) { assertUndefined(currentNamespace.prototype[methodName], { message: '{methodName} should be a static method', methodName: methodName diff --git a/test/index.html b/test/index.html index fdaaebd74..836ef073a 100644 --- a/test/index.html +++ b/test/index.html @@ -17,5 +17,6 @@ + diff --git a/test/index.js b/test/index.js index 1d03d4e8e..59445714e 100644 --- a/test/index.js +++ b/test/index.js @@ -11,13 +11,13 @@ global.Sugar = Sugar; // Helpers import './helpers/namespace'; import './helpers/methods'; -import './helpers/module'; import './helpers/suite'; import './helpers/intl'; // Tests import './tests/core'; import './tests/number'; +import './tests/string'; import './tests/extended'; import './tests/chainable'; import './tests/modules'; diff --git a/test/tests/modules/namespace-all.js b/test/tests/modules/namespace-all.js index 7436399d7..1172b08ca 100644 --- a/test/tests/modules/namespace-all.js +++ b/test/tests/modules/namespace-all.js @@ -20,6 +20,7 @@ describe('Namespace All Module', function() { it('should have defined methods', function() { assertEqual(Exports.default.abs(-5), 5); + /* eslint-disable-next-line new-cap */ assertEqual(new Exports.default(-5).abs().raw, 5); }); diff --git a/test/tests/number.js b/test/tests/number.js index 2e4b68c41..df16bd729 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -56,6 +56,7 @@ namespace('Number', function() { assertArrayEqual(range(5, 1).toArray(), [5,4,3,2,1]); assertArrayEqual(range(-2, 2).toArray(), [-2,-1,0,1,2]); assertArrayEqual(range(2, -2).toArray(), [2,1,0,-1,-2]); + assertArrayEqual(range(NaN, NaN).toArray(), []); // clone assertEqual(range(1, 5).clone().toString(), '1..5'); @@ -733,10 +734,10 @@ namespace('Number', function() { assertError(function() { downto(0, Infinity); }); // Invalid step - assertError(function() { upto(1, 4, 0); }); - assertError(function() { upto(1, 4, -2); }); - assertError(function() { upto(1, 4, Infinity); }); - assertError(function() { upto(1, 4, NaN); }); + assertError(function() { downto(1, 4, 0); }); + assertError(function() { downto(1, 4, -2); }); + assertError(function() { downto(1, 4, Infinity); }); + assertError(function() { downto(1, 4, NaN); }); }); diff --git a/test/tests/string.js b/test/tests/string.js new file mode 100644 index 000000000..2ec92d68b --- /dev/null +++ b/test/tests/string.js @@ -0,0 +1,94 @@ +'use strict'; + +namespace('String', function() { + + staticMethod('range', function(range) { + + // toString + assertEqual(range('a', 'z').toString(), 'a..z'); + assertEqual(range('a', null).toString(), 'Invalid Range'); + + // isValid + assertTrue(range('a', 'z').isValid()); + assertTrue(range('z', 'a').isValid()); + assertTrue(range('a', 'a').isValid()); + assertTrue(range('🍺', '🎅').isValid()); + assertTrue(range(' ', ' ').isValid()); + assertFalse(range('a', null).isValid()); + assertFalse(range(null, 'a').isValid()); + assertFalse(range('a', '').isValid()); + assertFalse(range('', 'z').isValid()); + assertFalse(range('ab', 'yz').isValid()); + assertFalse(range('ab', 'z').isValid()); + assertFalse(range('a', 'yz').isValid()); + + // span + assertEqual(range('a', 'z').span(), 26); + assertEqual(range('z', 'a').span(), 26); + assertEqual(range('a', 'a').span(), 1); + assertNaN(range('', '').span()); + + // toArray + assertArrayEqual(range('a', 'd').toArray(), ['a','b','c','d']); + assertArrayEqual(range('d', 'a').toArray(), ['d','c','b','a']); + assertArrayEqual(range('', 'd').toArray(), []); + assertArrayEqual(range('d', '').toArray(), []); + + // clone + assertEqual(range('a','z').clone().toString(), 'a..z'); + + // clamp + assertEqual(range('c','d').clamp('z'), 'd'); + assertEqual(range('c','d').clamp('a'), 'c'); + assertEqual(range('d','c').clamp('z'), 'd'); + assertEqual(range('d','c').clamp('a'), 'c'); + + // contains + assertTrue(range('b', 'f').contains(range('b', 'd'))); + assertTrue(range('b', 'f').contains(range('b', 'b'))); + assertTrue(range('b', 'f').contains(range('f', 'f'))); + assertTrue(range('b', 'f').contains(range('f', 'e'))); + assertFalse(range('b', 'f').contains(range('g', 'h'))); + assertFalse(range('b', 'f').contains(range('a', 'b'))); + assertFalse(range('b', 'f').contains(range('a', 'c'))); + assertFalse(range('b', 'f').contains(range('c', 'a'))); + assertFalse(range('b', 'f').contains(range('d', 'g'))); + assertFalse(range('b', 'f').contains(range('g', 'd'))); + assertFalse(range('b', 'f').contains(range('a', 'g'))); + + // every + assertArrayEqual(range('a', 'd').every(1), ['a','b','c','d']); + assertArrayEqual(range('a', 'd').every(2), ['a','c']); + assertArrayEqual(range('a', 'd').every(2, concatA), ['aA','cA']); + assertArrayEqual(range('a', 'b').every(1, args), [['a',0], ['b',1]]); + + // intersect + assertEqual(range('b','d').intersect(range('c','g')).toString(), 'c..d'); + assertEqual(range('b','d').intersect(range('g','c')).toString(), 'c..d'); + assertEqual(range('b','d').intersect(range('a','c')).toString(), 'b..c'); + assertEqual(range('b','d').intersect(range('c','a')).toString(), 'b..c'); + assertEqual(range('d','b').intersect(range('c','g')).toString(), 'c..d'); + assertEqual(range('d','b').intersect(range('g','c')).toString(), 'c..d'); + assertEqual(range('d','b').intersect(range('a','c')).toString(), 'b..c'); + assertEqual(range('d','b').intersect(range('c','a')).toString(), 'b..c'); + + assertEqual(range('a','c').intersect(range('d','f')).toString(), 'Invalid Range'); + assertEqual(range('a','c').intersect(range('','')).toString(), 'Invalid Range'); + assertEqual(range('','').intersect(range('d','f')).toString(), 'Invalid Range'); + + // union + assertEqual(range('b','d').union(range('c','f')).toString(), 'b..f'); + assertEqual(range('b','d').union(range('f','c')).toString(), 'b..f'); + assertEqual(range('b','d').union(range('a','c')).toString(), 'a..d'); + assertEqual(range('b','d').union(range('c','a')).toString(), 'a..d'); + assertEqual(range('d','b').union(range('c','f')).toString(), 'b..f'); + assertEqual(range('d','b').union(range('f','c')).toString(), 'b..f'); + assertEqual(range('d','b').union(range('a','c')).toString(), 'a..d'); + assertEqual(range('d','b').union(range('c','a')).toString(), 'a..d'); + + assertEqual(range('a','c').union(range('','')).toString(), 'Invalid Range'); + assertEqual(range('','').union(range('a','c')).toString(), 'Invalid Range'); + + }); + +}); From a03de3cea8b6916c7537703897ccf13406a1dfb0 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 24 Dec 2018 17:50:37 +0900 Subject: [PATCH 020/191] Added RegExp.escape and removed flags related tests. --- CHANGELOG.md | 25 +++++++------ src/all.js | 1 + src/core/regexp.js | 12 +++++++ src/index.js | 3 +- src/regexp/all.js | 4 +++ src/regexp/escape/define.js | 3 ++ src/regexp/escape/index.js | 1 + src/regexp/index.js | 4 +++ src/util/escapeRegExp.js | 11 ++++++ test/OLD/tests/regexp.js | 71 ------------------------------------- test/index.html | 1 + test/index.js | 1 + test/tests/regexp.js | 19 ++++++++++ 13 files changed, 73 insertions(+), 83 deletions(-) create mode 100644 src/core/regexp.js create mode 100644 src/regexp/all.js create mode 100644 src/regexp/escape/define.js create mode 100644 src/regexp/escape/index.js create mode 100644 src/regexp/index.js create mode 100644 src/util/escapeRegExp.js create mode 100644 test/tests/regexp.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 616581b5e..c338c05db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,26 +2,29 @@ v3.0.0 ====== - Added defineAlias to core. -- Added Number aliases `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. -- Renamed `Number#chr` to `Number#toChar`. -- Renamed `Number#ordinalize` to `Number#toOrdinal`. -- Removed `Number#toNumber`. -- `Number#times` now collects all return values including undefined. -- `Number#times` now errors on any input that is not a positive finite integer. - Cannot instantiate chainable without new keyword anymore (ES6). - `Sugar()` alias is no longer supported. Use `Sugar.extend()` instead. - Removed `String#includes` with RegExp support. - Removed ability to extend Object.prototype - Removed support for bower. -- `Number#format` no longer supports thousands or decimal separtors. Use Intl for this. -- `String#padLeft` and `String#padRight` were removed in favor of native `String#padStart` and `String#padEnd`. +- Removed `String#padLeft` and `String#padRight` in favor of native `String#padStart` and `String#padEnd`. +- Added `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. +- Renamed `Number#chr` to `Number#toChar`. +- Renamed `Number#ordinalize` to `Number#toOrdinal`. +- Removed `Number#toNumber`. - Renamed `Number#hex` to `Number#toHex`. -- Removed `base` param of `Number#pad` in favor of `Number#toHex`. -- Removed trigonometric aliases sin, cos, etc in favor of native Math. -- Changed `Number#metric` placeholder token from `_` to `-`. +- Removed `Number#pad` `base` argument in favor of `Number#toHex`. - Removed `Number#cap` in favor of `Number#clamp` with one argument. +- Removed `Number#bytes` in favor of `Number#abbr`. +- Removed `Number#metric` in favor of `Number#abbr`. +- Changed `Number#metric` placeholder token from `_` to `-`. - Changed `Number#upto` to always iterate from min to max. - Changed `Number#downto` to always iterate from max to min. +- Changed `Number#times` to collects all return values including undefined. +- Changed `Number#times` to error on any input that is not a positive finite integer. +- Changed `Number#format` to no longer support thousands or decimal separtors. Use Intl for this. +- Removed `Number#sin`, `Number#cos`, etc in favor of native Math. +- Removed `RegExp#getFlags`, `RegExp#setFlags`, `RegExp#addFlags` and `RegExp#removeFlags`. TODO: diff --git a/src/all.js b/src/all.js index 550918a37..5b8569e3d 100644 --- a/src/all.js +++ b/src/all.js @@ -1,5 +1,6 @@ import './number/all'; import './string/all'; +import './regexp/all'; export * from './'; export { default } from './'; diff --git a/src/core/regexp.js b/src/core/regexp.js new file mode 100644 index 000000000..21ed5cff2 --- /dev/null +++ b/src/core/regexp.js @@ -0,0 +1,12 @@ +import Sugar, { createNamespace } from '../core'; + +createNamespace('RegExp'); + +export const { + defineStatic, + defineInstance, + defineStaticAlias, + defineInstanceAlias, +} = Sugar.RegExp; + +export default Sugar.RegExp; diff --git a/src/index.js b/src/index.js index a08fa8ee7..a08054694 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,8 @@ +export { default as Array } from './core/array'; export { default as String } from './core/string'; export { default as Number } from './core/number'; export { default as Object } from './core/object'; -export { default as Array } from './core/array'; +export { default as RegExp } from './core/regexp'; export * from './core'; export { default } from './core'; diff --git a/src/regexp/all.js b/src/regexp/all.js new file mode 100644 index 000000000..790ee64ff --- /dev/null +++ b/src/regexp/all.js @@ -0,0 +1,4 @@ +import './escape/define'; + +export * from '../core/regexp'; +export { default } from '../core/regexp'; diff --git a/src/regexp/escape/define.js b/src/regexp/escape/define.js new file mode 100644 index 000000000..c88ee6aa5 --- /dev/null +++ b/src/regexp/escape/define.js @@ -0,0 +1,3 @@ +import { defineStatic } from '../../core/regexp'; +import escape from './'; +defineStatic('escape', escape); diff --git a/src/regexp/escape/index.js b/src/regexp/escape/index.js new file mode 100644 index 000000000..07b0d112c --- /dev/null +++ b/src/regexp/escape/index.js @@ -0,0 +1 @@ +export { default } from '../../util/escapeRegExp'; diff --git a/src/regexp/index.js b/src/regexp/index.js new file mode 100644 index 000000000..9352a00cc --- /dev/null +++ b/src/regexp/index.js @@ -0,0 +1,4 @@ +export { default as escape } from './escape'; + +export * from '../core/regexp'; +export { default } from '../core/regexp'; diff --git a/src/util/escapeRegExp.js b/src/util/escapeRegExp.js new file mode 100644 index 000000000..860497a93 --- /dev/null +++ b/src/util/escapeRegExp.js @@ -0,0 +1,11 @@ +import { isString } from './typeChecks'; + +const ESCAPE_REG = /([\\/'*+?|()[\]{}.^$-])/g; + +export default function(str) { + if (!isString(str)) { + str = String(str); + } + return str.replace(ESCAPE_REG,'\\$1'); +} + diff --git a/test/OLD/tests/regexp.js b/test/OLD/tests/regexp.js index 1711a0973..bd4a6b80e 100644 --- a/test/OLD/tests/regexp.js +++ b/test/OLD/tests/regexp.js @@ -2,91 +2,20 @@ namespace('RegExp', function () { 'use strict'; method('escape', function() { - test(RegExp, ['test regexp'], 'test regexp', 'basic'); - test(RegExp, ['test reg|exp'], 'test reg\\|exp', 'pipe'); - test(RegExp, ['hey there (budday)'], 'hey there \\(budday\\)', 'parentheses'); - test(RegExp, ['what a day...'], 'what a day\\.\\.\\.', 'ellipsis'); - test(RegExp, ['.'], '\\.', 'single period'); - test(RegExp, ['*.+[]{}()?|/\\-'], '\\*\\.\\+\\[\\]\\{\\}\\(\\)\\?\\|\\/\\\\\\-', 'various tokens'); - test(RegExp, ['?'], '\\?', '?'); - test(RegExp, ['\?'], '\\?', 'one slash and ?'); - test(RegExp, ['\\?'], '\\\\\\?', 'two slashes and ?'); - test(RegExp, ['\\?'], '\\\\\\?', 'two slashes and ?'); - test(RegExp, ['-'], '\\-', 'dash'); - test(RegExp, [8], '8', 'non-string will be coerced to string'); }); method('setFlags', function() { - var r = /foobar/; - var n = run(r, 'setFlags', ['gim']); - - equal(n.global, true, 'global set'); - equal(n.ignoreCase, true, 'ignore set'); - equal(n.multiline, true, 'multiline set'); - - equal(r.global, false, 'global untouched'); - equal(r.ignoreCase, false, 'ignore untouched'); - equal(r.multiline, false, 'multiline untouched'); }); method('addFlags', function() { - var r = /foobar/; - var n = run(r, 'addFlags', ['g']); - - equal(n.global, true, 'global added'); - equal(n.ignoreCase, false, 'ignore not added'); - equal(n.multiline, false, 'multiline not added'); - - equal(r.global, false, 'original global untouched'); - equal(r.ignoreCase, false, 'original ignore untouched'); - equal(r.multiline, false, 'original multiline untouched'); - - var r = /foobar/; - var n = run(r, 'addFlags', ['gi']); - - equal(n.global, true, 'multiple | global added'); - equal(n.ignoreCase, true, 'multiple | ignore added'); - equal(n.multiline, false, 'multiple | multiline not added'); - - equal(run(run(/foobar/gim, 'addFlags', ['d']), 'getFlags').length, 3, 'unknown flag is ignored'); }); method('removeFlags', function() { - var r = /foobar/gim; - var n = run(r, 'removeFlags', ['g']); - - equal(n.global, false, 'global removed'); - equal(n.ignoreCase, true, 'ignore not removed'); - equal(n.multiline, true, 'multiline not removed'); - - equal(r.global, true, 'global untouched'); - equal(r.ignoreCase, true, 'ignore untouched'); - equal(r.multiline, true, 'multiline untouched'); - - var r = /foobar/gim; - var n = run(r, 'removeFlags', ['gi']); - - equal(n.global, false, 'multiple | global removed'); - equal(n.ignoreCase, false, 'multiple | ignore removed'); - equal(n.multiline, true, 'multiple | multiline not removed'); - }); method('getFlags', function() { - - function flagsEqual(reg, expected) { - var flags = run(reg); - var actualSorted = flags.split('').sort().join(''); - var expectedSorted = expected.split('').sort().join(''); - equal(actualSorted, expectedSorted, reg.source); - } - - flagsEqual(/foobar/gim, 'gim'); - flagsEqual(/foobar/im, 'im'); - flagsEqual(/foobar/i, 'i'); - flagsEqual(/foobar/, ''); }); }); diff --git a/test/index.html b/test/index.html index 836ef073a..7d2b54236 100644 --- a/test/index.html +++ b/test/index.html @@ -18,5 +18,6 @@ + diff --git a/test/index.js b/test/index.js index 59445714e..80cdb4ceb 100644 --- a/test/index.js +++ b/test/index.js @@ -18,6 +18,7 @@ import './helpers/intl'; import './tests/core'; import './tests/number'; import './tests/string'; +import './tests/regexp'; import './tests/extended'; import './tests/chainable'; import './tests/modules'; diff --git a/test/tests/regexp.js b/test/tests/regexp.js new file mode 100644 index 000000000..9c60a34ef --- /dev/null +++ b/test/tests/regexp.js @@ -0,0 +1,19 @@ +'use strict'; + +namespace('RegExp', function() { + + staticMethod('escape', function(escape) { + assertEqual(escape('foo'), 'foo'); + assertEqual(escape('f|oo'), 'f\\|oo'); + assertEqual(escape('f(oo)'), 'f\\(oo\\)'); + assertEqual(escape('...'), '\\.\\.\\.'); + assertEqual(escape('?'), '\\?'); + assertEqual(escape('\\?'), '\\\\\\?'); + assertEqual(escape('-'), '\\-'); + assertEqual(escape('*.+[]{}()?|/\\-'), '\\*\\.\\+\\[\\]\\{\\}\\(\\)\\?\\|\\/\\\\\\-'); + assertEqual(escape(8.1), '8\\.1'); + assertEqual(escape(null), 'null'); + assertEqual(escape(NaN), 'NaN'); + }); + +}); From 460412146f7d5b4fef4da0de5d5ce37f915e9a26 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 27 Dec 2018 01:42:20 +0900 Subject: [PATCH 021/191] Added Function#memoize. --- CHANGELOG.md | 1 + src/all.js | 1 + src/core/function.js | 12 ++ src/function/all.js | 4 + src/function/index.js | 4 + src/function/memoize/define.js | 4 + src/function/memoize/index.js | 15 +++ src/index.js | 1 + src/number/downto/index.js | 2 +- src/number/toOrdinal/index.js | 2 +- src/number/upto/index.js | 2 +- src/{ => number}/util/step.js | 13 ++- src/{ => number}/util/toOrdinal.js | 2 +- src/regexp/escape/index.js | 2 +- src/{ => regexp}/util/escapeRegExp.js | 3 +- src/util/Range.js | 2 +- test/helpers/assertions.js | 8 ++ test/helpers/suite.js | 18 ++- test/index.html | 2 + test/index.js | 6 +- test/tests/function.js | 33 ++++++ test/tests/number.js | 160 ++++++++++++-------------- 22 files changed, 186 insertions(+), 111 deletions(-) create mode 100644 src/core/function.js create mode 100644 src/function/all.js create mode 100644 src/function/index.js create mode 100644 src/function/memoize/define.js create mode 100644 src/function/memoize/index.js rename src/{ => number}/util/step.js (59%) rename src/{ => number}/util/toOrdinal.js (84%) rename src/{ => regexp}/util/escapeRegExp.js (77%) create mode 100644 test/helpers/assertions.js create mode 100644 test/tests/function.js diff --git a/CHANGELOG.md b/CHANGELOG.md index c338c05db..6e87d974a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ v3.0.0 - Changed `Number#format` to no longer support thousands or decimal separtors. Use Intl for this. - Removed `Number#sin`, `Number#cos`, etc in favor of native Math. - Removed `RegExp#getFlags`, `RegExp#setFlags`, `RegExp#addFlags` and `RegExp#removeFlags`. +- Removed `Function#memoize` ability to deeply serialize all arguments. TODO: diff --git a/src/all.js b/src/all.js index 5b8569e3d..1cd31161b 100644 --- a/src/all.js +++ b/src/all.js @@ -1,6 +1,7 @@ import './number/all'; import './string/all'; import './regexp/all'; +import './function/all'; export * from './'; export { default } from './'; diff --git a/src/core/function.js b/src/core/function.js new file mode 100644 index 000000000..a7089bcc9 --- /dev/null +++ b/src/core/function.js @@ -0,0 +1,12 @@ +import Sugar, { createNamespace } from '../core'; + +createNamespace('Function'); + +export const { + defineStatic, + defineInstance, + defineStaticAlias, + defineInstanceAlias, +} = Sugar.Function; + +export default Sugar.Function; diff --git a/src/function/all.js b/src/function/all.js new file mode 100644 index 000000000..c7a1bce3d --- /dev/null +++ b/src/function/all.js @@ -0,0 +1,4 @@ +import './memoize/define'; + +export * from '../core/function'; +export { default } from '../core/function'; diff --git a/src/function/index.js b/src/function/index.js new file mode 100644 index 000000000..95ef5d366 --- /dev/null +++ b/src/function/index.js @@ -0,0 +1,4 @@ +export { default as memoize } from './memoize'; + +export * from '../core/function'; +export { default } from '../core/function'; diff --git a/src/function/memoize/define.js b/src/function/memoize/define.js new file mode 100644 index 000000000..64bdcbdcb --- /dev/null +++ b/src/function/memoize/define.js @@ -0,0 +1,4 @@ +import { defineInstance } from '../../core/function'; +import memoize from './'; + +defineInstance('memoize', memoize); diff --git a/src/function/memoize/index.js b/src/function/memoize/index.js new file mode 100644 index 000000000..56ca635ac --- /dev/null +++ b/src/function/memoize/index.js @@ -0,0 +1,15 @@ +export default function(fn, hashFn) { + const cache = {}; + hashFn = hashFn || defaultHashFn; + return function memoized() { + const key = hashFn.apply(this, arguments); + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + return cache[key] = fn.apply(this, arguments); + }; +} + +function defaultHashFn(arg) { + return arg; +} diff --git a/src/index.js b/src/index.js index a08054694..3c924ecdc 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ export { default as String } from './core/string'; export { default as Number } from './core/number'; export { default as Object } from './core/object'; export { default as RegExp } from './core/regexp'; +export { default as Function } from './core/function'; export * from './core'; export { default } from './core'; diff --git a/src/number/downto/index.js b/src/number/downto/index.js index c08d9c905..3f2452fe0 100644 --- a/src/number/downto/index.js +++ b/src/number/downto/index.js @@ -1,4 +1,4 @@ -import step from '../../util/step'; +import step from '../util/step'; export default function(n1, n2, ...args) { if (n1 < n2) { diff --git a/src/number/toOrdinal/index.js b/src/number/toOrdinal/index.js index f679d9415..bc42520f4 100644 --- a/src/number/toOrdinal/index.js +++ b/src/number/toOrdinal/index.js @@ -1 +1 @@ -export { default } from '../../util/toOrdinal'; +export { default } from '../util/toOrdinal'; diff --git a/src/number/upto/index.js b/src/number/upto/index.js index 1392484f0..ad69f5055 100644 --- a/src/number/upto/index.js +++ b/src/number/upto/index.js @@ -1,4 +1,4 @@ -import step from '../../util/step'; +import step from '../util/step'; export default function(n1, n2, ...args) { if (n1 > n2) { diff --git a/src/util/step.js b/src/number/util/step.js similarity index 59% rename from src/util/step.js rename to src/number/util/step.js index 3af5f58ea..a90f99110 100644 --- a/src/util/step.js +++ b/src/number/util/step.js @@ -1,4 +1,5 @@ -import { assertFinite, assertPositiveNumber } from './assertions'; +import { assertFinite, assertPositiveNumber } from '../../util/assertions'; +import { isFunction } from '../../util/typeChecks'; export default function(n1, n2, ...args) { @@ -10,7 +11,7 @@ export default function(n1, n2, ...args) { assertFinite(step); assertPositiveNumber(step); - const inc = (step || 1) * (n1 < n2 ? 1 : -1); + const inc = step * (n1 < n2 ? 1 : -1); const len = Math.abs(n2 - n1); const result = []; @@ -23,10 +24,10 @@ export default function(n1, n2, ...args) { } export function collectArgs(args) { - if (args.length === 0) { - return [1]; + if (args.length === 2) { + return [args[0], args[1]]; } else if (args.length === 1) { - return [args[0]]; + return isFunction(args[0]) ? [1, args[0]] : [args[0]]; } - return [args[0], args[1]]; + return [1]; } diff --git a/src/util/toOrdinal.js b/src/number/util/toOrdinal.js similarity index 84% rename from src/util/toOrdinal.js rename to src/number/util/toOrdinal.js index 854ed39c8..77befc2d0 100644 --- a/src/util/toOrdinal.js +++ b/src/number/util/toOrdinal.js @@ -1,4 +1,4 @@ -import { assertInteger } from './assertions'; +import { assertInteger } from '../../util/assertions'; function getSuffix(n) { if (n >= 11 && n <= 13) { diff --git a/src/regexp/escape/index.js b/src/regexp/escape/index.js index 07b0d112c..b684a5210 100644 --- a/src/regexp/escape/index.js +++ b/src/regexp/escape/index.js @@ -1 +1 @@ -export { default } from '../../util/escapeRegExp'; +export { default } from '../util/escapeRegExp'; diff --git a/src/util/escapeRegExp.js b/src/regexp/util/escapeRegExp.js similarity index 77% rename from src/util/escapeRegExp.js rename to src/regexp/util/escapeRegExp.js index 860497a93..497b5124e 100644 --- a/src/util/escapeRegExp.js +++ b/src/regexp/util/escapeRegExp.js @@ -1,4 +1,4 @@ -import { isString } from './typeChecks'; +import { isString } from '../../util/typeChecks'; const ESCAPE_REG = /([\\/'*+?|()[\]{}.^$-])/g; @@ -8,4 +8,3 @@ export default function(str) { } return str.replace(ESCAPE_REG,'\\$1'); } - diff --git a/src/util/Range.js b/src/util/Range.js index 632646cc5..546e44c8c 100644 --- a/src/util/Range.js +++ b/src/util/Range.js @@ -1,4 +1,4 @@ -import step, { collectArgs } from './step'; +import step, { collectArgs } from '../number/util/step'; export default class Range { diff --git a/test/helpers/assertions.js b/test/helpers/assertions.js new file mode 100644 index 000000000..5f67bba08 --- /dev/null +++ b/test/helpers/assertions.js @@ -0,0 +1,8 @@ +assertFunctionIterated = function(fn, expected, exec) { + var count = 0; + exec(function() { + count++; + return fn.apply(this, arguments); + }); + assertEqual(count, expected); +}; diff --git a/test/helpers/suite.js b/test/helpers/suite.js index 574546067..072a7fb3a 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -3,17 +3,15 @@ var currentNamespace; - function assertStatic(methodName) { - assertUndefined(currentNamespace.prototype[methodName], { - message: '{methodName} should be a static method', - methodName: methodName + function assertStatic(methodName, testFn) { + testFn(methodName + ' should be a static method', function() { + assertUndefined(currentNamespace.prototype[methodName]); }); } - function assertInstance(methodName) { - assertInstanceOf(currentNamespace.prototype[methodName], Function, { - message: '{methodName} should be an instance method', - methodName: methodName + function assertInstance(methodName, testFn) { + testFn(methodName + ' should be an instance method', function() { + assertInstanceOf(currentNamespace.prototype[methodName], Function); }); } @@ -31,10 +29,10 @@ }; } - function withTest(typeFn, testFn) { + function withTest(assertFn, testFn) { return function(methodName, test) { + assertFn(methodName, testFn); testFn(methodName, function() { - typeFn(methodName, currentNamespace.prototype[methodName]); test(currentNamespace[methodName]); }); }; diff --git a/test/index.html b/test/index.html index 7d2b54236..9dc3fa0b8 100644 --- a/test/index.html +++ b/test/index.html @@ -9,6 +9,7 @@ + @@ -19,5 +20,6 @@ + diff --git a/test/index.js b/test/index.js index 80cdb4ceb..708e63713 100644 --- a/test/index.js +++ b/test/index.js @@ -9,6 +9,7 @@ import Sugar from '../src/all'; global.Sugar = Sugar; // Helpers +import './helpers/assertions'; import './helpers/namespace'; import './helpers/methods'; import './helpers/suite'; @@ -16,9 +17,10 @@ import './helpers/intl'; // Tests import './tests/core'; +import './tests/chainable'; +import './tests/extended'; import './tests/number'; import './tests/string'; import './tests/regexp'; -import './tests/extended'; -import './tests/chainable'; +import './tests/function'; import './tests/modules'; diff --git a/test/tests/function.js b/test/tests/function.js new file mode 100644 index 000000000..fbbcd4923 --- /dev/null +++ b/test/tests/function.js @@ -0,0 +1,33 @@ +'use strict'; + +namespace('Function', function() { + + function assertMemoized(memoize, hashFn, runCount, expected) { + assertFunctionIterated(noop, expected, function(fn) { + fn = memoize(fn, hashFn); + for (let i = 0; i < runCount; i++) { + fn(i); + } + }); + } + + instanceMethod('memoize', function(memoize) { + assertMemoized(memoize, null, 10, 10); + assertMemoized(memoize, noop, 10, 1); + + assertMemoized(memoize, function(i) { + return i % 2 === 0; + }, 10, 2); + + // Memoized function receives same args and context. + memoize(function(a, b, c) { + assertArrayEqual([this, a, b, c], [1,2,3,4]); + }).call(1,2,3,4); + + // Hash function receives same args and context. + memoize(noop, function(a, b, c) { + assertArrayEqual([this, a, b, c], [1,2,3,4]); + }).call(1,2,3,4); + }); + +}); diff --git a/test/tests/number.js b/test/tests/number.js index df16bd729..eac94564e 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -653,93 +653,83 @@ namespace('Number', function() { }); - describe('step', function() { + instanceMethod('upto', function(upto) { + + assertArrayEqual(upto(0, 0), [0]); + assertArrayEqual(upto(0, 1), [0,1]); + assertArrayEqual(upto(0, 5), [0,1,2,3,4,5]); + assertArrayEqual(upto(2,-2), [-2,-1,0,1,2]); + assertArrayEqual(upto(-2, 2), [-2,-1,0,1,2]); + + assertArrayEqual(upto(-0.5, 0.5), [-0.5,0.5]); + assertArrayEqual(upto(-0.5, 0.6), [-0.5,0.5]); + assertArrayEqual(upto(-0.5, 0.4), [-0.5]); + + // With collecting callback. + assertArrayEqual(upto(0, 1, 1, noop), [undefined, undefined]); + assertArrayEqual(upto(-1, 1, 1, args), [[-1,0],[0,1],[1,2]]); + assertArrayEqual(upto(1, -1, 1, args), [[-1,0],[0,1],[1,2]]); + + // With step + assertArrayEqual(upto(0, 6, 10), [0]); + assertArrayEqual(upto(0, 6, 2), [0,2,4,6]); + assertArrayEqual(upto(0, 2, 0.5), [0,0.5,1,1.5,2]); + + // Invalid input + assertError(function() { upto(null, 1); }); + assertError(function() { upto(1, null); }); + assertError(function() { upto(NaN, 1); }); + assertError(function() { upto(1, NaN); }); + assertError(function() { upto(-Infinity, 0); }); + assertError(function() { upto(0, Infinity); }); + + // Invalid step + assertError(function() { upto(1, 4, 0); }); + assertError(function() { upto(1, 4, 0, noop); }); + assertError(function() { upto(1, 4, -2); }); + assertError(function() { upto(1, 4, Infinity); }); + assertError(function() { upto(1, 4, NaN); }); - function assertPasses(fn, from, to, eCount, eResult) { - var count = 0; - var result = fn(from, to, 1, function(n) { - count++; - return n; - }); - assertEqual(count, eCount); - assertArrayEqual(result, eResult); - } - - instanceMethod('upto', function(upto) { - - assertPasses(upto, 0, 0, 1, [0]); - assertPasses(upto, 0, 1, 2, [0,1]); - assertPasses(upto, 0, 5, 6, [0,1,2,3,4,5]); - assertPasses(upto, 2,-2, 5, [-2,-1,0,1,2]); - assertPasses(upto,-2, 2, 5, [-2,-1,0,1,2]); - - assertPasses(upto, -.5, .5, 2, [-.5,.5]); - assertPasses(upto, -.5, .6, 2, [-.5,.5]); - assertPasses(upto, -.5, .4, 1, [-.5]); - - assertArrayEqual(upto(0, 5), [0,1,2,3,4,5]); - assertArrayEqual(upto(0, 1, 1, noop), [undefined, undefined]); - - assertArrayEqual(upto(0, 6, 10), [0]); - assertArrayEqual(upto(0, 6, 2), [0,2,4,6]); - assertArrayEqual(upto(0, 2, .5), [0,0.5,1,1.5,2]); - - // Callback arguments - assertArrayEqual(upto(-1, 1, 1, args), [[-1,0],[0,1],[1,2]]); - - // Invalid input - assertError(function() { upto(null, 1); }); - assertError(function() { upto(1, null); }); - assertError(function() { upto(NaN, 1); }); - assertError(function() { upto(1, NaN); }); - assertError(function() { upto(-Infinity, 0); }); - assertError(function() { upto(0, Infinity); }); - - // Invalid step - assertError(function() { upto(1, 4, 0); }); - assertError(function() { upto(1, 4, -2); }); - assertError(function() { upto(1, 4, Infinity); }); - assertError(function() { upto(1, 4, NaN); }); - - }); - - instanceMethod('downto', function(downto) { - - assertPasses(downto, 0, 0, 1, [0]); - assertPasses(downto, 1, 0, 2, [1,0]); - assertPasses(downto, 5, 0, 6, [5,4,3,2,1,0]); - assertPasses(downto, 2,-2, 5, [2,1,0,-1,-2]); - assertPasses(downto,-2, 2, 5, [2,1,0,-1,-2]); - - assertPasses(downto, .5, -.5, 2, [.5,-.5]); - assertPasses(downto, .5, -.6, 2, [.5,-.5]); - assertPasses(downto, .5, -.4, 1, [.5]); - - assertArrayEqual(downto(5, 0), [5,4,3,2,1,0]); - assertArrayEqual(downto(0, 1, 1, noop), [undefined, undefined]); - - assertArrayEqual(downto(0, 6, 10), [6]); - assertArrayEqual(downto(5, 0, 2), [5,3,1]); - assertArrayEqual(downto(2, 0, .5), [2,1.5,1,0.5,0]); - - // Callback arguments - assertArrayEqual(downto(1,-1,1,args), [[1,0],[0,1],[-1,2]]); - - // Invalid input - assertError(function() { downto(null, 1); }); - assertError(function() { downto(1, null); }); - assertError(function() { downto(NaN, 1); }); - assertError(function() { downto(1, NaN); }); - assertError(function() { downto(-Infinity, 0); }); - assertError(function() { downto(0, Infinity); }); - - // Invalid step - assertError(function() { downto(1, 4, 0); }); - assertError(function() { downto(1, 4, -2); }); - assertError(function() { downto(1, 4, Infinity); }); - assertError(function() { downto(1, 4, NaN); }); + }); - }); + instanceMethod('downto', function(downto) { + + assertArrayEqual(downto(0, 0), [0]); + assertArrayEqual(downto(1, 0), [1,0]); + assertArrayEqual(downto(5, 0), [5,4,3,2,1,0]); + assertArrayEqual(downto(2, -2), [2,1,0,-1,-2]); + assertArrayEqual(downto(-2, 2), [2,1,0,-1,-2]); + + assertArrayEqual(downto(0.5, -0.5), [0.5,-0.5]); + assertArrayEqual(downto(0.5, -0.6), [0.5,-0.5]); + assertArrayEqual(downto(0.5, -0.4), [0.5]); + + // With collecting callback. + assertArrayEqual(downto(0, 1, 1, noop), [undefined, undefined]); + assertArrayEqual(downto(1, -1, 1, args), [[1,0],[0,1],[-1,2]]); + assertArrayEqual(downto(-1, 1, 1, args), [[1,0],[0,1],[-1,2]]); + + assertArrayEqual(downto(0, 6, 10), [6]); + assertArrayEqual(downto(5, 0, 2), [5,3,1]); + assertArrayEqual(downto(2, 0, 0.5), [2,1.5,1,0.5,0]); + + // Callback arguments + assertArrayEqual(downto(1,-1,1,args), [[1,0],[0,1],[-1,2]]); + + // Invalid input + assertError(function() { downto(null, 1); }); + assertError(function() { downto(1, null); }); + assertError(function() { downto(NaN, 1); }); + assertError(function() { downto(1, NaN); }); + assertError(function() { downto(-Infinity, 0); }); + assertError(function() { downto(0, Infinity); }); + + // Invalid step + assertError(function() { downto(1, 4, 0); }); + assertError(function() { downto(1, 4, 0, noop); }); + assertError(function() { downto(1, 4, -2); }); + assertError(function() { downto(1, 4, Infinity); }); + assertError(function() { downto(1, 4, NaN); }); }); From 30536d19350a951b5ec9289653c3b8860c0ad1a6 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 6 Oct 2019 08:49:52 +0900 Subject: [PATCH 022/191] Refactored suite and added Function#debounce --- src/function/all.js | 1 + src/function/debounce/define.js | 4 + src/function/debounce/index.js | 18 + src/function/index.js | 1 + test/helpers/assertions.js | 8 - test/helpers/suite.js | 56 +- test/helpers/{methods.js => util.js} | 0 test/index.html | 7 +- test/index.js | 6 +- test/tests/function.js | 79 +- test/tests/number.js | 1405 ++++++++++++++------------ test/tests/regexp.js | 28 +- test/tests/string.js | 178 ++-- 13 files changed, 1014 insertions(+), 777 deletions(-) create mode 100644 src/function/debounce/define.js create mode 100644 src/function/debounce/index.js delete mode 100644 test/helpers/assertions.js rename test/helpers/{methods.js => util.js} (100%) diff --git a/src/function/all.js b/src/function/all.js index c7a1bce3d..0f9d0609e 100644 --- a/src/function/all.js +++ b/src/function/all.js @@ -1,4 +1,5 @@ import './memoize/define'; +import './debounce/define'; export * from '../core/function'; export { default } from '../core/function'; diff --git a/src/function/debounce/define.js b/src/function/debounce/define.js new file mode 100644 index 000000000..f41bd4b3e --- /dev/null +++ b/src/function/debounce/define.js @@ -0,0 +1,4 @@ +import { defineInstance } from '../../core/function'; +import debounce from './'; + +defineInstance('debounce', debounce); diff --git a/src/function/debounce/index.js b/src/function/debounce/index.js new file mode 100644 index 000000000..4d5384aa6 --- /dev/null +++ b/src/function/debounce/index.js @@ -0,0 +1,18 @@ +export default function(fn, ms = 0) { + let timer = null; + let result = null; + const debounced = () => { + const args = arguments; + debounced.cancel(); + timer = setTimeout(() => { + result = fn.apply(this, args); + }, ms); + return result; + }; + + debounced.cancel = () => { + clearTimeout(timer); + }; + + return debounced; +} diff --git a/src/function/index.js b/src/function/index.js index 95ef5d366..2f7c50686 100644 --- a/src/function/index.js +++ b/src/function/index.js @@ -1,4 +1,5 @@ export { default as memoize } from './memoize'; +export { default as debounce } from './debounce'; export * from '../core/function'; export { default } from '../core/function'; diff --git a/test/helpers/assertions.js b/test/helpers/assertions.js deleted file mode 100644 index 5f67bba08..000000000 --- a/test/helpers/assertions.js +++ /dev/null @@ -1,8 +0,0 @@ -assertFunctionIterated = function(fn, expected, exec) { - var count = 0; - exec(function() { - count++; - return fn.apply(this, arguments); - }); - assertEqual(count, expected); -}; diff --git a/test/helpers/suite.js b/test/helpers/suite.js index 072a7fb3a..a41f9cd73 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -3,51 +3,49 @@ var currentNamespace; - function assertStatic(methodName, testFn) { - testFn(methodName + ' should be a static method', function() { - assertUndefined(currentNamespace.prototype[methodName]); + function staticTest(protoFn) { + it('should be a static method', function() { + assertUndefined(protoFn); }); } - function assertInstance(methodName, testFn) { - testFn(methodName + ' should be an instance method', function() { - assertInstanceOf(currentNamespace.prototype[methodName], Function); + function instanceTest(protoFn) { + it('should be an instance method', function() { + assertInstanceOf(protoFn, Function); }); } - function withSuite(describeFn) { - return function(name, suite) { - describeFn(name, function() { - beforeAll(function() { - currentNamespace = Sugar[name]; - }); - afterAll(function() { - currentNamespace = null; - }); + function withNamespace(describeFn) { + return function(namespace, suite) { + describeFn(namespace, function() { + currentNamespace = Sugar[namespace]; suite(); + currentNamespace = null; }); }; } - function withTest(assertFn, testFn) { - return function(methodName, test) { - assertFn(methodName, testFn); - testFn(methodName, function() { - test(currentNamespace[methodName]); + function withMethod(typeTest, suiteFn) { + return function(methodName, suite) { + var method = currentNamespace[methodName]; + var protoFn = currentNamespace.prototype[methodName]; + suiteFn(methodName, function() { + typeTest(protoFn); + suite(method); }); }; } - namespace = withSuite(describe); - fnamespace = withSuite(fdescribe); - xnamespace = withSuite(xdescribe); + namespace = withNamespace(describe); + fnamespace = withNamespace(fdescribe); + xnamespace = withNamespace(xdescribe); - staticMethod = withTest(assertStatic, it); - fstaticMethod = withTest(assertStatic, fit); - xstaticMethod = withTest(assertStatic, xit); + describeStatic = withMethod(staticTest, describe); + fdescribeStatic = withMethod(staticTest, fdescribe); + xdescribeStatic = withMethod(staticTest, xdescribe); - instanceMethod = withTest(assertInstance, it); - finstanceMethod = withTest(assertInstance, fit); - xinstanceMethod = withTest(assertInstance, xit); + describeInstance = withMethod(instanceTest, describe); + fdescribeInstance = withMethod(instanceTest, fdescribe); + xdescribeInstance = withMethod(instanceTest, xdescribe); })(); diff --git a/test/helpers/methods.js b/test/helpers/util.js similarity index 100% rename from test/helpers/methods.js rename to test/helpers/util.js diff --git a/test/index.html b/test/index.html index 9dc3fa0b8..4817bf90e 100644 --- a/test/index.html +++ b/test/index.html @@ -8,11 +8,14 @@ + + - - + diff --git a/test/index.js b/test/index.js index 708e63713..40b8375b9 100644 --- a/test/index.js +++ b/test/index.js @@ -1,4 +1,7 @@ import Sugar from '../src/all'; +import Sinon from 'sinon'; + +global.clock = Sinon.useFakeTimers(); // TODO: test browserify // TODO: test broccoli @@ -9,10 +12,9 @@ import Sugar from '../src/all'; global.Sugar = Sugar; // Helpers -import './helpers/assertions'; import './helpers/namespace'; -import './helpers/methods'; import './helpers/suite'; +import './helpers/util'; import './helpers/intl'; // Tests diff --git a/test/tests/function.js b/test/tests/function.js index fbbcd4923..035efad8a 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -2,32 +2,69 @@ namespace('Function', function() { - function assertMemoized(memoize, hashFn, runCount, expected) { - assertFunctionIterated(noop, expected, function(fn) { - fn = memoize(fn, hashFn); - for (let i = 0; i < runCount; i++) { - fn(i); - } - }); + function createCounter() { + let n = 0; + return function() { + return ++n; + } + } + + function assertMemoized(memoizeFn, hashFn, runCount, expected) { + const fn = memoizeFn(createCounter(), hashFn); + let result = null; + for (let i = 0; i < runCount; i++) { + result = fn(i); + } + assertEqual(result, expected); } - instanceMethod('memoize', function(memoize) { - assertMemoized(memoize, null, 10, 10); - assertMemoized(memoize, noop, 10, 1); + describeInstance('memoize', function(memoize) { + + it('should perform basic caching', () => { + assertMemoized(memoize, null, 10, 10); + assertMemoized(memoize, noop, 10, 1); + assertMemoized(memoize, function(i) { + return i % 2 === 0; + }, 10, 2); - assertMemoized(memoize, function(i) { - return i % 2 === 0; - }, 10, 2); + }); + + it('should receive same args and context', () => { + memoize(function(a, b, c) { + assertArrayEqual([this, a, b, c], [1,2,3,4]); + }).call(1,2,3,4); + }); - // Memoized function receives same args and context. - memoize(function(a, b, c) { - assertArrayEqual([this, a, b, c], [1,2,3,4]); - }).call(1,2,3,4); + it('should pass same args and context to the hash function', () => { + memoize(noop, function(a, b, c) { + assertArrayEqual([this, a, b, c], [1,2,3,4]); + }).call(1,2,3,4); + }); + + }); + + describeInstance('debounce', function(debounce) { + + it('should perform basic debounce', () => { + const fn = debounce(createCounter(), 200); + assertEqual(fn(), null); + assertEqual(fn(), null); + clock.tick(100); + assertEqual(fn(), null); + clock.tick(200); + assertEqual(fn(), 1); + clock.tick(400); + assertEqual(fn(), 2); + }); + + it('should be able to cancel', () => { + const fn = debounce(createCounter(), 200); + clock.tick(100); + fn.cancel(); + clock.tick(200); + assertEqual(fn(), null); + }); - // Hash function receives same args and context. - memoize(noop, function(a, b, c) { - assertArrayEqual([this, a, b, c], [1,2,3,4]); - }).call(1,2,3,4); }); }); diff --git a/test/tests/number.js b/test/tests/number.js index eac94564e..313778dd7 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -1,358 +1,456 @@ 'use strict'; -namespace('Number', function() { - - staticMethod('random', function(random) { - assertOneOf(random(), [0,1]); - assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); - assertOneOf(random(25, 30), [25,26,27,28,29,30]); - assertOneOf(random(30, 25), [25,26,27,28,29,30]); - assertOneOf(random(-5, -2), [-5,-4,-3,-2]); - assertOneOf(random(0, 0), [0]); +fnamespace('Number', function() { + + describeStatic('random', function(random) { + + it('should generate random numbers', function() { + assertOneOf(random(), [0,1]); + assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); + assertOneOf(random(25, 30), [25,26,27,28,29,30]); + assertOneOf(random(30, 25), [25,26,27,28,29,30]); + assertOneOf(random(-5, -2), [-5,-4,-3,-2]); + assertOneOf(random(0, 0), [0]); + }); + }); - staticMethod('round', function(round) { - assertEqual(round(3), 3); - assertEqual(round(3.241), 3); - assertEqual(round(3.752), 4); - assertEqual(round(-3.241), -3); - assertEqual(round(-3.752), -4); - assertEqual(round(3.241, 1), 3.2); - assertEqual(round(3.752, 1), 3.8); - assertEqual(round(3.241, 2), 3.24); - assertEqual(round(3.752, 2), 3.75); - assertEqual(round(322855.241, -2), 322900); - assertEqual(round(322855.241, -3), 323000); - assertEqual(round(322855.241, -4), 320000); - assertEqual(round(322855.241, -6), 0); - assertEqual(round(722855.241, -6), 1000000); - assertEqual(round(722855.241, -8), 0); - assertEqual(round(1e-21, 1), 0); - assertEqual(round(1e-21, -1), 0); + describeStatic('round', function(round) { + + it('should round numbers', function() { + assertEqual(round(3), 3); + assertEqual(round(3.241), 3); + assertEqual(round(3.752), 4); + assertEqual(round(-3.241), -3); + assertEqual(round(-3.752), -4); + assertEqual(round(3.241, 1), 3.2); + assertEqual(round(3.752, 1), 3.8); + assertEqual(round(3.241, 2), 3.24); + assertEqual(round(3.752, 2), 3.75); + assertEqual(round(322855.241, -2), 322900); + assertEqual(round(322855.241, -3), 323000); + assertEqual(round(322855.241, -4), 320000); + assertEqual(round(322855.241, -6), 0); + assertEqual(round(722855.241, -6), 1000000); + assertEqual(round(722855.241, -8), 0); + assertEqual(round(1e-21, 1), 0); + assertEqual(round(1e-21, -1), 0); + }); + }); - staticMethod('range', function(range) { - - // toString - assertEqual(range(1, 5).toString(), '1..5'); - assertEqual(range(1, NaN).toString(), 'Invalid Range'); - - // isValid - assertTrue(range(1, 5).isValid()); - assertTrue(range(5, 1).isValid()); - assertTrue(range(0, 0).isValid()); - assertFalse(range(5, NaN).isValid()); - assertFalse(range(NaN, 5).isValid()); - assertFalse(range(5, Infinity).isValid()); - assertFalse(range(Infinity, 5).isValid()); - - // span - assertEqual(range(1, 5).span(), 5); - assertEqual(range(5, 1).span(), 5); - assertNaN(range(NaN, NaN).span()); - - // toArray - assertArrayEqual(range(1, 5).toArray(), [1,2,3,4,5]); - assertArrayEqual(range(5, 1).toArray(), [5,4,3,2,1]); - assertArrayEqual(range(-2, 2).toArray(), [-2,-1,0,1,2]); - assertArrayEqual(range(2, -2).toArray(), [2,1,0,-1,-2]); - assertArrayEqual(range(NaN, NaN).toArray(), []); - - // clone - assertEqual(range(1, 5).clone().toString(), '1..5'); - - // clamp - assertEqual(range(1, 5).clamp(8), 5); - assertEqual(range(1, 5).clamp(0), 1); - assertEqual(range(5, 1).clamp(8), 5); - assertEqual(range(5, 1).clamp(0), 1); - - // contains - assertTrue(range(1, 5).contains(range(1, 3))); - assertTrue(range(1, 5).contains(range(1, 1))); - assertTrue(range(1, 5).contains(range(5, 5))); - assertTrue(range(1, 5).contains(range(5, 4))); - assertFalse(range(1, 5).contains(range(6, 8))); - assertFalse(range(1, 5).contains(range(0, 1))); - assertFalse(range(1, 5).contains(range(0, 2))); - assertFalse(range(1, 5).contains(range(2, 0))); - assertFalse(range(1, 5).contains(range(4, 6))); - assertFalse(range(1, 5).contains(range(6, 4))); - assertFalse(range(1, 5).contains(range(0, 6))); - - // every - assertArrayEqual(range(1, 5).every(1), [1,2,3,4,5]); - assertArrayEqual(range(1, 5).every(2), [1,3,5]); - assertArrayEqual(range(1, 5).every(2, square), [1,9,25]); - assertArrayEqual(range(1, 2).every(1, args), [[1,0], [2,1]]); - - // intersect - assertEqual(range(1,10).intersect(range(5,15)).toString(), '5..10'); - assertEqual(range(1,10).intersect(range(15,5)).toString(), '5..10'); - assertEqual(range(1,10).intersect(range(0,3)).toString(), '1..3'); - assertEqual(range(1,10).intersect(range(3,0)).toString(), '1..3'); - assertEqual(range(10,1).intersect(range(5,15)).toString(), '5..10'); - assertEqual(range(10,1).intersect(range(15,5)).toString(), '5..10'); - assertEqual(range(10,1).intersect(range(0,3)).toString(), '1..3'); - assertEqual(range(10,1).intersect(range(3,0)).toString(), '1..3'); - - assertEqual(range(0,5).intersect(range(8,10)).toString(), 'Invalid Range'); - assertEqual(range(0,5).intersect(range(NaN,NaN)).toString(), 'Invalid Range'); - assertEqual(range(NaN,NaN).intersect(range(8,10)).toString(), 'Invalid Range'); - - // union - assertEqual(range(1,10).union(range(5,15)).toString(), '1..15'); - assertEqual(range(1,10).union(range(15,5)).toString(), '1..15'); - assertEqual(range(1,10).union(range(0,3)).toString(), '0..10'); - assertEqual(range(1,10).union(range(3,0)).toString(), '0..10'); - assertEqual(range(10,1).union(range(5,15)).toString(), '1..15'); - assertEqual(range(10,1).union(range(15,5)).toString(), '1..15'); - assertEqual(range(10,1).union(range(0,3)).toString(), '0..10'); - assertEqual(range(10,1).union(range(3,0)).toString(), '0..10'); - - assertEqual(range(0,5).union(range(NaN,NaN)).toString(), 'Invalid Range'); - assertEqual(range(NaN,NaN).union(range(8,10)).toString(), 'Invalid Range'); + describeStatic('range', function(range) { + + it('#toString', function() { + assertEqual(range(1, 5).toString(), '1..5'); + assertEqual(range(1, NaN).toString(), 'Invalid Range'); + }); + + it('#isValid', function() { + assertTrue(range(1, 5).isValid()); + assertTrue(range(5, 1).isValid()); + assertTrue(range(0, 0).isValid()); + assertFalse(range(5, NaN).isValid()); + assertFalse(range(NaN, 5).isValid()); + assertFalse(range(5, Infinity).isValid()); + assertFalse(range(Infinity, 5).isValid()); + }); + + it('#span', function() { + assertEqual(range(1, 5).span(), 5); + assertEqual(range(5, 1).span(), 5); + assertNaN(range(NaN, NaN).span()); + }); + + it('#toArray', function() { + assertArrayEqual(range(1, 5).toArray(), [1,2,3,4,5]); + assertArrayEqual(range(5, 1).toArray(), [5,4,3,2,1]); + assertArrayEqual(range(-2, 2).toArray(), [-2,-1,0,1,2]); + assertArrayEqual(range(2, -2).toArray(), [2,1,0,-1,-2]); + assertArrayEqual(range(NaN, NaN).toArray(), []); + }); + + it('#clone', function() { + assertEqual(range(1, 5).clone().toString(), '1..5'); + }); + + it('#clamp', function() { + assertEqual(range(1, 5).clamp(8), 5); + assertEqual(range(1, 5).clamp(0), 1); + assertEqual(range(5, 1).clamp(8), 5); + assertEqual(range(5, 1).clamp(0), 1); + }); + + it('#contains', function() { + assertTrue(range(1, 5).contains(range(1, 3))); + assertTrue(range(1, 5).contains(range(1, 1))); + assertTrue(range(1, 5).contains(range(5, 5))); + assertTrue(range(1, 5).contains(range(5, 4))); + assertFalse(range(1, 5).contains(range(6, 8))); + assertFalse(range(1, 5).contains(range(0, 1))); + assertFalse(range(1, 5).contains(range(0, 2))); + assertFalse(range(1, 5).contains(range(2, 0))); + assertFalse(range(1, 5).contains(range(4, 6))); + assertFalse(range(1, 5).contains(range(6, 4))); + assertFalse(range(1, 5).contains(range(0, 6))); + }); + + it('#every', function() { + assertArrayEqual(range(1, 5).every(1), [1,2,3,4,5]); + assertArrayEqual(range(1, 5).every(2), [1,3,5]); + assertArrayEqual(range(1, 5).every(2, square), [1,9,25]); + assertArrayEqual(range(1, 2).every(1, args), [[1,0], [2,1]]); + }); + + it('#intersect', function() { + assertEqual(range(1,10).intersect(range(5,15)).toString(), '5..10'); + assertEqual(range(1,10).intersect(range(15,5)).toString(), '5..10'); + assertEqual(range(1,10).intersect(range(0,3)).toString(), '1..3'); + assertEqual(range(1,10).intersect(range(3,0)).toString(), '1..3'); + assertEqual(range(10,1).intersect(range(5,15)).toString(), '5..10'); + assertEqual(range(10,1).intersect(range(15,5)).toString(), '5..10'); + assertEqual(range(10,1).intersect(range(0,3)).toString(), '1..3'); + assertEqual(range(10,1).intersect(range(3,0)).toString(), '1..3'); + + assertEqual(range(0,5).intersect(range(8,10)).toString(), 'Invalid Range'); + assertEqual(range(0,5).intersect(range(NaN,NaN)).toString(), 'Invalid Range'); + assertEqual(range(NaN,NaN).intersect(range(8,10)).toString(), 'Invalid Range'); + }); + + it('#union', function() { + assertEqual(range(1,10).union(range(5,15)).toString(), '1..15'); + assertEqual(range(1,10).union(range(15,5)).toString(), '1..15'); + assertEqual(range(1,10).union(range(0,3)).toString(), '0..10'); + assertEqual(range(1,10).union(range(3,0)).toString(), '0..10'); + assertEqual(range(10,1).union(range(5,15)).toString(), '1..15'); + assertEqual(range(10,1).union(range(15,5)).toString(), '1..15'); + assertEqual(range(10,1).union(range(0,3)).toString(), '0..10'); + assertEqual(range(10,1).union(range(3,0)).toString(), '0..10'); + + assertEqual(range(0,5).union(range(NaN,NaN)).toString(), 'Invalid Range'); + assertEqual(range(NaN,NaN).union(range(8,10)).toString(), 'Invalid Range'); + }); }); - instanceMethod('ceil', function(ceil) { - assertEqual(ceil(5.5), 6); - assertEqual(ceil(5.14), 6); - assertEqual(ceil(5), 5); - assertEqual(ceil(-5.5), -5); - assertEqual(ceil(-5.14), -5); - assertEqual(ceil(-5), -5); - assertEqual(ceil(4417.1318, 0), 4418); - assertEqual(ceil(4417.1318, 1), 4417.2); - assertEqual(ceil(4417.1318, 2), 4417.14); - assertEqual(ceil(4417.1318, 3), 4417.132); - assertEqual(ceil(4417.1318, -1), 4420); - assertEqual(ceil(4417.1318, -2), 4500); - assertEqual(ceil(4417.1318, -3), 5000); + describeInstance('ceil', function(ceil) { + + it('should round up', function() { + assertEqual(ceil(5.5), 6); + assertEqual(ceil(5.14), 6); + assertEqual(ceil(5), 5); + assertEqual(ceil(-5.5), -5); + assertEqual(ceil(-5.14), -5); + assertEqual(ceil(-5), -5); + assertEqual(ceil(4417.1318, 0), 4418); + assertEqual(ceil(4417.1318, 1), 4417.2); + assertEqual(ceil(4417.1318, 2), 4417.14); + assertEqual(ceil(4417.1318, 3), 4417.132); + assertEqual(ceil(4417.1318, -1), 4420); + assertEqual(ceil(4417.1318, -2), 4500); + assertEqual(ceil(4417.1318, -3), 5000); + }); + }); - instanceMethod('floor', function(floor) { - assertEqual(floor(5.5), 5); - assertEqual(floor(5.14), 5); - assertEqual(floor(5.9), 5); - assertEqual(floor(5), 5); - assertEqual(floor(-5.5), -6); - assertEqual(floor(-5.14), -6); - assertEqual(floor(-5), -5); - assertEqual(floor(4417.1318, [0]), 4417); - assertEqual(floor(4417.1318, [1]), 4417.1); - assertEqual(floor(4417.1318, [2]), 4417.13); - assertEqual(floor(4417.1318, [3]), 4417.131); - assertEqual(floor(4417.1318, [-1]), 4410); - assertEqual(floor(4417.1318, [-2]), 4400); - assertEqual(floor(4417.1318, [-3]), 4000); + describeInstance('floor', function(floor) { + + it('should round down', function() { + assertEqual(floor(5.5), 5); + assertEqual(floor(5.14), 5); + assertEqual(floor(5.9), 5); + assertEqual(floor(5), 5); + assertEqual(floor(-5.5), -6); + assertEqual(floor(-5.14), -6); + assertEqual(floor(-5), -5); + assertEqual(floor(4417.1318, [0]), 4417); + assertEqual(floor(4417.1318, [1]), 4417.1); + assertEqual(floor(4417.1318, [2]), 4417.13); + assertEqual(floor(4417.1318, [3]), 4417.131); + assertEqual(floor(4417.1318, [-1]), 4410); + assertEqual(floor(4417.1318, [-2]), 4400); + assertEqual(floor(4417.1318, [-3]), 4000); + }); + }); - instanceMethod('trunc', function(trunc) { - assertEqual(trunc(5), 5); - assertEqual(trunc(5.25), 5); - assertEqual(trunc(NaN), NaN); - assertEqual(trunc(Infinity), Infinity); - assertEqual(trunc(5.25, 1), 5.2); - assertEqual(trunc(5.25, 2), 5.25); - assertEqual(trunc(-5.25, 1), -5.2); - assertEqual(trunc(-5.25, 2), -5.25); + describeInstance('trunc', function(trunc) { + + it('should truncate numbers', function() { + assertEqual(trunc(5), 5); + assertEqual(trunc(5.25), 5); + assertEqual(trunc(NaN), NaN); + assertEqual(trunc(Infinity), Infinity); + assertEqual(trunc(5.25, 1), 5.2); + assertEqual(trunc(5.25, 2), 5.25); + assertEqual(trunc(-5.25, 1), -5.2); + assertEqual(trunc(-5.25, 2), -5.25); + }); + }); - instanceMethod('abs', function(abs) { - assertEqual(abs(-5), 5); - assertEqual(abs(5), 5); - assertEqual(abs(-3.324), 3.324); - assertEqual(abs(3.324), 3.324); + describeInstance('abs', function(abs) { + + it('should get absolute value', function() { + assertEqual(abs(-5), 5); + assertEqual(abs(5), 5); + assertEqual(abs(-3.324), 3.324); + assertEqual(abs(3.324), 3.324); + }); + }); - instanceMethod('pow', function(pow) { - assertEqual(pow(3, [2]), 9); - assertEqual(pow(3, [1]), 3); - assertEqual(pow(12, [2]), 144); - assertEqual(pow(3, [3]), 27); - assertEqual(pow(3, [0]), 1); - assertEqual(pow(3), NaN); + describeInstance('pow', function(pow) { + + it('should raise numbers to a power', function() { + assertEqual(pow(3, [2]), 9); + assertEqual(pow(3, [1]), 3); + assertEqual(pow(12, [2]), 144); + assertEqual(pow(3, [3]), 27); + assertEqual(pow(3, [0]), 1); + assertEqual(pow(3), NaN); + }); + }); - instanceMethod('log', function(log) { - assertEqual(log(64, 2), 6); - assertEqual(log(32, 2), 5); - assertEqual(log(16, 2), 4); - assertEqual(log(Math.E), 1); + describeInstance('log', function(log) { + + it('should get log of numbers', function() { + assertEqual(log(64, 2), 6); + assertEqual(log(32, 2), 5); + assertEqual(log(16, 2), 4); + assertEqual(log(Math.E), 1); + }); + }); - instanceMethod('exp', function(exp) { - assertEqual(exp(0), 1); - assertEqual(exp(1), Math.exp(1)); + describeInstance('exp', function(exp) { + + it('should get exp', function() { + assertEqual(exp(0), 1); + assertEqual(exp(1), Math.exp(1)); + }); + }); - instanceMethod('sqrt', function(sqrt) { - assertEqual(sqrt(9), 3); - assertEqual(sqrt(1024), 32); + describeInstance('sqrt', function(sqrt) { + + it('should get square root', function() { + assertEqual(sqrt(9), 3); + assertEqual(sqrt(1024), 32); + }); + }); - instanceMethod('toChar', function(toChar) { - assertEqual(toChar(65), 'A'); - assertEqual(toChar(24536), '忘'); - assertEqual(toChar(20294), '但'); - assertError(function() { toChar(NaN); }, RangeError); - assertError(function() { toChar(-1); }, RangeError); - assertError(function() { toChar(.5); }, RangeError); - assertError(function() { toChar(0x110000); }, RangeError); + describeInstance('toChar', function(toChar) { + + it('should get chars', function() { + assertEqual(toChar(65), 'A'); + assertEqual(toChar(24536), '忘'); + assertEqual(toChar(20294), '但'); + assertError(function() { toChar(NaN); }, RangeError); + assertError(function() { toChar(-1); }, RangeError); + assertError(function() { toChar(.5); }, RangeError); + assertError(function() { toChar(0x110000); }, RangeError); + }); + }); - instanceMethod('clamp', function(clamp) { + describeInstance('clamp', function(clamp) { + + it('should clamp basic range', function() { + assertEqual(clamp(0, 1, 10), 1); + assertEqual(clamp(1, 1, 10), 1); + assertEqual(clamp(5, 1, 10), 5); + assertEqual(clamp(10, 1, 10), 10); + assertEqual(clamp(20, 1, 10), 10); + assertEqual(clamp(1e21, 1, 10), 10); + assertEqual(clamp(Infinity, 1, 10), 10); + assertEqual(clamp(-Infinity, 1, 10), 1); + }); - assertEqual(clamp(0, 1, 10), 1); - assertEqual(clamp(1, 1, 10), 1); - assertEqual(clamp(5, 1, 10), 5); - assertEqual(clamp(10, 1, 10), 10); - assertEqual(clamp(20, 1, 10), 10); - assertEqual(clamp(1e21, 1, 10), 10); - assertEqual(clamp(Infinity, 1, 10), 10); - assertEqual(clamp(-Infinity, 1, 10), 1); + it('should clamp decimals', function() { + assertEqual(clamp(-5.5, 1, 10), 1); + assertEqual(clamp(5.5, 1, 10), 5.5); + assertEqual(clamp(15.5, 1, 10), 10); + }); - assertEqual(clamp(-5.5, 1, 10), 1); - assertEqual(clamp(5.5, 1, 10), 5.5); - assertEqual(clamp(15.5, 1, 10), 10); - assertEqual(clamp(-1, 10), -1); - assertEqual(clamp(0, 10), 0); - assertEqual(clamp(5, 10), 5); - assertEqual(clamp(10, 10), 10); - assertEqual(clamp(20, 10), 10); + it('should clamp only one argment', function() { + assertEqual(clamp(-1, 10), -1); + assertEqual(clamp(0, 10), 0); + assertEqual(clamp(5, 10), 5); + assertEqual(clamp(10, 10), 10); + assertEqual(clamp(20, 10), 10); + }); - assertEqual(clamp(5), 5); + it('should clamp no arguments', function() { + assertEqual(clamp(5), 5); + }); - assertError(function() { clamp(NaN); }); - assertError(function() { clamp(null); }); - assertError(function() { clamp(undefined); }); + it('should raise errors on invalid', function() { + assertError(function() { clamp(NaN); }); + assertError(function() { clamp(null); }); + assertError(function() { clamp(undefined); }); + }); }); - instanceMethod('isMultipleOf', function(isMultipleOf) { - assertEqual(isMultipleOf(2, 2), true); - assertEqual(isMultipleOf(6, 2), true); - assertEqual(isMultipleOf(100, 2), true); - assertEqual(isMultipleOf(2, 100), false); - assertEqual(isMultipleOf(100, -2), true); - assertEqual(isMultipleOf(6, -2), true); - assertEqual(isMultipleOf(6, 3), true); - assertEqual(isMultipleOf(7, 3), false); - assertEqual(isMultipleOf(2.5, 1.25), true); - assertEqual(isMultipleOf(2, 'a'), false); - assertEqual(isMultipleOf(2, /af/), false); - assertEqual(isMultipleOf(2, null), false); - assertEqual(isMultipleOf(2), false); + describeInstance('isMultipleOf', function(isMultipleOf) { + + it('should should determine if multiple', function() { + assertEqual(isMultipleOf(2, 2), true); + assertEqual(isMultipleOf(6, 2), true); + assertEqual(isMultipleOf(100, 2), true); + assertEqual(isMultipleOf(2, 100), false); + assertEqual(isMultipleOf(100, -2), true); + assertEqual(isMultipleOf(6, -2), true); + assertEqual(isMultipleOf(6, 3), true); + assertEqual(isMultipleOf(7, 3), false); + assertEqual(isMultipleOf(2.5, 1.25), true); + assertEqual(isMultipleOf(2, 'a'), false); + assertEqual(isMultipleOf(2, /af/), false); + assertEqual(isMultipleOf(2, null), false); + assertEqual(isMultipleOf(2), false); + }); + }); - instanceMethod('isOdd', function(isOdd) { - assertEqual(isOdd(0), false); - assertEqual(isOdd(1), true); - assertEqual(isOdd(2), false); - assertEqual(isOdd(24), false); - assertEqual(isOdd(200), false); - assertEqual(isOdd(1.1), false); - assertEqual(isOdd(NaN), false); - assertEqual(isOdd(Infinity), false); - assertEqual(isOdd(-Infinity), false); + describeInstance('isOdd', function(isOdd) { + + it('should determine if odd', function() { + assertEqual(isOdd(0), false); + assertEqual(isOdd(1), true); + assertEqual(isOdd(2), false); + assertEqual(isOdd(24), false); + assertEqual(isOdd(200), false); + assertEqual(isOdd(1.1), false); + assertEqual(isOdd(NaN), false); + assertEqual(isOdd(Infinity), false); + assertEqual(isOdd(-Infinity), false); + }); + }); - instanceMethod('isEven', function(isEven) { - assertEqual(isEven(0), true); - assertEqual(isEven(1), false); - assertEqual(isEven(2), true); - assertEqual(isEven(24), true); - assertEqual(isEven(200), true); - assertEqual(isEven(1.1), false); - assertEqual(isEven(NaN), false); - assertEqual(isEven(Infinity), false); - assertEqual(isEven(-Infinity), false); + describeInstance('isEven', function(isEven) { + + it('should determine if even', function() { + assertEqual(isEven(0), true); + assertEqual(isEven(1), false); + assertEqual(isEven(2), true); + assertEqual(isEven(24), true); + assertEqual(isEven(200), true); + assertEqual(isEven(1.1), false); + assertEqual(isEven(NaN), false); + assertEqual(isEven(Infinity), false); + assertEqual(isEven(-Infinity), false); + }); + }); - instanceMethod('toOrdinal', function(toOrdinal) { - - assertEqual(toOrdinal(0), '0th'); - assertEqual(toOrdinal(1), '1st'); - assertEqual(toOrdinal(2), '2nd'); - assertEqual(toOrdinal(3), '3rd'); - assertEqual(toOrdinal(4), '4th'); - assertEqual(toOrdinal(5), '5th'); - assertEqual(toOrdinal(6), '6th'); - assertEqual(toOrdinal(7), '7th'); - assertEqual(toOrdinal(8), '8th'); - assertEqual(toOrdinal(9), '9th'); - assertEqual(toOrdinal(10), '10th'); - assertEqual(toOrdinal(11), '11th'); - assertEqual(toOrdinal(12), '12th'); - assertEqual(toOrdinal(13), '13th'); - assertEqual(toOrdinal(14), '14th'); - assertEqual(toOrdinal(15), '15th'); - assertEqual(toOrdinal(20), '20th'); - assertEqual(toOrdinal(21), '21st'); - assertEqual(toOrdinal(22), '22nd'); - assertEqual(toOrdinal(23), '23rd'); - assertEqual(toOrdinal(24), '24th'); - assertEqual(toOrdinal(25), '25th'); - assertEqual(toOrdinal(100), '100th'); - assertEqual(toOrdinal(101), '101st'); - assertEqual(toOrdinal(102), '102nd'); - assertEqual(toOrdinal(103), '103rd'); - assertEqual(toOrdinal(104), '104th'); - assertEqual(toOrdinal(105), '105th'); - - assertEqual(toOrdinal(-0), '0th'); - assertEqual(toOrdinal(-1), '-1st'); - assertEqual(toOrdinal(-2), '-2nd'); - assertEqual(toOrdinal(-3), '-3rd'); - assertEqual(toOrdinal(-4), '-4th'); - assertEqual(toOrdinal(-5), '-5th'); - - assertError(function() { toOrdinal(NaN); }); - assertError(function() { toOrdinal(5.55); }); - assertError(function() { toOrdinal(null); }); - assertError(function() { toOrdinal(undefined); }); - assertError(function() { toOrdinal(Infinity); }); + describeInstance('toOrdinal', function(toOrdinal) { + + it('should get basic ordinals', function() { + assertEqual(toOrdinal(0), '0th'); + assertEqual(toOrdinal(1), '1st'); + assertEqual(toOrdinal(2), '2nd'); + assertEqual(toOrdinal(3), '3rd'); + assertEqual(toOrdinal(4), '4th'); + assertEqual(toOrdinal(5), '5th'); + assertEqual(toOrdinal(6), '6th'); + assertEqual(toOrdinal(7), '7th'); + assertEqual(toOrdinal(8), '8th'); + assertEqual(toOrdinal(9), '9th'); + assertEqual(toOrdinal(10), '10th'); + assertEqual(toOrdinal(11), '11th'); + assertEqual(toOrdinal(12), '12th'); + assertEqual(toOrdinal(13), '13th'); + assertEqual(toOrdinal(14), '14th'); + assertEqual(toOrdinal(15), '15th'); + assertEqual(toOrdinal(20), '20th'); + assertEqual(toOrdinal(21), '21st'); + assertEqual(toOrdinal(22), '22nd'); + assertEqual(toOrdinal(23), '23rd'); + assertEqual(toOrdinal(24), '24th'); + assertEqual(toOrdinal(25), '25th'); + assertEqual(toOrdinal(100), '100th'); + assertEqual(toOrdinal(101), '101st'); + assertEqual(toOrdinal(102), '102nd'); + assertEqual(toOrdinal(103), '103rd'); + assertEqual(toOrdinal(104), '104th'); + assertEqual(toOrdinal(105), '105th'); + }); + + it('should convert negative numbers', function() { + assertEqual(toOrdinal(-0), '0th'); + assertEqual(toOrdinal(-1), '-1st'); + assertEqual(toOrdinal(-2), '-2nd'); + assertEqual(toOrdinal(-3), '-3rd'); + assertEqual(toOrdinal(-4), '-4th'); + assertEqual(toOrdinal(-5), '-5th'); + }); + + it('should error on invalid values', function() { + assertError(function() { toOrdinal(NaN); }); + assertError(function() { toOrdinal(5.55); }); + assertError(function() { toOrdinal(null); }); + assertError(function() { toOrdinal(undefined); }); + assertError(function() { toOrdinal(Infinity); }); + }); }); - instanceMethod('isInteger', function(isInteger) { - assertEqual(isInteger(15), true); - assertEqual(isInteger(15.2), false); - assertEqual(isInteger(15.2668), false); - assertEqual(isInteger(15.0), true); - assertEqual(isInteger('15'), false); - assertEqual(isInteger('15.8'), false); + describeInstance('isInteger', function(isInteger) { + + it('should find integers', function() { + assertEqual(isInteger(15), true); + assertEqual(isInteger(15.2), false); + assertEqual(isInteger(15.2668), false); + assertEqual(isInteger(15.0), true); + assertEqual(isInteger('15'), false); + assertEqual(isInteger('15.8'), false); + }); + }); - instanceMethod('isSafeInteger', function(isSafeInteger) { - assertEqual(isSafeInteger(-0), true); - assertEqual(isSafeInteger(0), true); - assertEqual(isSafeInteger(1), true); - assertEqual(isSafeInteger(1e255), false); - assertEqual(isSafeInteger(NaN), false); - assertEqual(isSafeInteger(Infinity), false); + describeInstance('isSafeInteger', function(isSafeInteger) { + + it('should find safe integers', function() { + assertEqual(isSafeInteger(-0), true); + assertEqual(isSafeInteger(0), true); + assertEqual(isSafeInteger(1), true); + assertEqual(isSafeInteger(1e255), false); + assertEqual(isSafeInteger(NaN), false); + assertEqual(isSafeInteger(Infinity), false); + }); + }); - instanceMethod('isFinite', function(isFinite) { - assertEqual(isFinite(-0), true); - assertEqual(isFinite(0), true); - assertEqual(isFinite(1), true); - assertEqual(isFinite(1e255), true); - assertEqual(isFinite(NaN), false); - assertEqual(isFinite(Infinity), false); - assertEqual(isFinite(-Infinity), false); + describeInstance('isFinite', function(isFinite) { + + it('should return true for finite numbers', function() { + assertEqual(isFinite(-0), true); + assertEqual(isFinite(0), true); + assertEqual(isFinite(1), true); + assertEqual(isFinite(1e255), true); + assertEqual(isFinite(NaN), false); + assertEqual(isFinite(Infinity), false); + assertEqual(isFinite(-Infinity), false); + }); }); - instanceMethod('isNaN', function(isNaN) { - assertEqual(isNaN(1), false); - assertEqual(isNaN(NaN), true); - assertEqual(isNaN(Infinity), false); - assertEqual(isNaN(-Infinity), false); + describeInstance('isNaN', function(isNaN) { + + it('should return true for NaN', function() { + assertEqual(isNaN(1), false); + assertEqual(isNaN(NaN), true); + assertEqual(isNaN(Infinity), false); + assertEqual(isNaN(-Infinity), false); + }); + }); - instanceMethod('times', function(times) { + describeInstance('times', function(times) { function assertCount(n, expected) { var count = 0; @@ -368,368 +466,437 @@ namespace('Number', function() { }); } - assertCount(1, 1); - assertCount(5, 5); - assertCount(10, 10); + it('should run specified number of times', function() { + assertCount(1, 1); + assertCount(5, 5); + assertCount(10, 10); + }); - assertInvalidInput(-1); - assertInvalidInput(1.5); - assertInvalidInput(NaN); - assertInvalidInput(null); - assertInvalidInput(undefined); - assertInvalidInput(Infinity); - assertInvalidInput(-Infinity); + it('should error on invalid input', function() { + assertInvalidInput(-1); + assertInvalidInput(1.5); + assertInvalidInput(NaN); + assertInvalidInput(null); + assertInvalidInput(undefined); + assertInvalidInput(Infinity); + assertInvalidInput(-Infinity); + }); - assertArrayEqual(times(3, function(i) { - return Math.pow(2, i); - }), [1,2,4]); + it('should produce correct return values', function() { + assertArrayEqual(times(3, function(i) { + return Math.pow(2, i); + }), [1,2,4]); - assertArrayEqual(times(1, function(i, n) { - return n; - }), [1]); + assertArrayEqual(times(1, function(i, n) { + return n; + }), [1]); + }); - assertError(function() { times(1); }); + it('should error when no function provided', function() { + assertError(function() { times(1); }); + }); }); - instanceMethod('format', function(format) { + describeInstance('format', function(format) { - assertEqual(format(1), '1'); - assertEqual(format(10), '10'); - assertEqual(format(100), '100'); - assertEqual(format(1000), '1,000'); - assertEqual(format(1000000), '1,000,000'); - assertEqual(format(1000000000), '1,000,000,000'); + it('should format positive integers', function() { + assertEqual(format(1), '1'); + assertEqual(format(10), '10'); + assertEqual(format(100), '100'); + assertEqual(format(1000), '1,000'); + assertEqual(format(1000000), '1,000,000'); + assertEqual(format(1000000000), '1,000,000,000'); + }); - assertEqual(format(-1), '-1'); - assertEqual(format(-10), '-10'); - assertEqual(format(-100), '-100'); - assertEqual(format(-1000), '-1,000'); - assertEqual(format(-1000000), '-1,000,000'); - assertEqual(format(-1000000000), '-1,000,000,000'); + it('should format negative integers', function() { + assertEqual(format(-1), '-1'); + assertEqual(format(-10), '-10'); + assertEqual(format(-100), '-100'); + assertEqual(format(-1000), '-1,000'); + assertEqual(format(-1000000), '-1,000,000'); + assertEqual(format(-1000000000), '-1,000,000,000'); + }); - assertEqual(format( 6666.66), '6,666.66'); - assertEqual(format(-6666.66), '-6,666.66'); + it('should format fractions', function() { + assertEqual(format( 6666.66), '6,666.66'); + assertEqual(format(-6666.66), '-6,666.66'); - assertEqual(format( 6666.66, 1), '6,666.7'); - assertEqual(format(-6666.66, 1), '-6,666.7'); + assertEqual(format( 6666.66, 1), '6,666.7'); + assertEqual(format(-6666.66, 1), '-6,666.7'); - assertEqual(format( 1000, 2), '1,000.00'); - assertEqual(format(-1000, 2), '-1,000.00'); + assertEqual(format( 1000, 2), '1,000.00'); + assertEqual(format(-1000, 2), '-1,000.00'); - assertEqual(format( 6666.66, -1), '6,670'); - assertEqual(format(-6666.66, -1), '-6,670'); + assertEqual(format( 6666.66, -1), '6,670'); + assertEqual(format(-6666.66, -1), '-6,670'); + }); - assertEqual(format( 1e6), '1,000,000'); - assertEqual(format(-1e6), '-1,000,000'); + it('should format exponential notation', function() { + assertEqual(format( 1e6), '1,000,000'); + assertEqual(format(-1e6), '-1,000,000'); - assertEqual(format( 1e6, 2), '1,000,000.00'); - assertEqual(format(-1e6, 2), '-1,000,000.00'); + assertEqual(format( 1e6, 2), '1,000,000.00'); + assertEqual(format(-1e6, 2), '-1,000,000.00'); + }); - assertEqual(format( 0), '0'); - assertEqual(format(-0), '0'); + it('should format 0 and -0', function() { + assertEqual(format( 0), '0'); + assertEqual(format(-0), '0'); - assertEqual(format( 0, 2), '0.00'); - assertEqual(format(-0, 2), '0.00'); + assertEqual(format( 0, 2), '0.00'); + assertEqual(format(-0, 2), '0.00'); + }); - assertEqual(format('1000'), '1,000'); + it('should coerce strings', function() { + assertEqual(format('1000'), '1,000'); + }); - assertError(function() { format(NaN); }); - assertError(function() { format(1e21); }); - assertError(function() { format(1e-6); }); - assertError(function() { format(Infinity); }); + it('should error on invalid input', function() { + assertError(function() { format(NaN); }); + assertError(function() { format(1e21); }); + assertError(function() { format(1e-6); }); + assertError(function() { format(Infinity); }); + }); }); - instanceMethod('pad', function(pad) { + describeInstance('pad', function(pad) { + + it('should pad basic numbers', function() { + assertEqual(pad(1), '1'); + assertEqual(pad(1, 0), '1'); + assertEqual(pad(1, 1), '1'); + assertEqual(pad(1, 2), '01'); + assertEqual(pad(1, 3), '001'); + }); - assertEqual(pad(1), '1'); - assertEqual(pad(1, 0), '1'); - assertEqual(pad(1, 1), '1'); - assertEqual(pad(1, 2), '01'); - assertEqual(pad(1, 3), '001'); + it('should pad negative numbers', function() { + assertEqual(pad(-1), '-1'); + assertEqual(pad(-1, 0), '-1'); + assertEqual(pad(-1, 1), '-1'); + assertEqual(pad(-1, 2), '-01'); + }); - assertEqual(pad(-1), '-1'); - assertEqual(pad(-1, 0), '-1'); - assertEqual(pad(-1, 1), '-1'); - assertEqual(pad(-1, 2), '-01'); + it('should include sign', function() { + assertEqual(pad( 1, 2, 0, true), '+01'); + assertEqual(pad(-1, 2, 0, true), '-01'); + }); - assertEqual(pad( 1, 2, 0, true), '+01'); - assertEqual(pad(-1, 2, 0, true), '-01'); + it('should pad fractions', function() { + assertEqual(pad(5.25, 4), '0005.25'); + assertEqual(pad(5.25, 4, 0), '0005'); + assertEqual(pad(5.25, 4, 1), '0005.3'); - assertEqual(pad(5.25, 4), '0005.25'); - assertEqual(pad(5.25, 4, 0), '0005'); - assertEqual(pad(5.25, 4, 1), '0005.3'); - assertEqual(pad(5, 4, 2, true), '+0005.00'); - assertEqual(pad(5, 4, null, true), '+0005'); + assertEqual(pad(5, 4, 2, true), '+0005.00'); + assertEqual(pad(5, 4, null, true), '+0005'); + }); - assertError(function() { pad(NaN); }); - assertError(function() { pad(1e21); }); - assertError(function() { pad(1e-6); }); - assertError(function() { pad(Infinity); }); + it('should error on invalid input', function() { + assertError(function() { pad(NaN); }); + assertError(function() { pad(1e21); }); + assertError(function() { pad(1e-6); }); + assertError(function() { pad(Infinity); }); + }); }); - instanceMethod('toHex', function(toHex) { + describeInstance('toHex', function(toHex) { - assertEqual(toHex(0), '0'); - assertEqual(toHex(0, 2), '00'); + it('should perform basic conversion', function() { + assertEqual(toHex(255), 'ff'); + assertEqual(toHex(255, 4), '00ff'); + }); - assertEqual(toHex(255), 'ff'); - assertEqual(toHex(255, 4), '00ff'); + it('should convert 0', function() { + assertEqual(toHex(0), '0'); + assertEqual(toHex(0, 2), '00'); + }); - assertEqual(toHex(255.5, 4), '00ff.8'); + it('should preserve decimal', function() { + assertEqual(toHex(255.5, 4), '00ff.8'); + }); - assertError(function() { toHex(NaN); }); - assertError(function() { toHex(1e21); }); - assertError(function() { toHex(1e-6); }); - assertError(function() { toHex(Infinity); }); + it('should error on invalid input', function() { + assertError(function() { toHex(NaN); }); + assertError(function() { toHex(1e21); }); + assertError(function() { toHex(1e-6); }); + assertError(function() { toHex(Infinity); }); + }); }); - instanceMethod('abbr', function(abbr) { - - // Positive - assertEqual(abbr(0), '0'); - assertEqual(abbr(1), '1'); - assertEqual(abbr(10), '10'); - assertEqual(abbr(100), '100'); - assertEqual(abbr(999), '999'); - assertEqual(abbr(1000), '1k'); - assertEqual(abbr(1999), '1k'); - assertEqual(abbr(10000), '10k'); - assertEqual(abbr(100000), '100k'); - assertEqual(abbr(1000000), '1m'); - assertEqual(abbr(1000000000), '1b'); - assertEqual(abbr(1000000000000), '1t'); - assertEqual(abbr(1000000000000000), '1,000t'); - - // Negative - assertEqual(abbr(-1), '-1'); - assertEqual(abbr(-10), '-10'); - assertEqual(abbr(-100), '-100'); - assertEqual(abbr(-1000), '-1k'); - assertEqual(abbr(-10000), '-10k'); - assertEqual(abbr(-100000), '-100k'); - assertEqual(abbr(-1000000), '-1m'); - assertEqual(abbr(-1000000000), '-1b'); - assertEqual(abbr(-1000000000000), '-1t'); - assertEqual(abbr(-1000000000000000), '-1,000t'); - - // Decimal - assertEqual(abbr(0.1), '0.1'); - assertEqual(abbr(0.01), '0.01'); - assertEqual(abbr(0.001), '0.001'); - assertEqual(abbr(0.0001), '0.0001'); - assertEqual(abbr(1000000.25), '1m'); - - // With Precision - assertEqual(abbr(0, 0), '0'); - assertEqual(abbr(0, -1), '0'); - assertEqual(abbr(1748), '1k'); - assertEqual(abbr(1748, 1), '1.7k'); - assertEqual(abbr(1748, 2), '1.74k'); - assertEqual(abbr(1748, 3), '1.748k'); - assertEqual(abbr(1748, -1), '1k'); - assertEqual(abbr(155555, 0), '155k'); - assertEqual(abbr(155555, -1), '150k'); - assertEqual(abbr(155555, -2), '100k'); - assertEqual(abbr(155555, -3), '100k'); - assertEqual(abbr(-1748), '-1k'); - assertEqual(abbr(-1748, 1), '-1.7k'); - assertEqual(abbr(-1748, 2), '-1.74k'); - assertEqual(abbr(-1748, 3), '-1.748k'); - assertEqual(abbr(-155555, 0), '-155k'); - assertEqual(abbr(-155555, -1), '-150k'); - assertEqual(abbr(-155555, -2), '-100k'); - - // Common si - assertEqual(abbr(1, 0, 'common') + 'm', '1m'); - assertEqual(abbr(10, 0, 'common') + 'm', '10m'); - assertEqual(abbr(100, 0, 'common') + 'm', '100m'); - assertEqual(abbr(1000, 0, 'common') + 'm', '1km'); - assertEqual(abbr(10000, 0, 'common') + 'm', '10km'); - assertEqual(abbr(10000000, 0, 'common') + 'm', '10,000km'); - - assertEqual(abbr(9, 0, 'common') + 'm', '9m'); - assertEqual(abbr(99, 0, 'common') + 'm', '99m'); - assertEqual(abbr(999, 0, 'common') + 'm', '999m'); - assertEqual(abbr(9999, 0, 'common') + 'm', '9km'); - assertEqual(abbr(99999, 0, 'common') + 'm', '99km'); - assertEqual(abbr(99999999, 0, 'common') + 'm', '99,999km'); - - assertEqual(abbr(.1, 0, 'common') + 'm', '100mm'); - assertEqual(abbr(.01, 0, 'common') + 'm', '10mm'); - assertEqual(abbr(.001, 0, 'common') + 'm', '1mm'); - assertEqual(abbr(.0001, 0, 'common') + 'm', '100μm'); - assertEqual(abbr(.00001, 0, 'common') + 'm', '10μm'); - assertEqual(abbr(.000001, 0, 'common') + 'm', '1μm'); - assertEqual(abbr(.0000001, 0, 'common') + 'm', '100nm'); - assertEqual(abbr(.00000001, 0, 'common') + 'm', '10nm'); - assertEqual(abbr(.000000001, 0, 'common') + 'm', '1nm'); - - assertEqual(abbr(.9, 0, 'common') + 'm', '900mm'); - assertEqual(abbr(.09, 0, 'common') + 'm', '90mm'); - assertEqual(abbr(.009, 0, 'common') + 'm', '9mm'); - assertEqual(abbr(.0009, 0, 'common') + 'm', '900μm'); - assertEqual(abbr(.00009, 0, 'common') + 'm', '90μm'); - assertEqual(abbr(.000009, 0, 'common') + 'm', '9μm'); - assertEqual(abbr(.0000009, 0, 'common') + 'm', '900nm'); - assertEqual(abbr(.00000009, 0, 'common') + 'm', '90nm'); - assertEqual(abbr(.000000009, 0, 'common') + 'm', '9nm'); - - // Full si - assertEqual(abbr(1, 0, 'metric'), '1'); - assertEqual(abbr(1000, 0, 'metric'), '1K'); - assertEqual(abbr(1000000, 0, 'metric'), '1M'); - assertEqual(abbr(1000000000, 0, 'metric'), '1G'); - assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); - assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); - assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); - assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); - assertEqual(abbr(1000000000000000000000000, 0, 'metric'), '1Y'); - assertEqual(abbr(1000000000000000000000000000, 0, 'metric'), '1,000Y'); - - assertEqual(abbr(.001, 0, 'metric'), '1m'); - assertEqual(abbr(.000001, 0, 'metric'), '1μ'); - assertEqual(abbr(.000000001, 0, 'metric'), '1n'); - assertEqual(abbr(.000000000001, 0, 'metric'), '1p'); - assertEqual(abbr(.000000000000001, 0, 'metric'), '1f'); - assertEqual(abbr(.000000000000000001, 0, 'metric'), '1a'); - assertEqual(abbr(.000000000000000000001, 0, 'metric'), '1z'); - assertEqual(abbr(.000000000000000000000001, 0, 'metric'), '1y'); - assertEqual(abbr(.000000000000000000000000001, 0, 'metric'), '0'); - assertEqual(abbr(.000000000000000000000000001, null, 'metric'), '0.001y'); - - // Binary (Base 2) - assertEqual(abbr(1, 0, 'binary'), '1'); - assertEqual(abbr(Math.pow(2, 10), 0, 'binary') + 'B', '1KB'); - assertEqual(abbr(Math.pow(2, 20), 0, 'binary') + 'B', '1MB'); - assertEqual(abbr(Math.pow(2, 30), 0, 'binary') + 'B', '1GB'); - assertEqual(abbr(Math.pow(2, 40), 0, 'binary') + 'B', '1TB'); - assertEqual(abbr(Math.pow(2, 50), 0, 'binary') + 'B', '1PB'); - assertEqual(abbr(Math.pow(2, 60), 0, 'binary') + 'B', '1EB'); - assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1ZB'); - - assertEqual(abbr(Math.pow(2, 10) - Math.pow(2, 0), 0, 'binary') + 'B', '1,023B'); - assertEqual(abbr(Math.pow(2, 20) - Math.pow(2, 10), 0, 'binary') + 'B', '1,023KB'); - assertEqual(abbr(Math.pow(2, 30) - Math.pow(2, 20), 0, 'binary') + 'B', '1,023MB'); - assertEqual(abbr(Math.pow(2, 40) - Math.pow(2, 30), 0, 'binary') + 'B', '1,023GB'); - assertEqual(abbr(Math.pow(2, 50) - Math.pow(2, 40), 0, 'binary') + 'B', '1,023TB'); - assertEqual(abbr(Math.pow(2, 60) - Math.pow(2, 50), 0, 'binary') + 'B', '1,023PB'); - assertEqual(abbr(Math.pow(2, 70) - Math.pow(2, 60), 0, 'binary') + 'B', '1,023EB'); - - // Memory (Base 10) - assertEqual(abbr(1, 0, 'metric'), '1'); - assertEqual(abbr(1000, 0, 'metric'), '1K'); - assertEqual(abbr(1000000, 0, 'metric'), '1M'); - assertEqual(abbr(1000000000, 0, 'metric'), '1G'); - assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); - assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); - assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); - assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); - - // Other - assertEqual(abbr(1755, 2, 'integer'), '1.75k'); - assertEqual(abbr(17555, 2, '|'), '17,555'); - assertEqual(abbr(.17555, 2, '|'), '0.17'); - assertEqual(abbr(.17555, null, '|'), '0.17555'); - assertEqual(abbr(17555, 0, 'x|y'), '17x'); - assertEqual(abbr(.17555, 0, 'x|y'), '175y'); - assertEqual(abbr(175000, null, 'm-|'), '0.175m'); - assertEqual(abbr(175000000, null, 'bm-|'), '175m'); - assertEqual(abbr(.175, 0, 'x|-μ'), '175,000μ'); - - // Errors - assertError(function() { abbr(NaN); }); - assertError(function() { abbr(Infinity); }); - assertError(function() { abbr(null); }); - assertError(function() { abbr(undefined); }); + describeInstance('abbr', function(abbr) { + + it('should abbreviate positive integers', function() { + assertEqual(abbr(0), '0'); + assertEqual(abbr(1), '1'); + assertEqual(abbr(10), '10'); + assertEqual(abbr(100), '100'); + assertEqual(abbr(999), '999'); + assertEqual(abbr(1000), '1k'); + assertEqual(abbr(1999), '1k'); + assertEqual(abbr(10000), '10k'); + assertEqual(abbr(100000), '100k'); + assertEqual(abbr(1000000), '1m'); + assertEqual(abbr(1000000000), '1b'); + assertEqual(abbr(1000000000000), '1t'); + assertEqual(abbr(1000000000000000), '1,000t'); + }); + + it('should abbreviate negative integers', function() { + assertEqual(abbr(-1), '-1'); + assertEqual(abbr(-10), '-10'); + assertEqual(abbr(-100), '-100'); + assertEqual(abbr(-1000), '-1k'); + assertEqual(abbr(-10000), '-10k'); + assertEqual(abbr(-100000), '-100k'); + assertEqual(abbr(-1000000), '-1m'); + assertEqual(abbr(-1000000000), '-1b'); + assertEqual(abbr(-1000000000000), '-1t'); + assertEqual(abbr(-1000000000000000), '-1,000t'); + }); + + it('should abbreviate decimals', function() { + assertEqual(abbr(0.1), '0.1'); + assertEqual(abbr(0.01), '0.01'); + assertEqual(abbr(0.001), '0.001'); + assertEqual(abbr(0.0001), '0.0001'); + assertEqual(abbr(1000000.25), '1m'); + }); + + it('should abbreviate with precision', function() { + assertEqual(abbr(0, 0), '0'); + assertEqual(abbr(0, -1), '0'); + assertEqual(abbr(1748), '1k'); + assertEqual(abbr(1748, 1), '1.7k'); + assertEqual(abbr(1748, 2), '1.74k'); + assertEqual(abbr(1748, 3), '1.748k'); + assertEqual(abbr(1748, -1), '1k'); + assertEqual(abbr(155555, 0), '155k'); + assertEqual(abbr(155555, -1), '150k'); + assertEqual(abbr(155555, -2), '100k'); + assertEqual(abbr(155555, -3), '100k'); + assertEqual(abbr(-1748), '-1k'); + assertEqual(abbr(-1748, 1), '-1.7k'); + assertEqual(abbr(-1748, 2), '-1.74k'); + assertEqual(abbr(-1748, 3), '-1.748k'); + assertEqual(abbr(-155555, 0), '-155k'); + assertEqual(abbr(-155555, -1), '-150k'); + assertEqual(abbr(-155555, -2), '-100k'); + }); + + it('should abbreviate common si', function() { + assertEqual(abbr(1, 0, 'common') + 'm', '1m'); + assertEqual(abbr(10, 0, 'common') + 'm', '10m'); + assertEqual(abbr(100, 0, 'common') + 'm', '100m'); + assertEqual(abbr(1000, 0, 'common') + 'm', '1km'); + assertEqual(abbr(10000, 0, 'common') + 'm', '10km'); + assertEqual(abbr(10000000, 0, 'common') + 'm', '10,000km'); + + assertEqual(abbr(9, 0, 'common') + 'm', '9m'); + assertEqual(abbr(99, 0, 'common') + 'm', '99m'); + assertEqual(abbr(999, 0, 'common') + 'm', '999m'); + assertEqual(abbr(9999, 0, 'common') + 'm', '9km'); + assertEqual(abbr(99999, 0, 'common') + 'm', '99km'); + assertEqual(abbr(99999999, 0, 'common') + 'm', '99,999km'); + + assertEqual(abbr(.1, 0, 'common') + 'm', '100mm'); + assertEqual(abbr(.01, 0, 'common') + 'm', '10mm'); + assertEqual(abbr(.001, 0, 'common') + 'm', '1mm'); + assertEqual(abbr(.0001, 0, 'common') + 'm', '100μm'); + assertEqual(abbr(.00001, 0, 'common') + 'm', '10μm'); + assertEqual(abbr(.000001, 0, 'common') + 'm', '1μm'); + assertEqual(abbr(.0000001, 0, 'common') + 'm', '100nm'); + assertEqual(abbr(.00000001, 0, 'common') + 'm', '10nm'); + assertEqual(abbr(.000000001, 0, 'common') + 'm', '1nm'); + + assertEqual(abbr(.9, 0, 'common') + 'm', '900mm'); + assertEqual(abbr(.09, 0, 'common') + 'm', '90mm'); + assertEqual(abbr(.009, 0, 'common') + 'm', '9mm'); + assertEqual(abbr(.0009, 0, 'common') + 'm', '900μm'); + assertEqual(abbr(.00009, 0, 'common') + 'm', '90μm'); + assertEqual(abbr(.000009, 0, 'common') + 'm', '9μm'); + assertEqual(abbr(.0000009, 0, 'common') + 'm', '900nm'); + assertEqual(abbr(.00000009, 0, 'common') + 'm', '90nm'); + assertEqual(abbr(.000000009, 0, 'common') + 'm', '9nm'); + }); + + it('should abbreviate full si', function() { + assertEqual(abbr(1, 0, 'metric'), '1'); + assertEqual(abbr(1000, 0, 'metric'), '1K'); + assertEqual(abbr(1000000, 0, 'metric'), '1M'); + assertEqual(abbr(1000000000, 0, 'metric'), '1G'); + assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); + assertEqual(abbr(1000000000000000000000000, 0, 'metric'), '1Y'); + assertEqual(abbr(1000000000000000000000000000, 0, 'metric'), '1,000Y'); + + assertEqual(abbr(.001, 0, 'metric'), '1m'); + assertEqual(abbr(.000001, 0, 'metric'), '1μ'); + assertEqual(abbr(.000000001, 0, 'metric'), '1n'); + assertEqual(abbr(.000000000001, 0, 'metric'), '1p'); + assertEqual(abbr(.000000000000001, 0, 'metric'), '1f'); + assertEqual(abbr(.000000000000000001, 0, 'metric'), '1a'); + assertEqual(abbr(.000000000000000000001, 0, 'metric'), '1z'); + assertEqual(abbr(.000000000000000000000001, 0, 'metric'), '1y'); + assertEqual(abbr(.000000000000000000000000001, 0, 'metric'), '0'); + assertEqual(abbr(.000000000000000000000000001, null, 'metric'), '0.001y'); + }); + it('should abbreviate base 2', function() { + assertEqual(abbr(1, 0, 'binary'), '1'); + assertEqual(abbr(Math.pow(2, 10), 0, 'binary') + 'B', '1KB'); + assertEqual(abbr(Math.pow(2, 20), 0, 'binary') + 'B', '1MB'); + assertEqual(abbr(Math.pow(2, 30), 0, 'binary') + 'B', '1GB'); + assertEqual(abbr(Math.pow(2, 40), 0, 'binary') + 'B', '1TB'); + assertEqual(abbr(Math.pow(2, 50), 0, 'binary') + 'B', '1PB'); + assertEqual(abbr(Math.pow(2, 60), 0, 'binary') + 'B', '1EB'); + assertEqual(abbr(Math.pow(2, 70), 0, 'binary') + 'B', '1ZB'); + + assertEqual(abbr(Math.pow(2, 10) - Math.pow(2, 0), 0, 'binary') + 'B', '1,023B'); + assertEqual(abbr(Math.pow(2, 20) - Math.pow(2, 10), 0, 'binary') + 'B', '1,023KB'); + assertEqual(abbr(Math.pow(2, 30) - Math.pow(2, 20), 0, 'binary') + 'B', '1,023MB'); + assertEqual(abbr(Math.pow(2, 40) - Math.pow(2, 30), 0, 'binary') + 'B', '1,023GB'); + assertEqual(abbr(Math.pow(2, 50) - Math.pow(2, 40), 0, 'binary') + 'B', '1,023TB'); + assertEqual(abbr(Math.pow(2, 60) - Math.pow(2, 50), 0, 'binary') + 'B', '1,023PB'); + assertEqual(abbr(Math.pow(2, 70) - Math.pow(2, 60), 0, 'binary') + 'B', '1,023EB'); + }); + + it('should abbreviate base 10', function() { + assertEqual(abbr(1, 0, 'metric'), '1'); + assertEqual(abbr(1000, 0, 'metric'), '1K'); + assertEqual(abbr(1000000, 0, 'metric'), '1M'); + assertEqual(abbr(1000000000, 0, 'metric'), '1G'); + assertEqual(abbr(1000000000000, 0, 'metric'), '1T'); + assertEqual(abbr(1000000000000000, 0, 'metric'), '1P'); + assertEqual(abbr(1000000000000000000, 0, 'metric'), '1E'); + assertEqual(abbr(1000000000000000000000, 0, 'metric'), '1Z'); + }); + + it('should handle custom cases ', function() { + assertEqual(abbr(1755, 2, 'integer'), '1.75k'); + assertEqual(abbr(17555, 2, '|'), '17,555'); + assertEqual(abbr(.17555, 2, '|'), '0.17'); + assertEqual(abbr(.17555, null, '|'), '0.17555'); + assertEqual(abbr(17555, 0, 'x|y'), '17x'); + assertEqual(abbr(.17555, 0, 'x|y'), '175y'); + assertEqual(abbr(175000, null, 'm-|'), '0.175m'); + assertEqual(abbr(175000000, null, 'bm-|'), '175m'); + assertEqual(abbr(.175, 0, 'x|-μ'), '175,000μ'); + }); + + it('should error on invalid input', function() { + assertError(function() { abbr(NaN); }); + assertError(function() { abbr(Infinity); }); + assertError(function() { abbr(null); }); + assertError(function() { abbr(undefined); }); + }); withNumberFormatter('de-DE', function(formatter) { - assertEqual(abbr(1755, 1, 'integer', formatter), '1,7k'); - assertEqual(abbr(1755, 2, 'integer', formatter), '1,75k'); + + it('should accept custom number formatter', function() { + assertEqual(abbr(1755, 1, 'integer', formatter), '1,7k'); + assertEqual(abbr(1755, 2, 'integer', formatter), '1,75k'); + }); + }); }); - instanceMethod('upto', function(upto) { - - assertArrayEqual(upto(0, 0), [0]); - assertArrayEqual(upto(0, 1), [0,1]); - assertArrayEqual(upto(0, 5), [0,1,2,3,4,5]); - assertArrayEqual(upto(2,-2), [-2,-1,0,1,2]); - assertArrayEqual(upto(-2, 2), [-2,-1,0,1,2]); - - assertArrayEqual(upto(-0.5, 0.5), [-0.5,0.5]); - assertArrayEqual(upto(-0.5, 0.6), [-0.5,0.5]); - assertArrayEqual(upto(-0.5, 0.4), [-0.5]); - - // With collecting callback. - assertArrayEqual(upto(0, 1, 1, noop), [undefined, undefined]); - assertArrayEqual(upto(-1, 1, 1, args), [[-1,0],[0,1],[1,2]]); - assertArrayEqual(upto(1, -1, 1, args), [[-1,0],[0,1],[1,2]]); - - // With step - assertArrayEqual(upto(0, 6, 10), [0]); - assertArrayEqual(upto(0, 6, 2), [0,2,4,6]); - assertArrayEqual(upto(0, 2, 0.5), [0,0.5,1,1.5,2]); - - // Invalid input - assertError(function() { upto(null, 1); }); - assertError(function() { upto(1, null); }); - assertError(function() { upto(NaN, 1); }); - assertError(function() { upto(1, NaN); }); - assertError(function() { upto(-Infinity, 0); }); - assertError(function() { upto(0, Infinity); }); - - // Invalid step - assertError(function() { upto(1, 4, 0); }); - assertError(function() { upto(1, 4, 0, noop); }); - assertError(function() { upto(1, 4, -2); }); - assertError(function() { upto(1, 4, Infinity); }); - assertError(function() { upto(1, 4, NaN); }); + describeInstance('upto', function(upto) { + + it('should iterate over integers', function() { + assertArrayEqual(upto(0, 0), [0]); + assertArrayEqual(upto(0, 1), [0,1]); + assertArrayEqual(upto(0, 5), [0,1,2,3,4,5]); + assertArrayEqual(upto(2,-2), [-2,-1,0,1,2]); + assertArrayEqual(upto(-2, 2), [-2,-1,0,1,2]); + }); + + it('should iterate over fractions', function() { + assertArrayEqual(upto(-0.5, 0.5), [-0.5,0.5]); + assertArrayEqual(upto(-0.5, 0.6), [-0.5,0.5]); + assertArrayEqual(upto(-0.5, 0.4), [-0.5]); + }); + + it('should accept a mapping function', function() { + assertArrayEqual(upto(0, 1, 1, noop), [undefined, undefined]); + assertArrayEqual(upto(-1, 1, 1, args), [[-1,0],[0,1],[1,2]]); + assertArrayEqual(upto(1, -1, 1, args), [[-1,0],[0,1],[1,2]]); + }); + + it('should allow a step argument', function() { + assertArrayEqual(upto(0, 6, 10), [0]); + assertArrayEqual(upto(0, 6, 2), [0,2,4,6]); + assertArrayEqual(upto(0, 2, 0.5), [0,0.5,1,1.5,2]); + }); + + it('should error on invalid input', function() { + assertError(function() { upto(null, 1); }); + assertError(function() { upto(1, null); }); + assertError(function() { upto(NaN, 1); }); + assertError(function() { upto(1, NaN); }); + assertError(function() { upto(-Infinity, 0); }); + assertError(function() { upto(0, Infinity); }); + }); + + it('should error on invalid step', function() { + assertError(function() { upto(1, 4, 0); }); + assertError(function() { upto(1, 4, 0, noop); }); + assertError(function() { upto(1, 4, -2); }); + assertError(function() { upto(1, 4, Infinity); }); + assertError(function() { upto(1, 4, NaN); }); + }); }); - instanceMethod('downto', function(downto) { - - assertArrayEqual(downto(0, 0), [0]); - assertArrayEqual(downto(1, 0), [1,0]); - assertArrayEqual(downto(5, 0), [5,4,3,2,1,0]); - assertArrayEqual(downto(2, -2), [2,1,0,-1,-2]); - assertArrayEqual(downto(-2, 2), [2,1,0,-1,-2]); - - assertArrayEqual(downto(0.5, -0.5), [0.5,-0.5]); - assertArrayEqual(downto(0.5, -0.6), [0.5,-0.5]); - assertArrayEqual(downto(0.5, -0.4), [0.5]); - - // With collecting callback. - assertArrayEqual(downto(0, 1, 1, noop), [undefined, undefined]); - assertArrayEqual(downto(1, -1, 1, args), [[1,0],[0,1],[-1,2]]); - assertArrayEqual(downto(-1, 1, 1, args), [[1,0],[0,1],[-1,2]]); - - assertArrayEqual(downto(0, 6, 10), [6]); - assertArrayEqual(downto(5, 0, 2), [5,3,1]); - assertArrayEqual(downto(2, 0, 0.5), [2,1.5,1,0.5,0]); - - // Callback arguments - assertArrayEqual(downto(1,-1,1,args), [[1,0],[0,1],[-1,2]]); - - // Invalid input - assertError(function() { downto(null, 1); }); - assertError(function() { downto(1, null); }); - assertError(function() { downto(NaN, 1); }); - assertError(function() { downto(1, NaN); }); - assertError(function() { downto(-Infinity, 0); }); - assertError(function() { downto(0, Infinity); }); - - // Invalid step - assertError(function() { downto(1, 4, 0); }); - assertError(function() { downto(1, 4, 0, noop); }); - assertError(function() { downto(1, 4, -2); }); - assertError(function() { downto(1, 4, Infinity); }); - assertError(function() { downto(1, 4, NaN); }); + describeInstance('downto', function(downto) { + + it('should iterate over integers', function() { + assertArrayEqual(downto(0, 0), [0]); + assertArrayEqual(downto(1, 0), [1,0]); + assertArrayEqual(downto(5, 0), [5,4,3,2,1,0]); + assertArrayEqual(downto(2, -2), [2,1,0,-1,-2]); + assertArrayEqual(downto(-2, 2), [2,1,0,-1,-2]); + }); + + it('should iterate over fractions', function() { + assertArrayEqual(downto(0.5, -0.5), [0.5,-0.5]); + assertArrayEqual(downto(0.5, -0.6), [0.5,-0.5]); + assertArrayEqual(downto(0.5, -0.4), [0.5]); + }); + + it('should accept a mapping function', function() { + assertArrayEqual(downto(0, 1, 1, noop), [undefined, undefined]); + assertArrayEqual(downto(1, -1, 1, args), [[1,0],[0,1],[-1,2]]); + assertArrayEqual(downto(-1, 1, 1, args), [[1,0],[0,1],[-1,2]]); + }); + + + it('should allow a step argument', function() { + assertArrayEqual(downto(0, 6, 10), [6]); + assertArrayEqual(downto(5, 0, 2), [5,3,1]); + assertArrayEqual(downto(2, 0, 0.5), [2,1.5,1,0.5,0]); + }); + + it('should error on invalid input', function() { + assertError(function() { downto(null, 1); }); + assertError(function() { downto(1, null); }); + assertError(function() { downto(NaN, 1); }); + assertError(function() { downto(1, NaN); }); + assertError(function() { downto(-Infinity, 0); }); + assertError(function() { downto(0, Infinity); }); + }); + + it('should error on invalid step', function() { + assertError(function() { downto(1, 4, 0); }); + assertError(function() { downto(1, 4, 0, noop); }); + assertError(function() { downto(1, 4, -2); }); + assertError(function() { downto(1, 4, Infinity); }); + assertError(function() { downto(1, 4, NaN); }); + }); }); diff --git a/test/tests/regexp.js b/test/tests/regexp.js index 9c60a34ef..948009332 100644 --- a/test/tests/regexp.js +++ b/test/tests/regexp.js @@ -2,18 +2,22 @@ namespace('RegExp', function() { - staticMethod('escape', function(escape) { - assertEqual(escape('foo'), 'foo'); - assertEqual(escape('f|oo'), 'f\\|oo'); - assertEqual(escape('f(oo)'), 'f\\(oo\\)'); - assertEqual(escape('...'), '\\.\\.\\.'); - assertEqual(escape('?'), '\\?'); - assertEqual(escape('\\?'), '\\\\\\?'); - assertEqual(escape('-'), '\\-'); - assertEqual(escape('*.+[]{}()?|/\\-'), '\\*\\.\\+\\[\\]\\{\\}\\(\\)\\?\\|\\/\\\\\\-'); - assertEqual(escape(8.1), '8\\.1'); - assertEqual(escape(null), 'null'); - assertEqual(escape(NaN), 'NaN'); + describeStatic('escape', function(escape) { + + it('should escape regex tokens', function() { + assertEqual(escape('foo'), 'foo'); + assertEqual(escape('f|oo'), 'f\\|oo'); + assertEqual(escape('f(oo)'), 'f\\(oo\\)'); + assertEqual(escape('...'), '\\.\\.\\.'); + assertEqual(escape('?'), '\\?'); + assertEqual(escape('\\?'), '\\\\\\?'); + assertEqual(escape('-'), '\\-'); + assertEqual(escape('*.+[]{}()?|/\\-'), '\\*\\.\\+\\[\\]\\{\\}\\(\\)\\?\\|\\/\\\\\\-'); + assertEqual(escape(8.1), '8\\.1'); + assertEqual(escape(null), 'null'); + assertEqual(escape(NaN), 'NaN'); + }); + }); }); diff --git a/test/tests/string.js b/test/tests/string.js index 2ec92d68b..892121e87 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -4,90 +4,100 @@ namespace('String', function() { staticMethod('range', function(range) { - // toString - assertEqual(range('a', 'z').toString(), 'a..z'); - assertEqual(range('a', null).toString(), 'Invalid Range'); - - // isValid - assertTrue(range('a', 'z').isValid()); - assertTrue(range('z', 'a').isValid()); - assertTrue(range('a', 'a').isValid()); - assertTrue(range('🍺', '🎅').isValid()); - assertTrue(range(' ', ' ').isValid()); - assertFalse(range('a', null).isValid()); - assertFalse(range(null, 'a').isValid()); - assertFalse(range('a', '').isValid()); - assertFalse(range('', 'z').isValid()); - assertFalse(range('ab', 'yz').isValid()); - assertFalse(range('ab', 'z').isValid()); - assertFalse(range('a', 'yz').isValid()); - - // span - assertEqual(range('a', 'z').span(), 26); - assertEqual(range('z', 'a').span(), 26); - assertEqual(range('a', 'a').span(), 1); - assertNaN(range('', '').span()); - - // toArray - assertArrayEqual(range('a', 'd').toArray(), ['a','b','c','d']); - assertArrayEqual(range('d', 'a').toArray(), ['d','c','b','a']); - assertArrayEqual(range('', 'd').toArray(), []); - assertArrayEqual(range('d', '').toArray(), []); - - // clone - assertEqual(range('a','z').clone().toString(), 'a..z'); - - // clamp - assertEqual(range('c','d').clamp('z'), 'd'); - assertEqual(range('c','d').clamp('a'), 'c'); - assertEqual(range('d','c').clamp('z'), 'd'); - assertEqual(range('d','c').clamp('a'), 'c'); - - // contains - assertTrue(range('b', 'f').contains(range('b', 'd'))); - assertTrue(range('b', 'f').contains(range('b', 'b'))); - assertTrue(range('b', 'f').contains(range('f', 'f'))); - assertTrue(range('b', 'f').contains(range('f', 'e'))); - assertFalse(range('b', 'f').contains(range('g', 'h'))); - assertFalse(range('b', 'f').contains(range('a', 'b'))); - assertFalse(range('b', 'f').contains(range('a', 'c'))); - assertFalse(range('b', 'f').contains(range('c', 'a'))); - assertFalse(range('b', 'f').contains(range('d', 'g'))); - assertFalse(range('b', 'f').contains(range('g', 'd'))); - assertFalse(range('b', 'f').contains(range('a', 'g'))); - - // every - assertArrayEqual(range('a', 'd').every(1), ['a','b','c','d']); - assertArrayEqual(range('a', 'd').every(2), ['a','c']); - assertArrayEqual(range('a', 'd').every(2, concatA), ['aA','cA']); - assertArrayEqual(range('a', 'b').every(1, args), [['a',0], ['b',1]]); - - // intersect - assertEqual(range('b','d').intersect(range('c','g')).toString(), 'c..d'); - assertEqual(range('b','d').intersect(range('g','c')).toString(), 'c..d'); - assertEqual(range('b','d').intersect(range('a','c')).toString(), 'b..c'); - assertEqual(range('b','d').intersect(range('c','a')).toString(), 'b..c'); - assertEqual(range('d','b').intersect(range('c','g')).toString(), 'c..d'); - assertEqual(range('d','b').intersect(range('g','c')).toString(), 'c..d'); - assertEqual(range('d','b').intersect(range('a','c')).toString(), 'b..c'); - assertEqual(range('d','b').intersect(range('c','a')).toString(), 'b..c'); - - assertEqual(range('a','c').intersect(range('d','f')).toString(), 'Invalid Range'); - assertEqual(range('a','c').intersect(range('','')).toString(), 'Invalid Range'); - assertEqual(range('','').intersect(range('d','f')).toString(), 'Invalid Range'); - - // union - assertEqual(range('b','d').union(range('c','f')).toString(), 'b..f'); - assertEqual(range('b','d').union(range('f','c')).toString(), 'b..f'); - assertEqual(range('b','d').union(range('a','c')).toString(), 'a..d'); - assertEqual(range('b','d').union(range('c','a')).toString(), 'a..d'); - assertEqual(range('d','b').union(range('c','f')).toString(), 'b..f'); - assertEqual(range('d','b').union(range('f','c')).toString(), 'b..f'); - assertEqual(range('d','b').union(range('a','c')).toString(), 'a..d'); - assertEqual(range('d','b').union(range('c','a')).toString(), 'a..d'); - - assertEqual(range('a','c').union(range('','')).toString(), 'Invalid Range'); - assertEqual(range('','').union(range('a','c')).toString(), 'Invalid Range'); + it('#toString', function() { + assertEqual(range('a', 'z').toString(), 'a..z'); + assertEqual(range('a', null).toString(), 'Invalid Range'); + }); + + it('#isValid', function() { + assertTrue(range('a', 'z').isValid()); + assertTrue(range('z', 'a').isValid()); + assertTrue(range('a', 'a').isValid()); + assertTrue(range('🍺', '🎅').isValid()); + assertTrue(range(' ', ' ').isValid()); + assertFalse(range('a', null).isValid()); + assertFalse(range(null, 'a').isValid()); + assertFalse(range('a', '').isValid()); + assertFalse(range('', 'z').isValid()); + assertFalse(range('ab', 'yz').isValid()); + assertFalse(range('ab', 'z').isValid()); + assertFalse(range('a', 'yz').isValid()); + }); + + it('#span', function() { + assertEqual(range('a', 'z').span(), 26); + assertEqual(range('z', 'a').span(), 26); + assertEqual(range('a', 'a').span(), 1); + assertNaN(range('', '').span()); + }); + + it('#toArray', function() { + assertArrayEqual(range('a', 'd').toArray(), ['a','b','c','d']); + assertArrayEqual(range('d', 'a').toArray(), ['d','c','b','a']); + assertArrayEqual(range('', 'd').toArray(), []); + assertArrayEqual(range('d', '').toArray(), []); + }); + + it('#clone', function() { + assertEqual(range('a','z').clone().toString(), 'a..z'); + }); + + it('#clamp', function() { + assertEqual(range('c','d').clamp('z'), 'd'); + assertEqual(range('c','d').clamp('a'), 'c'); + assertEqual(range('d','c').clamp('z'), 'd'); + assertEqual(range('d','c').clamp('a'), 'c'); + }); + + it('#contains', function() { + assertTrue(range('b', 'f').contains(range('b', 'd'))); + assertTrue(range('b', 'f').contains(range('b', 'b'))); + assertTrue(range('b', 'f').contains(range('f', 'f'))); + assertTrue(range('b', 'f').contains(range('f', 'e'))); + assertFalse(range('b', 'f').contains(range('g', 'h'))); + assertFalse(range('b', 'f').contains(range('a', 'b'))); + assertFalse(range('b', 'f').contains(range('a', 'c'))); + assertFalse(range('b', 'f').contains(range('c', 'a'))); + assertFalse(range('b', 'f').contains(range('d', 'g'))); + assertFalse(range('b', 'f').contains(range('g', 'd'))); + assertFalse(range('b', 'f').contains(range('a', 'g'))); + }); + + it('#every', function() { + assertArrayEqual(range('a', 'd').every(1), ['a','b','c','d']); + assertArrayEqual(range('a', 'd').every(2), ['a','c']); + assertArrayEqual(range('a', 'd').every(2, concatA), ['aA','cA']); + assertArrayEqual(range('a', 'b').every(1, args), [['a',0], ['b',1]]); + }); + + it('#intersect', function() { + assertEqual(range('b','d').intersect(range('c','g')).toString(), 'c..d'); + assertEqual(range('b','d').intersect(range('g','c')).toString(), 'c..d'); + assertEqual(range('b','d').intersect(range('a','c')).toString(), 'b..c'); + assertEqual(range('b','d').intersect(range('c','a')).toString(), 'b..c'); + assertEqual(range('d','b').intersect(range('c','g')).toString(), 'c..d'); + assertEqual(range('d','b').intersect(range('g','c')).toString(), 'c..d'); + assertEqual(range('d','b').intersect(range('a','c')).toString(), 'b..c'); + assertEqual(range('d','b').intersect(range('c','a')).toString(), 'b..c'); + + assertEqual(range('a','c').intersect(range('d','f')).toString(), 'Invalid Range'); + assertEqual(range('a','c').intersect(range('','')).toString(), 'Invalid Range'); + assertEqual(range('','').intersect(range('d','f')).toString(), 'Invalid Range'); + }); + + it('#union', function() { + assertEqual(range('b','d').union(range('c','f')).toString(), 'b..f'); + assertEqual(range('b','d').union(range('f','c')).toString(), 'b..f'); + assertEqual(range('b','d').union(range('a','c')).toString(), 'a..d'); + assertEqual(range('b','d').union(range('c','a')).toString(), 'a..d'); + assertEqual(range('d','b').union(range('c','f')).toString(), 'b..f'); + assertEqual(range('d','b').union(range('f','c')).toString(), 'b..f'); + assertEqual(range('d','b').union(range('a','c')).toString(), 'a..d'); + assertEqual(range('d','b').union(range('c','a')).toString(), 'a..d'); + + assertEqual(range('a','c').union(range('','')).toString(), 'Invalid Range'); + assertEqual(range('','').union(range('a','c')).toString(), 'Invalid Range'); + }); }); From 352b2f2d1247f70b48900113be8498fa76160534 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 6 Oct 2019 09:11:04 +0900 Subject: [PATCH 023/191] Refactored dependencies and moved babel config into .babelrc --- .babelrc | 8 + .browserslistrc | 4 + package.json | 55 +- webpack.config.js | 24 +- yarn.lock | 4014 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 4038 insertions(+), 67 deletions(-) create mode 100644 .babelrc create mode 100644 .browserslistrc create mode 100644 yarn.lock diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..8f692ffaf --- /dev/null +++ b/.babelrc @@ -0,0 +1,8 @@ +{ + "presets": [ + '@babel/preset-env' + ], + "plugins": [ + '@babel/plugin-transform-runtime' + ] +} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 000000000..10ccdf809 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +not dead +last 2 versions +ie >= 9 diff --git a/package.json b/package.json index 25959b0b1..779c396d9 100644 --- a/package.json +++ b/package.json @@ -29,54 +29,21 @@ }, "scripts": { "build": "webpack", - "test": "node -r esm ./node_modules/.bin/ready-test test/index.js", + "test": "node ./node_modules/.bin/ready-test test/index.js", "coverage": "istanbul cover --report=lcovonly ready-test test/index.js", "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" }, "typings": "sugar.d.ts", "devDependencies": { - "@babel/core": "^7.2.0", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-runtime": "^7.2.0", - "@babel/polyfill": "^7.0.0", - "@babel/preset-env": "^7.2.0", - "acorn": "^2.7.0", - "babel-loader": "^8.0.4", - "babel-plugin-transform-es3-member-expression-literals": "^6.22.0", - "babel-plugin-transform-es3-property-literals": "^6.22.0", - "closure-compiler-stream": "^0.1.15", - "coveralls": "^2.11.15", - "es3ify-loader": "^0.2.0", - "es5-shim": "^4.5.12", - "es6-shim": "^0.35.4", - "glob": "^5.0.14", - "google-closure-compiler": "^20180716.0.1", - "gulp": "^3.9.0", - "gulp-file": "^0.3.0", - "gulp-util": "^3.0.6", - "istanbul": "^0.4.5", - "jsdoc": "^3.5.5", - "merge-stream": "^0.1.8", - "mkdirp": "^0.5.1", - "promise-polyfill": "^8.1.0", - "ready-test": "^1.0.25", - "rimraf": "^2.4.4", - "sinon": "^1.15.4", - "string-replace-loader": "^2.1.1", - "through2": "^2.0.0", - "webpack": "^4.27.1", - "webpack-cli": "^3.1.2", - "yargs": "^3.15.0" - }, - "dependencies": { - "@babel/cli": "^7.2.0", - "@babel/runtime": "^7.2.0", - "@babel/runtime-corejs2": "^7.2.0", - "babel-eslint": "^10.0.1", - "babel-plugin-add-module-exports": "^1.0.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "depcheck": "^0.6.11", - "lodash": "^4.17.11", - "remove-defineproperty-webpack-plugin": "0.0.3" + "@babel/core": "^7.6.2", + "@babel/plugin-transform-runtime": "^7.6.2", + "@babel/preset-env": "^7.6.2", + "@babel/runtime": "^7.6.2", + "babel-loader": "^8.0.6", + "ready-test": "^1.0.26", + "sinon": "^7.5.0", + "string-replace-loader": "^2.2.0", + "webpack": "^4.41.0", + "webpack-cli": "^3.3.9" } } diff --git a/webpack.config.js b/webpack.config.js index 41210b515..fbf57d9e5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,3 @@ - const path = require('path'); const VERSION = require('./package.json').version; @@ -20,28 +19,7 @@ module.exports = { { test: /\.js$/, exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - presets: [ - [ - '@babel/preset-env', - { - useBuiltIns: 'usage', - targets: [ - '> 1%', - 'not dead', - 'last 2 versions', - 'ie >= 9', - ] - } - ], - ], - plugins: [ - '@babel/plugin-transform-runtime' - ] - } - } + loader: 'babel-loader' }, { test: path.resolve(__dirname, './src/core/index.js'), diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..241522eae --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4014 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91" + integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.2" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.2" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" + integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== + dependencies: + "@babel/types" "^7.6.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== + dependencies: + "@babel/types" "^7.5.5" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" + integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.5.5" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== + dependencies: + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.6.0", "@babel/parser@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" + integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" + integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" + integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" + integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.5.5" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" + integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz#c1ca0bb84b94f385ca302c3932e870b0fb0e522b" + integrity sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g== + dependencies: + regexpu-core "^4.6.0" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-runtime@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8" + integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" + integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" + integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/preset-env@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.2.tgz#abbb3ed785c7fe4220d4c82a53621d71fc0c75d3" + integrity sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.5.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.6.2" + "@babel/plugin-transform-classes" "^7.5.5" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-dotall-regex" "^7.6.2" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.2" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.5.5" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.6.2" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.6.2" + "@babel/types" "^7.6.0" + browserslist "^4.6.0" + core-js-compat "^3.1.1" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/runtime@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" + integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" + integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.2" + "@babel/types" "^7.6.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" + integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.2.1": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" + integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== + dependencies: + "@sinonjs/commons" "^1.3.0" + array-from "^2.1.1" + lodash "^4.17.15" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" + integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argv@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" + integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-loader@^8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bluebird@^3.5.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" + integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.6.0, browserslist@^4.6.6: + version "4.7.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" + integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== + dependencies: + caniuse-lite "^1.0.30000989" + electron-to-chromium "^1.3.247" + node-releases "^1.1.29" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30000989: + version "1.0.30000998" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744" + integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.1.tgz#4634772a1924512d990d4505957bf3a510611387" + integrity sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.1.3" + optionalDependencies: + fsevents "~2.1.0" + +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.20.0: + version "2.20.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" + integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" + integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== + dependencies: + browserslist "^4.6.6" + semver "^6.3.0" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +electron-to-chromium@^1.3.247: + version "1.3.275" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.275.tgz#19a38436e34216f51820fa2f4326d5ce141fa36f" + integrity sha512-/YWtW/VapMnuYA1lNOaa1F4GhR1LBf+CUTp60lzDPEEh0XOzyOAyULyYZVF9vziZ3qSbTqCwmKwsyRXp66STbw== + +elliptic@^6.0.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" + integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +fsevents@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.0.tgz#ce1a5f9ac71c6d75278b0c5bd236d7dfece4cbaa" + integrity sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" + integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== + dependencies: + minimatch "^3.0.4" + +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash@^4.17.13, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lolex@^4.1.0, lolex@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" + integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" + integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== + dependencies: + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^4.1.0" + path-to-regexp "^1.7.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.29: + version "1.1.34" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.34.tgz#ced4655ee1ba9c3a2c5dcbac385e19434155fd40" + integrity sha512-fNn12JTEfniTuCqo0r9jXgl44+KxRH/huV7zM/KAGOKxDKrHr6EbT7SSs4B+DNxyBE2mks28AD+Jw6PkfY5uwA== + dependencies: + semver "^6.3.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.3.tgz#d6e011ed5b9240a92f08651eeb40f7942ceb6cc1" + integrity sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q== + dependencies: + picomatch "^2.0.4" + +ready-test@^1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.26.tgz#7a77731481cc792874be0ded62f2b4aed2597784" + integrity sha512-DeaXn1x0MkN8wO5Dle35QUrmJq1MNCzLfFYdd07efiF3lJLzAkCRAiLSYSCkU4z88Lu0blZUMmdpynRJNNSvWQ== + dependencies: + argv "^0.0.2" + chalk "^2.4.2" + chokidar "^3.2.1" + esm "^3.2.25" + glob "^7.1.4" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.3.2, resolve@^1.8.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +serialize-javascript@^1.7.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sinon@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" + integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== + dependencies: + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.3" + diff "^3.5.0" + lolex "^4.2.0" + nise "^1.5.2" + supports-color "^5.5.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +string-replace-loader@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.2.0.tgz#0a0e6543fcec783d85c353a3e96a23872d45a94f" + integrity sha512-Ukt4ZC8+xVWdBRut3/iwnPJCNL1yV8AbVKXn8UcWdYrHgtuW4UDDAbBSi/J/CQDEWQBt824AJvPYahF23eJLRg== + dependencies: + loader-utils "^1.2.3" + schema-utils "^1.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +terser-webpack-plugin@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" + integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^1.7.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.7.tgz#9dafb4a6730868608c9c7af96d44182f4107b29f" + integrity sha512-rJFxzWIzJdgiOwYIPJHu6L3hDegEYJj2cHuKcngMraUfhMXGDEbok9Tqjw7yxzrU4IagvG74uTEKdiqeG6T7bg== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +vm-browserify@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webpack-cli@^3.3.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a" + integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b" + integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.1" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" From 918d15a522edf3966a2cf987b5630dbd36214a22 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 6 Oct 2019 12:31:57 +0900 Subject: [PATCH 024/191] refactored exports structure and test suite helpers --- package.json | 2 +- src/all.js | 7 --- src/array/index.js | 1 + src/core/array.js | 8 ++- src/core/function.js | 8 ++- src/core/index.js | 9 ++-- src/core/number.js | 8 ++- src/core/object.js | 11 ++-- src/core/regexp.js | 8 ++- src/core/string.js | 8 ++- src/function/all.js | 5 -- .../{debounce/index.js => debounce.js} | 0 src/function/debounce/define.js | 4 -- src/function/define.js | 5 ++ src/function/index.js | 6 +-- src/function/{memoize/index.js => memoize.js} | 0 src/function/memoize/define.js | 4 -- src/function/methods.js | 2 + src/index.js | 16 +++--- src/number/{abbr/index.js => abbr.js} | 10 ++-- src/number/abbr/define.js | 3 -- src/number/{abs/index.js => abs.js} | 0 src/number/abs/define.js | 3 -- src/number/all.js | 31 ------------ src/number/ceil.js | 1 + src/number/ceil/define.js | 3 -- src/number/ceil/index.js | 1 - src/number/clamp.js | 1 + src/number/clamp/define.js | 3 -- src/number/clamp/index.js | 1 - src/number/define.js | 32 ++++++++++++ src/number/{downto/index.js => downto.js} | 2 +- src/number/downto/define.js | 3 -- src/number/{exp/index.js => exp.js} | 0 src/number/exp/define.js | 3 -- src/number/floor.js | 1 + src/number/floor/define.js | 3 -- src/number/floor/index.js | 1 - src/number/format.js | 1 + src/number/format/define.js | 3 -- src/number/format/index.js | 1 - src/number/index.js | 32 +----------- src/number/{isEven/index.js => isEven.js} | 2 +- src/number/isEven/define.js | 3 -- src/number/{isFinite/index.js => isFinite.js} | 0 src/number/isFinite/define.js | 3 -- .../{isInteger/index.js => isInteger.js} | 0 src/number/isInteger/define.js | 3 -- src/number/isMultipleOf.js | 1 + src/number/isMultipleOf/define.js | 3 -- src/number/isMultipleOf/index.js | 1 - src/number/{isNaN/index.js => isNaN.js} | 0 src/number/isNaN/define.js | 3 -- src/number/{isOdd/index.js => isOdd.js} | 2 +- src/number/isOdd/define.js | 3 -- .../index.js => isSafeInteger.js} | 0 src/number/isSafeInteger/define.js | 3 -- src/number/{log/index.js => log.js} | 0 src/number/log/define.js | 3 -- src/number/methods.js | 28 +++++++++++ src/number/pad.js | 1 + src/number/pad/define.js | 3 -- src/number/pad/index.js | 1 - src/number/{pow/index.js => pow.js} | 0 src/number/pow/define.js | 3 -- src/number/{random/index.js => random.js} | 0 src/number/random/define.js | 3 -- src/number/{range/index.js => range.js} | 2 +- src/number/range/define.js | 3 -- src/number/round.js | 1 + src/number/round/define.js | 3 -- src/number/round/index.js | 1 - src/number/{sqrt/index.js => sqrt.js} | 0 src/number/sqrt/define.js | 3 -- src/number/{times/index.js => times.js} | 2 +- src/number/times/define.js | 3 -- src/number/{toChar/index.js => toChar.js} | 0 src/number/toChar/define.js | 3 -- src/number/{toHex/index.js => toHex.js} | 2 +- src/number/toHex/define.js | 3 -- src/number/toOrdinal.js | 1 + src/number/toOrdinal/define.js | 3 -- src/number/toOrdinal/index.js | 1 - src/number/trunc.js | 1 + src/number/trunc/define.js | 3 -- src/number/trunc/index.js | 1 - src/number/{upto/index.js => upto.js} | 2 +- src/number/upto/define.js | 3 -- src/object/index.js | 1 + src/regexp/all.js | 4 -- src/regexp/define.js | 4 ++ .../{util/escapeRegExp.js => escape.js} | 2 +- src/regexp/escape/define.js | 3 -- src/regexp/escape/index.js | 1 - src/regexp/index.js | 5 +- src/regexp/methods.js | 1 + src/string/all.js | 4 -- src/string/define.js | 4 ++ src/string/index.js | 5 +- src/string/methods.js | 1 + src/string/{range/index.js => range.js} | 4 +- src/string/range/define.js | 3 -- test/index.js | 2 +- test/tests/modules/customized.js | 10 ++-- test/tests/modules/index.js | 10 +--- .../modules/{sugar-entry.js => main-entry.js} | 19 ++++--- test/tests/modules/method-define.js | 15 ------ test/tests/modules/method-entry.js | 8 +-- test/tests/modules/namespace-all.js | 27 ---------- test/tests/modules/namespace-entry.js | 21 ++++---- test/tests/modules/plugin.js | 17 ++++--- test/tests/modules/sugar-all.js | 26 ---------- test/tests/number.js | 50 +++++++++---------- test/tests/string.js | 2 +- webpack.config.js | 4 +- yarn.lock | 8 +-- 116 files changed, 223 insertions(+), 399 deletions(-) delete mode 100644 src/all.js delete mode 100644 src/function/all.js rename src/function/{debounce/index.js => debounce.js} (100%) delete mode 100644 src/function/debounce/define.js create mode 100644 src/function/define.js rename src/function/{memoize/index.js => memoize.js} (100%) delete mode 100644 src/function/memoize/define.js create mode 100644 src/function/methods.js rename src/number/{abbr/index.js => abbr.js} (94%) delete mode 100644 src/number/abbr/define.js rename src/number/{abs/index.js => abs.js} (100%) delete mode 100644 src/number/abs/define.js delete mode 100644 src/number/all.js create mode 100644 src/number/ceil.js delete mode 100644 src/number/ceil/define.js delete mode 100644 src/number/ceil/index.js create mode 100644 src/number/clamp.js delete mode 100644 src/number/clamp/define.js delete mode 100644 src/number/clamp/index.js create mode 100644 src/number/define.js rename src/number/{downto/index.js => downto.js} (78%) delete mode 100644 src/number/downto/define.js rename src/number/{exp/index.js => exp.js} (100%) delete mode 100644 src/number/exp/define.js create mode 100644 src/number/floor.js delete mode 100644 src/number/floor/define.js delete mode 100644 src/number/floor/index.js create mode 100644 src/number/format.js delete mode 100644 src/number/format/define.js delete mode 100644 src/number/format/index.js rename src/number/{isEven/index.js => isEven.js} (65%) delete mode 100644 src/number/isEven/define.js rename src/number/{isFinite/index.js => isFinite.js} (100%) delete mode 100644 src/number/isFinite/define.js rename src/number/{isInteger/index.js => isInteger.js} (100%) delete mode 100644 src/number/isInteger/define.js create mode 100644 src/number/isMultipleOf.js delete mode 100644 src/number/isMultipleOf/define.js delete mode 100644 src/number/isMultipleOf/index.js rename src/number/{isNaN/index.js => isNaN.js} (100%) delete mode 100644 src/number/isNaN/define.js rename src/number/{isOdd/index.js => isOdd.js} (65%) delete mode 100644 src/number/isOdd/define.js rename src/number/{isSafeInteger/index.js => isSafeInteger.js} (100%) delete mode 100644 src/number/isSafeInteger/define.js rename src/number/{log/index.js => log.js} (100%) delete mode 100644 src/number/log/define.js create mode 100644 src/number/methods.js create mode 100644 src/number/pad.js delete mode 100644 src/number/pad/define.js delete mode 100644 src/number/pad/index.js rename src/number/{pow/index.js => pow.js} (100%) delete mode 100644 src/number/pow/define.js rename src/number/{random/index.js => random.js} (100%) delete mode 100644 src/number/random/define.js rename src/number/{range/index.js => range.js} (75%) delete mode 100644 src/number/range/define.js create mode 100644 src/number/round.js delete mode 100644 src/number/round/define.js delete mode 100644 src/number/round/index.js rename src/number/{sqrt/index.js => sqrt.js} (100%) delete mode 100644 src/number/sqrt/define.js rename src/number/{times/index.js => times.js} (72%) delete mode 100644 src/number/times/define.js rename src/number/{toChar/index.js => toChar.js} (100%) delete mode 100644 src/number/toChar/define.js rename src/number/{toHex/index.js => toHex.js} (73%) delete mode 100644 src/number/toHex/define.js create mode 100644 src/number/toOrdinal.js delete mode 100644 src/number/toOrdinal/define.js delete mode 100644 src/number/toOrdinal/index.js create mode 100644 src/number/trunc.js delete mode 100644 src/number/trunc/define.js delete mode 100644 src/number/trunc/index.js rename src/number/{upto/index.js => upto.js} (78%) delete mode 100644 src/number/upto/define.js delete mode 100644 src/regexp/all.js create mode 100644 src/regexp/define.js rename src/regexp/{util/escapeRegExp.js => escape.js} (77%) delete mode 100644 src/regexp/escape/define.js delete mode 100644 src/regexp/escape/index.js create mode 100644 src/regexp/methods.js delete mode 100644 src/string/all.js create mode 100644 src/string/define.js create mode 100644 src/string/methods.js rename src/string/{range/index.js => range.js} (85%) delete mode 100644 src/string/range/define.js rename test/tests/modules/{sugar-entry.js => main-entry.js} (53%) delete mode 100644 test/tests/modules/method-define.js delete mode 100644 test/tests/modules/namespace-all.js delete mode 100644 test/tests/modules/sugar-all.js diff --git a/package.json b/package.json index 779c396d9..0e680deb0 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@babel/preset-env": "^7.6.2", "@babel/runtime": "^7.6.2", "babel-loader": "^8.0.6", - "ready-test": "^1.0.26", + "ready-test": "^1.0.28", "sinon": "^7.5.0", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/all.js b/src/all.js deleted file mode 100644 index 1cd31161b..000000000 --- a/src/all.js +++ /dev/null @@ -1,7 +0,0 @@ -import './number/all'; -import './string/all'; -import './regexp/all'; -import './function/all'; - -export * from './'; -export { default } from './'; diff --git a/src/array/index.js b/src/array/index.js index e69de29bb..099e8c6c8 100644 --- a/src/array/index.js +++ b/src/array/index.js @@ -0,0 +1 @@ +export * from '../core/array'; diff --git a/src/core/array.js b/src/core/array.js index 71d5685c9..85bf9b270 100644 --- a/src/core/array.js +++ b/src/core/array.js @@ -1,12 +1,10 @@ -import Sugar, { createNamespace } from '../core'; +import { createNamespace } from '../core'; -createNamespace('Array'); +export const Array = createNamespace('Array'); export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = Sugar.Array; - -export default Sugar.Array; +} = Array; diff --git a/src/core/function.js b/src/core/function.js index a7089bcc9..e286fb9b6 100644 --- a/src/core/function.js +++ b/src/core/function.js @@ -1,12 +1,10 @@ -import Sugar, { createNamespace } from '../core'; +import { createNamespace } from '../core'; -createNamespace('Function'); +export const Function = createNamespace('Function'); export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = Sugar.Function; - -export default Sugar.Function; +} = Function; diff --git a/src/core/index.js b/src/core/index.js index 17fd5897b..9667a3405 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -9,7 +9,6 @@ import { isString, isFunction } from '../util/typeChecks'; export const VERSION = 'edge'; - // --- Setup export function createNamespace(globalName) { @@ -49,6 +48,8 @@ export function createNamespace(globalName) { mapNativeToChainable(globalName, SugarChainable); Sugar[globalName] = SugarChainable; + + return SugarChainable; } @@ -271,13 +272,11 @@ function nativeMethodProhibitedOnChainable(methodName) { || methodName === '__proto__'; } -// --- Default exports +// --- Main Export -const Sugar = { +export const Sugar = { VERSION, extend, restore, createNamespace }; - -export default Sugar; diff --git a/src/core/number.js b/src/core/number.js index 31d6fc460..da3df67d3 100644 --- a/src/core/number.js +++ b/src/core/number.js @@ -1,12 +1,10 @@ -import Sugar, { createNamespace } from '../core'; +import { createNamespace } from '../core'; -createNamespace('Number'); +export const Number = createNamespace('Number') export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = Sugar.Number; - -export default Sugar.Number; +} = Number; diff --git a/src/core/object.js b/src/core/object.js index a7256039e..c1fb02dca 100644 --- a/src/core/object.js +++ b/src/core/object.js @@ -1,12 +1,15 @@ -import Sugar, { createNamespace } from '../core'; +import { createNamespace } from '../core'; -createNamespace('Object'); +// Webpack has an issue with calling Object() +// on exported modules, creating a conflict +// here, so need to rename. +const Namespace = createNamespace('Object'); export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = Sugar.Object; +} = Namespace; -export default Sugar.Object; +export { Namespace as Object } diff --git a/src/core/regexp.js b/src/core/regexp.js index 21ed5cff2..a519a691c 100644 --- a/src/core/regexp.js +++ b/src/core/regexp.js @@ -1,12 +1,10 @@ -import Sugar, { createNamespace } from '../core'; +import { createNamespace } from '../core'; -createNamespace('RegExp'); +export const RegExp = createNamespace('RegExp'); export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = Sugar.RegExp; - -export default Sugar.RegExp; +} = RegExp; diff --git a/src/core/string.js b/src/core/string.js index d028216bd..788786de6 100644 --- a/src/core/string.js +++ b/src/core/string.js @@ -1,12 +1,10 @@ -import Sugar, { createNamespace } from '../core'; +import { createNamespace } from '../core'; -createNamespace('String'); +export const String = createNamespace('String'); export const { defineStatic, defineInstance, defineStaticAlias, defineInstanceAlias, -} = Sugar.String; - -export default Sugar.String; +} = String; diff --git a/src/function/all.js b/src/function/all.js deleted file mode 100644 index 0f9d0609e..000000000 --- a/src/function/all.js +++ /dev/null @@ -1,5 +0,0 @@ -import './memoize/define'; -import './debounce/define'; - -export * from '../core/function'; -export { default } from '../core/function'; diff --git a/src/function/debounce/index.js b/src/function/debounce.js similarity index 100% rename from src/function/debounce/index.js rename to src/function/debounce.js diff --git a/src/function/debounce/define.js b/src/function/debounce/define.js deleted file mode 100644 index f41bd4b3e..000000000 --- a/src/function/debounce/define.js +++ /dev/null @@ -1,4 +0,0 @@ -import { defineInstance } from '../../core/function'; -import debounce from './'; - -defineInstance('debounce', debounce); diff --git a/src/function/define.js b/src/function/define.js new file mode 100644 index 000000000..f03ca4d11 --- /dev/null +++ b/src/function/define.js @@ -0,0 +1,5 @@ +import { defineInstance } from '../core/function'; +import * as methods from './methods'; + +defineInstance('memoize', methods.memoize); +defineInstance('debounce', methods.debounce); diff --git a/src/function/index.js b/src/function/index.js index 2f7c50686..bee03b76a 100644 --- a/src/function/index.js +++ b/src/function/index.js @@ -1,5 +1,3 @@ -export { default as memoize } from './memoize'; -export { default as debounce } from './debounce'; - export * from '../core/function'; -export { default } from '../core/function'; +export * from './methods'; +import './define'; diff --git a/src/function/memoize/index.js b/src/function/memoize.js similarity index 100% rename from src/function/memoize/index.js rename to src/function/memoize.js diff --git a/src/function/memoize/define.js b/src/function/memoize/define.js deleted file mode 100644 index 64bdcbdcb..000000000 --- a/src/function/memoize/define.js +++ /dev/null @@ -1,4 +0,0 @@ -import { defineInstance } from '../../core/function'; -import memoize from './'; - -defineInstance('memoize', memoize); diff --git a/src/function/methods.js b/src/function/methods.js new file mode 100644 index 000000000..d1174d003 --- /dev/null +++ b/src/function/methods.js @@ -0,0 +1,2 @@ +export { default as memoize } from './memoize'; +export { default as debounce } from './debounce'; diff --git a/src/index.js b/src/index.js index 3c924ecdc..489e526ae 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ -export { default as Array } from './core/array'; -export { default as String } from './core/string'; -export { default as Number } from './core/number'; -export { default as Object } from './core/object'; -export { default as RegExp } from './core/regexp'; -export { default as Function } from './core/function'; - export * from './core'; -export { default } from './core'; + +export { Array } from './array'; +export { String } from './string'; +export { Number } from './number'; +export { Object } from './object'; +export { RegExp } from './regexp'; +export { Function } from './function'; + diff --git a/src/number/abbr/index.js b/src/number/abbr.js similarity index 94% rename from src/number/abbr/index.js rename to src/number/abbr.js index ef1d0188b..1cd7609bb 100644 --- a/src/number/abbr/index.js +++ b/src/number/abbr.js @@ -1,8 +1,8 @@ -import { assertFinite } from '../../util/assertions'; -import { trunc, round } from './../util/math'; -import { isNumber } from '../../util/typeChecks'; -import format from './../util/format'; -import clamp from './../util/clamp'; +import { assertFinite } from '../util/assertions'; +import { trunc, round } from './util/math'; +import { isNumber } from '../util/typeChecks'; +import format from './util/format'; +import clamp from './util/clamp'; /** * @typedef {"integer"|"common"|"metric"|"binary"} UnitAlias diff --git a/src/number/abbr/define.js b/src/number/abbr/define.js deleted file mode 100644 index a48679bf2..000000000 --- a/src/number/abbr/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import abbr from './'; -defineInstance('abbr', abbr); diff --git a/src/number/abs/index.js b/src/number/abs.js similarity index 100% rename from src/number/abs/index.js rename to src/number/abs.js diff --git a/src/number/abs/define.js b/src/number/abs/define.js deleted file mode 100644 index 1d44ba662..000000000 --- a/src/number/abs/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import abs from './'; -defineInstance('abs', abs); diff --git a/src/number/all.js b/src/number/all.js deleted file mode 100644 index 1f924ad46..000000000 --- a/src/number/all.js +++ /dev/null @@ -1,31 +0,0 @@ -import './abbr/define'; -import './abs/define'; -import './ceil/define'; -import './clamp/define'; -import './downto/define'; -import './exp/define'; -import './floor/define'; -import './format/define'; -import './isEven/define'; -import './isFinite/define'; -import './isInteger/define'; -import './isMultipleOf/define'; -import './isNaN/define'; -import './isOdd/define'; -import './isSafeInteger/define'; -import './log/define'; -import './pad/define'; -import './pow/define'; -import './random/define'; -import './range/define'; -import './round/define'; -import './sqrt/define'; -import './times/define'; -import './toChar/define'; -import './toHex/define'; -import './toOrdinal/define'; -import './trunc/define'; -import './upto/define'; - -export * from '../core/number'; -export { default } from '../core/number'; diff --git a/src/number/ceil.js b/src/number/ceil.js new file mode 100644 index 000000000..9a0b3add5 --- /dev/null +++ b/src/number/ceil.js @@ -0,0 +1 @@ +export { ceil as default } from './util/math'; diff --git a/src/number/ceil/define.js b/src/number/ceil/define.js deleted file mode 100644 index f4706d62e..000000000 --- a/src/number/ceil/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import ceil from './'; -defineInstance('ceil', ceil); diff --git a/src/number/ceil/index.js b/src/number/ceil/index.js deleted file mode 100644 index 8997a2059..000000000 --- a/src/number/ceil/index.js +++ /dev/null @@ -1 +0,0 @@ -export { ceil as default } from '../util/math'; diff --git a/src/number/clamp.js b/src/number/clamp.js new file mode 100644 index 000000000..23391d8b8 --- /dev/null +++ b/src/number/clamp.js @@ -0,0 +1 @@ +export { default } from './util/clamp'; diff --git a/src/number/clamp/define.js b/src/number/clamp/define.js deleted file mode 100644 index 69ba9cfe2..000000000 --- a/src/number/clamp/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import clamp from './'; -defineInstance('clamp', clamp); diff --git a/src/number/clamp/index.js b/src/number/clamp/index.js deleted file mode 100644 index 2f3a8c215..000000000 --- a/src/number/clamp/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from '../util/clamp'; diff --git a/src/number/define.js b/src/number/define.js new file mode 100644 index 000000000..987199cc2 --- /dev/null +++ b/src/number/define.js @@ -0,0 +1,32 @@ +import { defineStatic, defineInstance } from '../core/number'; +import * as methods from './methods'; + +defineStatic('range', methods.range); +defineStatic('random', methods.random); + +defineInstance('abbr', methods.abbr); +defineInstance('abs', methods.abs); +defineInstance('ceil', methods.ceil); +defineInstance('clamp', methods.clamp); +defineInstance('downto', methods.downto); +defineInstance('exp', methods.exp); +defineInstance('floor', methods.floor); +defineInstance('format', methods.format); +defineInstance('isEven', methods.isEven); +defineInstance('isFinite', methods.isFinite); +defineInstance('isInteger', methods.isInteger); +defineInstance('isMultipleOf', methods.isMultipleOf); +defineInstance('isNaN', methods.isNaN); +defineInstance('isOdd', methods.isOdd); +defineInstance('isSafeInteger', methods.isSafeInteger); +defineInstance('log', methods.log); +defineInstance('pad', methods.pad); +defineInstance('pow', methods.pow); +defineInstance('round', methods.round); +defineInstance('sqrt', methods.sqrt); +defineInstance('times', methods.times); +defineInstance('toChar', methods.toChar); +defineInstance('toHex', methods.toHex); +defineInstance('toOrdinal', methods.toOrdinal); +defineInstance('trunc', methods.trunc); +defineInstance('upto', methods.upto); diff --git a/src/number/downto/index.js b/src/number/downto.js similarity index 78% rename from src/number/downto/index.js rename to src/number/downto.js index 3f2452fe0..9ac2cd31c 100644 --- a/src/number/downto/index.js +++ b/src/number/downto.js @@ -1,4 +1,4 @@ -import step from '../util/step'; +import step from './util/step'; export default function(n1, n2, ...args) { if (n1 < n2) { diff --git a/src/number/downto/define.js b/src/number/downto/define.js deleted file mode 100644 index 09d73a169..000000000 --- a/src/number/downto/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import downto from './'; -defineInstance('downto', downto); diff --git a/src/number/exp/index.js b/src/number/exp.js similarity index 100% rename from src/number/exp/index.js rename to src/number/exp.js diff --git a/src/number/exp/define.js b/src/number/exp/define.js deleted file mode 100644 index 216cc113a..000000000 --- a/src/number/exp/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import exp from './'; -defineInstance('exp', exp); diff --git a/src/number/floor.js b/src/number/floor.js new file mode 100644 index 000000000..0677ed40d --- /dev/null +++ b/src/number/floor.js @@ -0,0 +1 @@ +export { floor as default } from './util/math'; diff --git a/src/number/floor/define.js b/src/number/floor/define.js deleted file mode 100644 index 644fd980e..000000000 --- a/src/number/floor/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import floor from './'; -defineInstance('floor', floor); diff --git a/src/number/floor/index.js b/src/number/floor/index.js deleted file mode 100644 index 6130cfa1b..000000000 --- a/src/number/floor/index.js +++ /dev/null @@ -1 +0,0 @@ -export { floor as default } from '../util/math'; diff --git a/src/number/format.js b/src/number/format.js new file mode 100644 index 000000000..dd9e05367 --- /dev/null +++ b/src/number/format.js @@ -0,0 +1 @@ +export { default } from './util/format'; diff --git a/src/number/format/define.js b/src/number/format/define.js deleted file mode 100644 index ce8001bbf..000000000 --- a/src/number/format/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import format from './'; -defineInstance('format', format); diff --git a/src/number/format/index.js b/src/number/format/index.js deleted file mode 100644 index be007f329..000000000 --- a/src/number/format/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from '../util/format'; diff --git a/src/number/index.js b/src/number/index.js index 9d17f20b4..f84f129e8 100644 --- a/src/number/index.js +++ b/src/number/index.js @@ -1,31 +1,3 @@ -export { default as abbr } from './abbr'; -export { default as abs } from './abs'; -export { default as ceil } from './ceil'; -export { default as clamp } from './clamp'; -export { default as downto } from './downto'; -export { default as exp } from './exp'; -export { default as floor } from './floor'; -export { default as format } from './format'; -export { default as isEven } from './isEven'; -export { default as isFinite } from './isFinite'; -export { default as isInteger } from './isInteger'; -export { default as isMultipleOf } from './isMultipleOf'; -export { default as isNaN } from './isNaN'; -export { default as isOdd } from './isOdd'; -export { default as isSafeInteger } from './isSafeInteger'; -export { default as log } from './log'; -export { default as pad } from './pad'; -export { default as pow } from './pow'; -export { default as random } from './random'; -export { default as range } from './range'; -export { default as round } from './round'; -export { default as sqrt } from './sqrt'; -export { default as times } from './times'; -export { default as toChar } from './toChar'; -export { default as toHex } from './toHex'; -export { default as toOrdinal } from './toOrdinal'; -export { default as trunc } from './trunc'; -export { default as upto } from './trunc'; - export * from '../core/number'; -export { default } from '../core/number'; +export * from './methods'; +import './define'; diff --git a/src/number/isEven/index.js b/src/number/isEven.js similarity index 65% rename from src/number/isEven/index.js rename to src/number/isEven.js index 239dc0a15..01120331a 100644 --- a/src/number/isEven/index.js +++ b/src/number/isEven.js @@ -1,4 +1,4 @@ -import isMultipleOf from '../util/isMultipleOf'; +import isMultipleOf from './util/isMultipleOf'; export default function isEven(n) { return Number.isInteger(n) && isMultipleOf(n, 2); diff --git a/src/number/isEven/define.js b/src/number/isEven/define.js deleted file mode 100644 index ec4de9820..000000000 --- a/src/number/isEven/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isEven from './'; -defineInstance('isEven', isEven); diff --git a/src/number/isFinite/index.js b/src/number/isFinite.js similarity index 100% rename from src/number/isFinite/index.js rename to src/number/isFinite.js diff --git a/src/number/isFinite/define.js b/src/number/isFinite/define.js deleted file mode 100644 index 00a8cd6b9..000000000 --- a/src/number/isFinite/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isFinite from './'; -defineInstance('isFinite', isFinite); diff --git a/src/number/isInteger/index.js b/src/number/isInteger.js similarity index 100% rename from src/number/isInteger/index.js rename to src/number/isInteger.js diff --git a/src/number/isInteger/define.js b/src/number/isInteger/define.js deleted file mode 100644 index d41fa4f4e..000000000 --- a/src/number/isInteger/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isInteger from './'; -defineInstance('isInteger', isInteger); diff --git a/src/number/isMultipleOf.js b/src/number/isMultipleOf.js new file mode 100644 index 000000000..a63da0680 --- /dev/null +++ b/src/number/isMultipleOf.js @@ -0,0 +1 @@ +export { default } from './util/isMultipleOf'; diff --git a/src/number/isMultipleOf/define.js b/src/number/isMultipleOf/define.js deleted file mode 100644 index 9322f2aa2..000000000 --- a/src/number/isMultipleOf/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isMultipleOf from './'; -defineInstance('isMultipleOf', isMultipleOf); diff --git a/src/number/isMultipleOf/index.js b/src/number/isMultipleOf/index.js deleted file mode 100644 index fd2a42943..000000000 --- a/src/number/isMultipleOf/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from '../util/isMultipleOf'; diff --git a/src/number/isNaN/index.js b/src/number/isNaN.js similarity index 100% rename from src/number/isNaN/index.js rename to src/number/isNaN.js diff --git a/src/number/isNaN/define.js b/src/number/isNaN/define.js deleted file mode 100644 index ec65b1532..000000000 --- a/src/number/isNaN/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isNaN from './'; -defineInstance('isNaN', isNaN); diff --git a/src/number/isOdd/index.js b/src/number/isOdd.js similarity index 65% rename from src/number/isOdd/index.js rename to src/number/isOdd.js index ad59dd294..7f0e513b1 100644 --- a/src/number/isOdd/index.js +++ b/src/number/isOdd.js @@ -1,4 +1,4 @@ -import isMultipleOf from '../util/isMultipleOf'; +import isMultipleOf from './util/isMultipleOf'; export default function isOdd(n) { return Number.isInteger(n) && !isMultipleOf(n, 2); diff --git a/src/number/isOdd/define.js b/src/number/isOdd/define.js deleted file mode 100644 index fdc92de02..000000000 --- a/src/number/isOdd/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isOdd from './'; -defineInstance('isOdd', isOdd); diff --git a/src/number/isSafeInteger/index.js b/src/number/isSafeInteger.js similarity index 100% rename from src/number/isSafeInteger/index.js rename to src/number/isSafeInteger.js diff --git a/src/number/isSafeInteger/define.js b/src/number/isSafeInteger/define.js deleted file mode 100644 index 44435e254..000000000 --- a/src/number/isSafeInteger/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import isSafeInteger from './'; -defineInstance('isSafeInteger', isSafeInteger); diff --git a/src/number/log/index.js b/src/number/log.js similarity index 100% rename from src/number/log/index.js rename to src/number/log.js diff --git a/src/number/log/define.js b/src/number/log/define.js deleted file mode 100644 index 0b1912f66..000000000 --- a/src/number/log/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import log from './'; -defineInstance('log', log); diff --git a/src/number/methods.js b/src/number/methods.js new file mode 100644 index 000000000..34b4345d4 --- /dev/null +++ b/src/number/methods.js @@ -0,0 +1,28 @@ +export { default as abbr } from './abbr'; +export { default as abs } from './abs'; +export { default as ceil } from './ceil'; +export { default as clamp } from './clamp'; +export { default as downto } from './downto'; +export { default as exp } from './exp'; +export { default as floor } from './floor'; +export { default as format } from './format'; +export { default as isEven } from './isEven'; +export { default as isFinite } from './isFinite'; +export { default as isInteger } from './isInteger'; +export { default as isMultipleOf } from './isMultipleOf'; +export { default as isNaN } from './isNaN'; +export { default as isOdd } from './isOdd'; +export { default as isSafeInteger } from './isSafeInteger'; +export { default as log } from './log'; +export { default as pad } from './pad'; +export { default as pow } from './pow'; +export { default as random } from './random'; +export { default as range } from './range'; +export { default as round } from './round'; +export { default as sqrt } from './sqrt'; +export { default as times } from './times'; +export { default as toChar } from './toChar'; +export { default as toHex } from './toHex'; +export { default as toOrdinal } from './toOrdinal'; +export { default as trunc } from './trunc'; +export { default as upto } from './upto'; diff --git a/src/number/pad.js b/src/number/pad.js new file mode 100644 index 000000000..cc20aadfe --- /dev/null +++ b/src/number/pad.js @@ -0,0 +1 @@ +export { default } from './util/pad'; diff --git a/src/number/pad/define.js b/src/number/pad/define.js deleted file mode 100644 index 508d96d04..000000000 --- a/src/number/pad/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import pad from './'; -defineInstance('pad', pad); diff --git a/src/number/pad/index.js b/src/number/pad/index.js deleted file mode 100644 index ed3a6b1ff..000000000 --- a/src/number/pad/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from '../util/pad'; diff --git a/src/number/pow/index.js b/src/number/pow.js similarity index 100% rename from src/number/pow/index.js rename to src/number/pow.js diff --git a/src/number/pow/define.js b/src/number/pow/define.js deleted file mode 100644 index 8768e8415..000000000 --- a/src/number/pow/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import pow from './'; -defineInstance('pow', pow); diff --git a/src/number/random/index.js b/src/number/random.js similarity index 100% rename from src/number/random/index.js rename to src/number/random.js diff --git a/src/number/random/define.js b/src/number/random/define.js deleted file mode 100644 index 1e902c73d..000000000 --- a/src/number/random/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineStatic } from '../../core/number'; -import random from './'; -defineStatic('random', random); diff --git a/src/number/range/index.js b/src/number/range.js similarity index 75% rename from src/number/range/index.js rename to src/number/range.js index 4f51200b5..698c810c9 100644 --- a/src/number/range/index.js +++ b/src/number/range.js @@ -1,4 +1,4 @@ -import Range from '../../util/Range'; +import Range from '../util/Range'; export default function(start, end) { return new NumberRange(start, end); diff --git a/src/number/range/define.js b/src/number/range/define.js deleted file mode 100644 index 644c5f77e..000000000 --- a/src/number/range/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineStatic } from '../../core/number'; -import range from './'; -defineStatic('range', range); diff --git a/src/number/round.js b/src/number/round.js new file mode 100644 index 000000000..019440264 --- /dev/null +++ b/src/number/round.js @@ -0,0 +1 @@ +export { round as default } from './util/math'; diff --git a/src/number/round/define.js b/src/number/round/define.js deleted file mode 100644 index f512b895b..000000000 --- a/src/number/round/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineStatic } from '../../core/number'; -import round from './'; -defineStatic('round', round); diff --git a/src/number/round/index.js b/src/number/round/index.js deleted file mode 100644 index f198b85de..000000000 --- a/src/number/round/index.js +++ /dev/null @@ -1 +0,0 @@ -export { round as default } from '../util/math'; diff --git a/src/number/sqrt/index.js b/src/number/sqrt.js similarity index 100% rename from src/number/sqrt/index.js rename to src/number/sqrt.js diff --git a/src/number/sqrt/define.js b/src/number/sqrt/define.js deleted file mode 100644 index f73bcc9bf..000000000 --- a/src/number/sqrt/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import sqrt from './'; -defineInstance('sqrt', sqrt); diff --git a/src/number/times/index.js b/src/number/times.js similarity index 72% rename from src/number/times/index.js rename to src/number/times.js index 9b064e51f..596d222f8 100644 --- a/src/number/times/index.js +++ b/src/number/times.js @@ -1,4 +1,4 @@ -import { assertPositiveInteger } from '../../util/assertions'; +import { assertPositiveInteger } from '../util/assertions'; export default function times(n, fn) { assertPositiveInteger(n); diff --git a/src/number/times/define.js b/src/number/times/define.js deleted file mode 100644 index 75cfce696..000000000 --- a/src/number/times/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import times from './'; -defineInstance('times', times); diff --git a/src/number/toChar/index.js b/src/number/toChar.js similarity index 100% rename from src/number/toChar/index.js rename to src/number/toChar.js diff --git a/src/number/toChar/define.js b/src/number/toChar/define.js deleted file mode 100644 index d122e80d3..000000000 --- a/src/number/toChar/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import toChar from './'; -defineInstance('toChar', toChar); diff --git a/src/number/toHex/index.js b/src/number/toHex.js similarity index 73% rename from src/number/toHex/index.js rename to src/number/toHex.js index 0d54d2e7c..d7aa60035 100644 --- a/src/number/toHex/index.js +++ b/src/number/toHex.js @@ -1,4 +1,4 @@ -import pad from '../util/pad'; +import pad from './util/pad'; export default function toHex(n, digits) { return pad(n, digits, null, false, 16); diff --git a/src/number/toHex/define.js b/src/number/toHex/define.js deleted file mode 100644 index 94b835bf8..000000000 --- a/src/number/toHex/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import toHex from './'; -defineInstance('toHex', toHex); diff --git a/src/number/toOrdinal.js b/src/number/toOrdinal.js new file mode 100644 index 000000000..483247a9c --- /dev/null +++ b/src/number/toOrdinal.js @@ -0,0 +1 @@ +export { default } from './util/toOrdinal'; diff --git a/src/number/toOrdinal/define.js b/src/number/toOrdinal/define.js deleted file mode 100644 index f9c24c485..000000000 --- a/src/number/toOrdinal/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import toOrdinal from './'; -defineInstance('toOrdinal', toOrdinal); diff --git a/src/number/toOrdinal/index.js b/src/number/toOrdinal/index.js deleted file mode 100644 index bc42520f4..000000000 --- a/src/number/toOrdinal/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from '../util/toOrdinal'; diff --git a/src/number/trunc.js b/src/number/trunc.js new file mode 100644 index 000000000..002ab7b17 --- /dev/null +++ b/src/number/trunc.js @@ -0,0 +1 @@ +export { trunc as default } from './util/math'; diff --git a/src/number/trunc/define.js b/src/number/trunc/define.js deleted file mode 100644 index d0c16ef9e..000000000 --- a/src/number/trunc/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import trunc from './'; -defineInstance('trunc', trunc); diff --git a/src/number/trunc/index.js b/src/number/trunc/index.js deleted file mode 100644 index 86aae00f1..000000000 --- a/src/number/trunc/index.js +++ /dev/null @@ -1 +0,0 @@ -export { trunc as default } from '../util/math'; diff --git a/src/number/upto/index.js b/src/number/upto.js similarity index 78% rename from src/number/upto/index.js rename to src/number/upto.js index ad69f5055..9b6e0aefe 100644 --- a/src/number/upto/index.js +++ b/src/number/upto.js @@ -1,4 +1,4 @@ -import step from '../util/step'; +import step from './util/step'; export default function(n1, n2, ...args) { if (n1 > n2) { diff --git a/src/number/upto/define.js b/src/number/upto/define.js deleted file mode 100644 index 1bc68dc50..000000000 --- a/src/number/upto/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineInstance } from '../../core/number'; -import upto from './'; -defineInstance('upto', upto); diff --git a/src/object/index.js b/src/object/index.js index e69de29bb..5732819a8 100644 --- a/src/object/index.js +++ b/src/object/index.js @@ -0,0 +1 @@ +export * from '../core/object'; diff --git a/src/regexp/all.js b/src/regexp/all.js deleted file mode 100644 index 790ee64ff..000000000 --- a/src/regexp/all.js +++ /dev/null @@ -1,4 +0,0 @@ -import './escape/define'; - -export * from '../core/regexp'; -export { default } from '../core/regexp'; diff --git a/src/regexp/define.js b/src/regexp/define.js new file mode 100644 index 000000000..b4b102b74 --- /dev/null +++ b/src/regexp/define.js @@ -0,0 +1,4 @@ +import { defineStatic } from '../core/regexp'; +import * as methods from './'; + +defineStatic('escape', methods.escape); diff --git a/src/regexp/util/escapeRegExp.js b/src/regexp/escape.js similarity index 77% rename from src/regexp/util/escapeRegExp.js rename to src/regexp/escape.js index 497b5124e..3b20d7128 100644 --- a/src/regexp/util/escapeRegExp.js +++ b/src/regexp/escape.js @@ -1,4 +1,4 @@ -import { isString } from '../../util/typeChecks'; +import { isString } from '../util/typeChecks'; const ESCAPE_REG = /([\\/'*+?|()[\]{}.^$-])/g; diff --git a/src/regexp/escape/define.js b/src/regexp/escape/define.js deleted file mode 100644 index c88ee6aa5..000000000 --- a/src/regexp/escape/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineStatic } from '../../core/regexp'; -import escape from './'; -defineStatic('escape', escape); diff --git a/src/regexp/escape/index.js b/src/regexp/escape/index.js deleted file mode 100644 index b684a5210..000000000 --- a/src/regexp/escape/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from '../util/escapeRegExp'; diff --git a/src/regexp/index.js b/src/regexp/index.js index 9352a00cc..cd598aa9e 100644 --- a/src/regexp/index.js +++ b/src/regexp/index.js @@ -1,4 +1,3 @@ -export { default as escape } from './escape'; - export * from '../core/regexp'; -export { default } from '../core/regexp'; +export * from './methods'; +import './define'; diff --git a/src/regexp/methods.js b/src/regexp/methods.js new file mode 100644 index 000000000..d38897cc7 --- /dev/null +++ b/src/regexp/methods.js @@ -0,0 +1 @@ +export { default as escape } from './escape'; diff --git a/src/string/all.js b/src/string/all.js deleted file mode 100644 index 132928a2d..000000000 --- a/src/string/all.js +++ /dev/null @@ -1,4 +0,0 @@ -import './range/define'; - -export * from '../core/string'; -export { default } from '../core/string'; diff --git a/src/string/define.js b/src/string/define.js new file mode 100644 index 000000000..8f5e2920a --- /dev/null +++ b/src/string/define.js @@ -0,0 +1,4 @@ +import { defineStatic } from '../core/string'; +import * as methods from './methods'; + +defineStatic('range', methods.range); diff --git a/src/string/index.js b/src/string/index.js index ba03ffc90..f654536c3 100644 --- a/src/string/index.js +++ b/src/string/index.js @@ -1,4 +1,3 @@ -export { default as range } from './range'; - export * from '../core/string'; -export { default } from '../core/string'; +export * from './methods'; +import './define'; diff --git a/src/string/methods.js b/src/string/methods.js new file mode 100644 index 000000000..53eee9fb5 --- /dev/null +++ b/src/string/methods.js @@ -0,0 +1 @@ +export { default as range } from './range'; diff --git a/src/string/range/index.js b/src/string/range.js similarity index 85% rename from src/string/range/index.js rename to src/string/range.js index 789a9392b..657abb712 100644 --- a/src/string/range/index.js +++ b/src/string/range.js @@ -1,5 +1,5 @@ -import Range from '../../util/Range'; -import { isString } from '../../util/typeChecks'; +import Range from '../util/Range'; +import { isString } from '../util/typeChecks'; const MULTIBYTE_START = 0xD800; diff --git a/src/string/range/define.js b/src/string/range/define.js deleted file mode 100644 index 527e75033..000000000 --- a/src/string/range/define.js +++ /dev/null @@ -1,3 +0,0 @@ -import { defineStatic } from '../../core/string'; -import range from './'; -defineStatic('range', range); diff --git a/test/index.js b/test/index.js index 40b8375b9..fcbe5243f 100644 --- a/test/index.js +++ b/test/index.js @@ -1,4 +1,4 @@ -import Sugar from '../src/all'; +import { Sugar } from '../src'; import Sinon from 'sinon'; global.clock = Sinon.useFakeTimers(); diff --git a/test/tests/modules/customized.js b/test/tests/modules/customized.js index c42887aa5..8dd39c2c7 100644 --- a/test/tests/modules/customized.js +++ b/test/tests/modules/customized.js @@ -1,8 +1,12 @@ -import '../../../src/number/abbr/define'; -import '../../../src/number/abs/define'; +import { defineInstance } from '../../../src/core/number'; +import { abs, abbr } from '../../../src/number/methods'; + +defineInstance('abs', abs); +defineInstance('abbr', abbr); // TODO //import 'sugar/string/capitalize/define'; -import { Number, String } from '../../../src'; +import { Number } from '../../../src/core/number'; +import { String } from '../../../src/core/string'; describe('Customized Module', function() { diff --git a/test/tests/modules/index.js b/test/tests/modules/index.js index 97ec360e5..4708e0150 100644 --- a/test/tests/modules/index.js +++ b/test/tests/modules/index.js @@ -11,21 +11,13 @@ function clearCache() { } // To correctly test modules we need to clear the require -// cache and dynamically import with require each time. - -clearCache(); -require('./sugar-entry'); clearCache(); -require('./sugar-all'); +require('./main-entry'); clearCache(); require('./namespace-entry'); clearCache(); -require('./namespace-all'); -clearCache(); require('./method-entry'); clearCache(); -require('./method-define'); -clearCache(); require('./customized'); clearCache(); require('./plugin'); diff --git a/test/tests/modules/sugar-entry.js b/test/tests/modules/main-entry.js similarity index 53% rename from test/tests/modules/sugar-entry.js rename to test/tests/modules/main-entry.js index 1d51ccd7f..161859e4c 100644 --- a/test/tests/modules/sugar-entry.js +++ b/test/tests/modules/main-entry.js @@ -1,10 +1,18 @@ -import Sugar from '../../../src/core'; +import { Sugar } from '../../../src/core'; import * as Exports from '../../../src'; describe('Entry Module', function() { - it('should export the core as default', function() { - assertEqual(Exports.default, Sugar); + it('should not export a default', function() { + assertUndefined(Exports.default); + }); + + it('should export Sugar as a named export', function() { + assertEqual(Exports.Sugar, Sugar); + }); + + it('should not export static methods', function() { + assertUndefined(Exports.abs); }); it('should have named exports equal to those of the core', function() { @@ -18,9 +26,8 @@ describe('Entry Module', function() { assertInstanceOf(Exports.Number, Function); }); - it('should not have defined methods', function() { - assertUndefined(Exports.Number.abs); - assertUndefined(Exports.Number.prototype.abs); + it('should have defined methods', function() { + assertInstanceOf(Exports.Number.abs, Function); }); }); diff --git a/test/tests/modules/method-define.js b/test/tests/modules/method-define.js deleted file mode 100644 index b257716d5..000000000 --- a/test/tests/modules/method-define.js +++ /dev/null @@ -1,15 +0,0 @@ -import Number from '../../../src/core/number'; -import * as Exports from '../../../src/number/abs/define'; - -describe('Method Define Module', function() { - - it('should not have any exports', function() { - assertEqual(Object.keys(Exports).length, 0); - }); - - it('should not have defined the method', function() { - assertEqual(Number.abs(-5), 5); - assertEqual(new Number(-5).abs().raw, 5); - }); - -}); diff --git a/test/tests/modules/method-entry.js b/test/tests/modules/method-entry.js index 7faa7fcbe..8d9a12d7b 100644 --- a/test/tests/modules/method-entry.js +++ b/test/tests/modules/method-entry.js @@ -1,19 +1,13 @@ -import Number from '../../../src/core/number'; import * as Exports from '../../../src/number/abs'; describe('Method Entry Module', function() { it('should export the method as default', function() { - assertEqual(Exports.default(-5), 5); + assertInstanceOf(Exports.default, Function); }); it('should not have any named exports', function() { assertEqual(Object.keys(Exports).length, 1); }); - it('should not have defined the method', function() { - assertUndefined(Number.abs); - assertUndefined(Number.prototype.abs); - }); - }); diff --git a/test/tests/modules/namespace-all.js b/test/tests/modules/namespace-all.js deleted file mode 100644 index 1172b08ca..000000000 --- a/test/tests/modules/namespace-all.js +++ /dev/null @@ -1,27 +0,0 @@ -import Number from '../../../src/core/number'; -import * as Exports from '../../../src/number/all'; - -describe('Namespace All Module', function() { - - it('should export the namespace as default', function() { - assertEqual(Exports.default, Number); - }); - - it('should have named exports equal to those of the namespace', function() { - assertEqual(Exports.defineStatic, Number.defineStatic); - assertEqual(Exports.defineInstance, Number.defineInstance); - assertEqual(Exports.defineStaticAlias, Number.defineStaticAlias); - assertEqual(Exports.defineInstanceAlias, Number.defineInstanceAlias); - }); - - it('should not have static functions as named exports', function() { - assertUndefined(Exports.abs); - }); - - it('should have defined methods', function() { - assertEqual(Exports.default.abs(-5), 5); - /* eslint-disable-next-line new-cap */ - assertEqual(new Exports.default(-5).abs().raw, 5); - }); - -}); diff --git a/test/tests/modules/namespace-entry.js b/test/tests/modules/namespace-entry.js index 45a2fda5a..a5fe1c871 100644 --- a/test/tests/modules/namespace-entry.js +++ b/test/tests/modules/namespace-entry.js @@ -1,10 +1,18 @@ -import Number from '../../../src/core/number'; +import { Number } from '../../../src/core/number'; import * as Exports from '../../../src/number'; describe('Namespace Entry Module', function() { - it('should export the namespace as default', function() { - assertEqual(Exports.default, Number); + it('should not export a default', function() { + assertUndefined(Exports.default); + }); + + it('should export Number as a named export', function() { + assertEqual(Exports.Number, Number); + }); + + it('should have defined chainable methods', function() { + assertInstanceOf(Exports.Number.prototype.abs, Function); }); it('should have named exports equal to those of the namespace', function() { @@ -15,12 +23,7 @@ describe('Namespace Entry Module', function() { }); it('should have static functions as named exports', function() { - assertEqual(Exports.abs(-5), 5); - }); - - it('should have not have defined chainable methods', function() { - assertUndefined(Exports.default.abs); - assertUndefined(Exports.default.prototype.abs); + assertInstanceOf(Exports.abs, Function); }); }); diff --git a/test/tests/modules/plugin.js b/test/tests/modules/plugin.js index 38de53e57..785665b7c 100644 --- a/test/tests/modules/plugin.js +++ b/test/tests/modules/plugin.js @@ -1,14 +1,17 @@ -import Sugar, { createNamespace } from '../../../src/core'; -import String, { defineInstance } from '../../../src/core/string'; +import { createNamespace } from '../../../src/core'; +import { defineInstance } from '../../../src/core/string'; -defineInstance('hi', function(str) { - return 'hi ' + str; +const Boolean = createNamespace('Boolean'); + +Boolean.defineInstance('maybe', function() { + return 0.5; }); -createNamespace('Boolean'); +import { Sugar } from '../../../src'; +import { String } from '../../../src/string'; -Sugar.Boolean.defineInstance('maybe', function() { - return 0.5; +defineInstance('hi', function(str) { + return 'hi ' + str; }); describe('Plugin Module', function() { diff --git a/test/tests/modules/sugar-all.js b/test/tests/modules/sugar-all.js deleted file mode 100644 index 008e53e69..000000000 --- a/test/tests/modules/sugar-all.js +++ /dev/null @@ -1,26 +0,0 @@ -import Sugar from '../../../src/core'; -import * as Exports from '../../../src/all'; - -describe('All Module', function() { - - it('should export the core as default', function() { - assertEqual(Exports.default, Sugar); - }); - - it('should have named exports equal to those of the core', function() { - assertEqual(Exports.VERSION, Sugar.VERSION); - assertEqual(Exports.extend, Sugar.extend); - assertEqual(Exports.restore, Sugar.restore); - assertEqual(Exports.createNamespace, Sugar.createNamespace); - }); - - it('should have exported namespaces', function() { - assertInstanceOf(Exports.Number, Function); - }); - - it('should have defined methods', function() { - assertEqual(Exports.Number.abs(-5), 5); - assertEqual(new Exports.Number(-5).abs().raw, 5); - }); - -}); diff --git a/test/tests/number.js b/test/tests/number.js index 313778dd7..7bdd7c15c 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -1,6 +1,6 @@ 'use strict'; -fnamespace('Number', function() { +namespace('Number', function() { describeStatic('random', function(random) { @@ -15,30 +15,6 @@ fnamespace('Number', function() { }); - describeStatic('round', function(round) { - - it('should round numbers', function() { - assertEqual(round(3), 3); - assertEqual(round(3.241), 3); - assertEqual(round(3.752), 4); - assertEqual(round(-3.241), -3); - assertEqual(round(-3.752), -4); - assertEqual(round(3.241, 1), 3.2); - assertEqual(round(3.752, 1), 3.8); - assertEqual(round(3.241, 2), 3.24); - assertEqual(round(3.752, 2), 3.75); - assertEqual(round(322855.241, -2), 322900); - assertEqual(round(322855.241, -3), 323000); - assertEqual(round(322855.241, -4), 320000); - assertEqual(round(322855.241, -6), 0); - assertEqual(round(722855.241, -6), 1000000); - assertEqual(round(722855.241, -8), 0); - assertEqual(round(1e-21, 1), 0); - assertEqual(round(1e-21, -1), 0); - }); - - }); - describeStatic('range', function(range) { it('#toString', function() { @@ -133,6 +109,30 @@ fnamespace('Number', function() { }); + describeInstance('round', function(round) { + + it('should round numbers', function() { + assertEqual(round(3), 3); + assertEqual(round(3.241), 3); + assertEqual(round(3.752), 4); + assertEqual(round(-3.241), -3); + assertEqual(round(-3.752), -4); + assertEqual(round(3.241, 1), 3.2); + assertEqual(round(3.752, 1), 3.8); + assertEqual(round(3.241, 2), 3.24); + assertEqual(round(3.752, 2), 3.75); + assertEqual(round(322855.241, -2), 322900); + assertEqual(round(322855.241, -3), 323000); + assertEqual(round(322855.241, -4), 320000); + assertEqual(round(322855.241, -6), 0); + assertEqual(round(722855.241, -6), 1000000); + assertEqual(round(722855.241, -8), 0); + assertEqual(round(1e-21, 1), 0); + assertEqual(round(1e-21, -1), 0); + }); + + }); + describeInstance('ceil', function(ceil) { it('should round up', function() { diff --git a/test/tests/string.js b/test/tests/string.js index 892121e87..b2cd598ec 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -2,7 +2,7 @@ namespace('String', function() { - staticMethod('range', function(range) { + describeStatic('range', function(range) { it('#toString', function() { assertEqual(range('a', 'z').toString(), 'a..z'); diff --git a/webpack.config.js b/webpack.config.js index fbf57d9e5..40ce50f6d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -7,13 +7,13 @@ module.exports = { output: { filename: 'sugar.js', library: 'Sugar', - libraryExport: 'default' + libraryExport: 'Sugar', }, optimization: { usedExports: true }, // This can't be an array: https://webpack.js.org/guides/author-libraries/ - entry: './src/all', + entry: './src/index', module: { rules: [ { diff --git a/yarn.lock b/yarn.lock index 241522eae..6187fe835 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3161,10 +3161,10 @@ readdirp@~3.1.3: dependencies: picomatch "^2.0.4" -ready-test@^1.0.26: - version "1.0.26" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.26.tgz#7a77731481cc792874be0ded62f2b4aed2597784" - integrity sha512-DeaXn1x0MkN8wO5Dle35QUrmJq1MNCzLfFYdd07efiF3lJLzAkCRAiLSYSCkU4z88Lu0blZUMmdpynRJNNSvWQ== +ready-test@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.28.tgz#550760a9254240ed3f623589dc0dc783cb31cb1d" + integrity sha512-ICQt/L1x0bpgkyuhz2wI4pu/cq7EkC/rvWInF+TbygWEk1k7VKSV7RytcfN+BXGqm/kDXeJrRX/1byCkFGb4jA== dependencies: argv "^0.0.2" chalk "^2.4.2" From d51d1a58604f555e5a68150473a12a914692d18a Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 23 Jun 2020 13:17:54 +0900 Subject: [PATCH 025/191] stuff --- src/core/function.js | 5 + src/core/index.js | 37 +++++ src/function/debounce.js | 47 ++++-- src/function/define.js | 1 + src/function/index.js | 19 +++ src/function/memoize.js | 35 ++++- src/function/methods.js | 1 + src/function/throttle.js | 98 +++++++++++++ src/index.js | 1 - src/number/abbr.js | 14 +- src/util/assertions.js | 6 + test/tests/function.js | 302 ++++++++++++++++++++++++++++++++++----- test/tests/number.js | 2 +- 13 files changed, 517 insertions(+), 51 deletions(-) create mode 100644 src/function/throttle.js diff --git a/src/core/function.js b/src/core/function.js index e286fb9b6..18fc650d2 100644 --- a/src/core/function.js +++ b/src/core/function.js @@ -1,5 +1,10 @@ import { createNamespace } from '../core'; + +/** + * @class Function + * @memberof module:function + */ export const Function = createNamespace('Function'); export const { diff --git a/src/core/index.js b/src/core/index.js index 9667a3405..55ea6718b 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,3 +1,5 @@ +/** @module core */ + import globalContext from './util/globalContext'; import NamespaceStore from './util/NamespaceStore'; import SugarChainableBase from './util/SugarChainableBase'; @@ -11,6 +13,9 @@ export const VERSION = 'edge'; // --- Setup +/** + * createNamespace + */ export function createNamespace(globalName) { if (!globalContext[globalName]) { @@ -21,24 +26,56 @@ export function createNamespace(globalName) { return; } + /** + * A chainable object. + * @param {*} obj - The object to be wrapped by the chainable. + */ class SugarChainable extends SugarChainableBase { + /** + * Extends Sugar defined methods onto natives. + * + * @example + * + * Sugar.Array.extend(); + * + * @param {Object} [options] - Options to control what methods are extended. + * @param {Array} [options.include] - An array of methods to include + * when extending. + * @param {Array} [options.exclude] - An array of methods to exclude + * when extending. + * @param {boolean} [options.existing] - Whether or not to override existing methods + * when extending. + * + */ static extend(opt) { extendNamespace(globalName, opt); } + /** + * defineStatic + */ static defineStatic(...args) { defineWithArgs(globalName, defineStatic, args); } + /** + * defineInstance + */ static defineInstance(...args) { defineWithArgs(globalName, defineInstance, args); } + /** + * defineStaticAlias + */ static defineStaticAlias(str, fn) { defineAliases(globalName, defineStatic, str, fn); } + /** + * defineInstanceAlias + */ static defineInstanceAlias(str, fn) { defineAliases(globalName, defineInstance, str, fn); } diff --git a/src/function/debounce.js b/src/function/debounce.js index 4d5384aa6..deee1d03a 100644 --- a/src/function/debounce.js +++ b/src/function/debounce.js @@ -1,18 +1,47 @@ -export default function(fn, ms = 0) { +import { assertPositiveInteger } from '../util/assertions'; + +/** + * Creates a "debounced" function that postpones its execution until + * after `ms` milliseconds have passed. This method is useful to execute + * a function after things have "settled down". A good example of this + * is when a user tabs quickly through form fields, an action can be + * taken once they have settled on a field. + * + * Note that this is similar to `throttle` with a limit of 1, with the + * exception that a debounced function will receive the last arguments + * supplied, while a throttled function will receive the first. + * + * @example + * + * var fn = debounce(logHello, 250) + * runTenTimes(fn); -> called once 250ms later + * + * @param {Function} fn - The function to debounce. + * + * @returns {Function} + * + * @method debounce + * @static + * + */ +export function debounce(fn, ms = 0) { + + assertPositiveInteger(ms); + let timer = null; - let result = null; - const debounced = () => { - const args = arguments; - debounced.cancel(); + let returnValue = null; + + const debounced = function() { + clearTimeout(timer); timer = setTimeout(() => { - result = fn.apply(this, args); + returnValue = fn.apply(this, arguments); }, ms); - return result; - }; + return returnValue; + } debounced.cancel = () => { clearTimeout(timer); - }; + } return debounced; } diff --git a/src/function/define.js b/src/function/define.js index f03ca4d11..09526f7fa 100644 --- a/src/function/define.js +++ b/src/function/define.js @@ -2,4 +2,5 @@ import { defineInstance } from '../core/function'; import * as methods from './methods'; defineInstance('memoize', methods.memoize); +defineInstance('throttle', methods.throttle); defineInstance('debounce', methods.debounce); diff --git a/src/function/index.js b/src/function/index.js index bee03b76a..30d509ab5 100644 --- a/src/function/index.js +++ b/src/function/index.js @@ -1,3 +1,22 @@ +/** @module function */ + +/** + * @static + * @method memoize + * @see module:function/memoize + */ +/** + * @static + * @method throttle + * @see module:function/throttle + */ +/** + * @static + * @method debounce + * @see module:function/debounce + */ + export * from '../core/function'; export * from './methods'; import './define'; + diff --git a/src/function/memoize.js b/src/function/memoize.js index 56ca635ac..7ce32bfba 100644 --- a/src/function/memoize.js +++ b/src/function/memoize.js @@ -1,4 +1,37 @@ -export default function(fn, hashFn) { +/** @module */ + +/** + * Creates a function that will memoize results for unique calls. + * `memoize` can be thought of as a more powerful `once`. Where `once` + * will only call a function once ever, memoized functions will be + * called once per unique call. A "unique call" is determined by the + * return value of [hashFn], which is passed the arguments of each call. + * If [hashFn] is undefined, it will deeply serialize all arguments, + * such that any different argument signature will result in a unique + * call. [hashFn] may be a string (allows `deep properties`) that acts + * as a shortcut to return a property of the first argument passed. + * [limit] sets an upper limit on memoized results. The default is no + * limit, meaning that unique calls will continue to memoize results. + * For most use cases this is fine, however [limit] is useful for more + * persistent (often server-side) applications for whom memory leaks + * are a concern. + * + * @example + * + * var fn = logHello.memoize(); + * fn(1); fn(1); fn(2); -> logs twice, memoizing once + * + * var fn = calculateUserBalance.memoize('id'); + * fn(Harry); fn(Mark); fn(Mark); -> logs twice, memoizing once + * + * @param {Function} fn - The function to memoize. + * @param {Function} [hashFn] - The function to memoize. + * + * @method memoize + * @static + * + */ +export default function memoize(fn, hashFn) { const cache = {}; hashFn = hashFn || defaultHashFn; return function memoized() { diff --git a/src/function/methods.js b/src/function/methods.js index d1174d003..83649213f 100644 --- a/src/function/methods.js +++ b/src/function/methods.js @@ -1,2 +1,3 @@ export { default as memoize } from './memoize'; +export { default as throttle } from './throttle'; export { default as debounce } from './debounce'; diff --git a/src/function/throttle.js b/src/function/throttle.js new file mode 100644 index 000000000..917aa5c1c --- /dev/null +++ b/src/function/throttle.js @@ -0,0 +1,98 @@ +/** @module */ + +import { + assertPositiveInteger, + assertPositiveIntegerOrInfinity, +} from '../util/assertions'; + +const DEFAULT_OPTIONS = { + limit: Infinity, + immediate: false, +}; + +/** + * Creates a "throttled" version of the function that will only be executed + * `limit` times per `ms` milliseconds. `throttle` is useful when multiple + * heavy operations need to be spaced out or execution of a function needs + * to be locked for a given time period. + * + * Note that `throttle` is subtly different to `debounce`, as the function + * will receive the first arguments before it was locked, where `debounce` + * will receive the last. + * + * @example + * + * var fn = throttle(logHello, 50); + * runTenTimes(fn); // Will only log once + * + * @param {number} ms - The delay to throttle the function by. + * @param {Object} [options] - Options to be passed to throttle. + * + * @param {number} [options.limit = 1] - The number of executions allowed before + * waiting. + * @param {string} [options.immediate = false] - Whether to perform the initial + * execution immediately before waiting. + * + * @returns Function + * + * @method throttle + * @static + * + */ +/** + * @memberof module:function.Function + * @instance + * @param {number} foo - foooooooooooooo + */ +export default function throttle(fn, ms = 0, options) { + + const opt = { + ...DEFAULT_OPTIONS, + ...options, + }; + + assertPositiveInteger(ms); + assertPositiveIntegerOrInfinity(opt.limit); + + const queue = []; + let timer = null; + let returnValue = null; + + function exec() { + timer = null; + const queuedFn = queue.shift(); + if (queuedFn) { + returnValue = queuedFn(); + } + if (queue.length) { + wait(); + } + } + + function wait() { + if (!isWaiting()) { + timer = setTimeout(exec, ms); + } + } + + function isWaiting() { + return timer !== null; + } + + const throttled = function() { + if (opt.immediate && !isWaiting()) { + returnValue = fn.apply(this, arguments); + wait(); + } else if (queue.length < opt.limit - (opt.immediate ? 1 : 0)) { + queue.push(fn.bind(this, ...arguments)); + wait(); + } + return returnValue; + }; + + throttled.cancel = () => { + clearTimeout(timer); + }; + + return throttled; +} diff --git a/src/index.js b/src/index.js index 489e526ae..13eb7eff2 100644 --- a/src/index.js +++ b/src/index.js @@ -6,4 +6,3 @@ export { Number } from './number'; export { Object } from './object'; export { RegExp } from './regexp'; export { Function } from './function'; - diff --git a/src/number/abbr.js b/src/number/abbr.js index 1cd7609bb..dd7ed9337 100644 --- a/src/number/abbr.js +++ b/src/number/abbr.js @@ -1,3 +1,5 @@ +/** @module */ + import { assertFinite } from '../util/assertions'; import { trunc, round } from './util/math'; import { isNumber } from '../util/typeChecks'; @@ -5,12 +7,12 @@ import format from './util/format'; import clamp from './util/clamp'; /** - * @typedef {"integer"|"common"|"metric"|"binary"} UnitAlias + * @typedef {"integer" | "common" | "metric" | "binary"} UnitAlias * - * @prop integer - Units suitable for large integers. Equivalent to "tmbk|". - * @prop common - Common si units, as used with "grams", "meters", etc. Equivalent to "k|mμn". - * @prop metric - Full si units. Equivalent to "YZEPTGMk|mμnpfazy". - * @prop binary - Alias for "metric", but considers the number as base 2. + * @property {string} integer - Units suitable for large integers. Equivalent to "tmbk|". + * @property {string} common - Common si units, as used with "grams", "meters", etc. Equivalent to "k|mμn". + * @property {string} metric - Full si units. Equivalent to "YZEPTGMk|mμnpfazy". + * @property {string} binary - Alias for "metric", but considers the number as base 2. * */ const ALIAS_INTEGER = 'integer'; @@ -62,6 +64,8 @@ const SAFE_PRECISION = 10; * abbr(.15, 2, 'common'); // "150m" * abbr(1234, 2, null, deFormatter); // "1,23k" * + * @method abbr + * */ export default function abbr(n, precision, units, formatter) { diff --git a/src/util/assertions.js b/src/util/assertions.js index 22e79646f..164c48fc9 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -40,6 +40,12 @@ export function assertPositiveInteger(n) { } } +export function assertPositiveIntegerOrInfinity(n) { + if ((!Number.isInteger(n) || n <= 0) && n !== Infinity) { + throw new TypeError(n + ' is not a positive integer or Infinity'); + } +} + export function assertDecimal(n) { if (!Number.isFinite(n) || usesScientificNotation(n)) { throw new TypeError(n + ' cannot be represented as a decimal'); diff --git a/test/tests/function.js b/test/tests/function.js index 035efad8a..210d9fbdc 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -2,40 +2,49 @@ namespace('Function', function() { - function createCounter() { - let n = 0; - return function() { - return ++n; - } - } + let args; - function assertMemoized(memoizeFn, hashFn, runCount, expected) { - const fn = memoizeFn(createCounter(), hashFn); - let result = null; - for (let i = 0; i < runCount; i++) { - result = fn(i); - } - assertEqual(result, expected); + function captureArgs() { + var arr = Array.from(arguments); + args.push(arr); + return arr; } + beforeEach(function() { + args = []; + }); + + afterEach(function() { + args = null; + }); + describeInstance('memoize', function(memoize) { - it('should perform basic caching', () => { - assertMemoized(memoize, null, 10, 10); - assertMemoized(memoize, noop, 10, 1); - assertMemoized(memoize, function(i) { - return i % 2 === 0; - }, 10, 2); + it('should perform basic caching', function() { + const fn = memoize(captureArgs); + assertArrayEqual(fn('a'), ['a']); + assertArrayEqual(fn('a', 'b'), ['a']); + assertArrayEqual(args, [['a']]); + }); + it('should use hash function as the cache key', function() { + const fn = memoize(captureArgs, function(i) { + return i % 2 === 0; + }); + assertArrayEqual(fn(1), [1]); + assertArrayEqual(fn(2), [2]); + assertArrayEqual(fn(3), [1]); + assertArrayEqual(fn(4), [2]); + assertArrayEqual(args, [[1],[2]]); }); - it('should receive same args and context', () => { + it('should receive same args and context', function() { memoize(function(a, b, c) { assertArrayEqual([this, a, b, c], [1,2,3,4]); }).call(1,2,3,4); }); - it('should pass same args and context to the hash function', () => { + it('should pass same args and context to the hash function', function() { memoize(noop, function(a, b, c) { assertArrayEqual([this, a, b, c], [1,2,3,4]); }).call(1,2,3,4); @@ -45,24 +54,249 @@ namespace('Function', function() { describeInstance('debounce', function(debounce) { - it('should perform basic debounce', () => { - const fn = debounce(createCounter(), 200); - assertEqual(fn(), null); - assertEqual(fn(), null); - clock.tick(100); - assertEqual(fn(), null); + it('should perform basic debounce', function() { + const fn = debounce(captureArgs, 200); + fn('a'); + fn('b'); + fn('c'); + fn('d'); + assertArrayEqual(args, []); + clock.tick(200); + assertArrayEqual(args, [['d']]); + clock.tick(200); + assertArrayEqual(args, [['d']]); + }); + + it('should be able to cancel', function() { + const fn = debounce(captureArgs, 200); + fn('a'); + fn('b'); + assertArrayEqual(args, []); + fn.cancel(); clock.tick(200); - assertEqual(fn(), 1); - clock.tick(400); - assertEqual(fn(), 2); + assertArrayEqual(args, []); }); - it('should be able to cancel', () => { - const fn = debounce(createCounter(), 200); - clock.tick(100); + it('should be able to cancel after first execution', function() { + const fn = debounce(captureArgs, 200); + fn('a'); + clock.tick(200); + assertArrayEqual(args, [['a']]); + fn('b'); fn.cancel(); clock.tick(200); - assertEqual(fn(), null); + assertArrayEqual(args, [['a']]); + }); + + it('should retain the last value when called repeatedly', function() { + // Note this differs from throttle with limit 1 + const fn = debounce(captureArgs, 200, { + limit: 1 + }); + fn('a'); + fn('b'); + fn('c'); + clock.tick(200); + assertArrayEqual(fn('d'), ['c']); + clock.tick(200); + assertArrayEqual(args, [['c'],['d']]); + }); + + + }); + + describeInstance('throttle', function(throttle) { + + describe('No Args', function() { + + it('should queue execution with default arguments', function() { + const fn = throttle(captureArgs, 200); + fn('a'); + fn('b'); + assertArrayEqual(args, []); + clock.tick(200); + assertArrayEqual(args, [['a']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); + }); + + it('should return value from last completed execution', function() { + const fn = throttle(captureArgs, 200); + assertEqual(fn('a'), null); + clock.tick(200); + assertArrayEqual(fn('b'), ['a']); + clock.tick(200); + assertArrayEqual(fn('c'), ['b']); + clock.tick(200); + assertArrayEqual(args, [['a'],['b'],['c']]); + }); + + it('should pass all arguments to execution', function() { + const fn = throttle(captureArgs, 200); + fn('a','b','c'); + clock.tick(200); + assertArrayEqual(args, [['a','b','c']]); + }); + + }); + + describe('Limit option', function() { + + it('should not queue beyond limit', function() { + const fn = throttle(captureArgs, 200, { + limit: 2 + }); + fn('a'); + fn('b'); + fn('c'); + fn('d'); + assertArrayEqual(args, []); + clock.tick(200); + assertArrayEqual(args, [['a']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); + }); + + it('should retain the first value when called repeatedly', function() { + // Note this differs from debounce + const fn = throttle(captureArgs, 200, { + limit: 1 + }); + fn('a'); + fn('b'); + fn('c'); + clock.tick(200); + assertArrayEqual(fn('d'), ['a']); + clock.tick(200); + assertArrayEqual(args, [['a'],['d']]); + }); + + }); + + describe('Immediate Option', function() { + + it('should allow firing immediately', function() { + const fn = throttle(captureArgs, 200, { + immediate: true + }); + fn('a'); + fn('b'); + assertArrayEqual(args, [['a']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); + }); + + it('should continue firing immediately after timeout', function() { + const fn = throttle(captureArgs, 200, { + immediate: true + }); + fn('a'); + assertArrayEqual(args, [['a']]); + clock.tick(200); + fn('b'); + assertArrayEqual(args, [['a'],['b']]); + }); + + it('should queue functions after first release', function() { + const fn = throttle(captureArgs, 200, { + immediate: true + }); + fn('a'); + clock.tick(200); + assertArrayEqual(args, [['a']]); + fn('b'); + fn('c'); + assertArrayEqual(args, [['a'],['b']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b'],['c']]); + }); + + it('should lock an immediate function with limit of 1', function() { + const fn = throttle(captureArgs, 200, { + limit: 1, + immediate: true + }); + fn('a'); + assertArrayEqual(args, [['a']]); + fn('b'); + assertArrayEqual(args, [['a']]); + fn('c'); + assertArrayEqual(args, [['a']]); + clock.tick(200); + assertArrayEqual(args, [['a']]); + }); + + }); + + describe('Canceling', function() { + + it('should cancel a lazy function', function() { + const fn = throttle(captureArgs, 200); + fn('a'); + fn.cancel(); + clock.tick(200); + assertArrayEqual(args, []); + }); + + it('should cancel a lazy function after first execution', function() { + const fn = throttle(captureArgs, 200); + fn('a'); + fn('b'); + clock.tick(200); + fn.cancel(); + clock.tick(200); + assertArrayEqual(args, [['a']]); + }); + + it('should cancel an immediate function', function() { + const fn = throttle(captureArgs, 200, { + immediate: true + }); + fn('a'); + fn('b'); + assertArrayEqual(args, [['a']]); + fn.cancel(); + clock.tick(200); + assertArrayEqual(args, [['a']]); + }); + + it('should cancel immediate function after first execution', function() { + const fn = throttle(captureArgs, 200, { + immediate: true + }); + fn('a'); + fn('b'); + fn('c'); + clock.tick(200); + fn.cancel(); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); + }); + + }); + + describe('Invalid input', function() { + + it('should error on invalid duration', function() { + assertError(function() { throttle(captureArgs, 0); }); + assertError(function() { throttle(captureArgs, -1); }); + assertError(function() { throttle(captureArgs, '5'); }); + assertError(function() { throttle(captureArgs, 1.5); }); + assertError(function() { throttle(captureArgs, NaN); }); + }); + + it('should error on invalid limit', function() { + assertError(function() { throttle(captureArgs, 200, { limit: 0 } ); }); + assertError(function() { throttle(captureArgs, 200, { limit: -1 } ); }); + assertError(function() { throttle(captureArgs, 200, { limit: '5' } ); }); + assertError(function() { throttle(captureArgs, 200, { limit: 1.5 } ); }); + assertError(function() { throttle(captureArgs, 200, { limit: NaN } ); }); + }); + }); }); diff --git a/test/tests/number.js b/test/tests/number.js index 7bdd7c15c..89f6b49b2 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -390,7 +390,7 @@ namespace('Number', function() { assertEqual(toOrdinal(-5), '-5th'); }); - it('should error on invalid values', function() { + it('should error on invalid input', function() { assertError(function() { toOrdinal(NaN); }); assertError(function() { toOrdinal(5.55); }); assertError(function() { toOrdinal(null); }); From f23ea486a92642a12a4625431ac558a35424fb9e Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Wed, 15 Jul 2020 01:32:38 +0900 Subject: [PATCH 026/191] First cut of declares generation. --- .eslintrc | 40 +- package.json | 14 +- scripts/generate-declares | 446 ++++ src/array/define.js | 4 + src/array/groupBy.js | 53 + src/array/index.js | 2 + src/array/methods.js | 1 + src/core/array.js | 1 + src/core/function.js | 6 +- src/core/index.js | 70 +- src/core/number.js | 1 + src/core/object.js | 1 + src/core/regexp.js | 1 + src/core/string.js | 1 + src/core/util/NamespaceStore.js | 3 +- src/core/util/extend.js | 2 +- src/function/debounce.js | 5 +- src/function/index.js | 19 - src/function/memoize.js | 6 +- src/function/throttle.js | 20 +- src/number/abbr.js | 8 +- src/regexp/define.js | 2 +- src/string/capitalize.js | 1 + src/string/define.js | 3 +- src/string/methods.js | 1 + src/string/util/capitalize.js | 31 + src/util/assertions.js | 29 + src/util/class.js | 16 + src/util/deepProperties.js | 164 ++ src/util/enumerable.js | 18 + src/{core => }/util/helpers.js | 12 +- src/util/object.js | 127 ++ src/util/serialize.js | 48 + src/util/typeChecks.js | 74 +- test/.eslintrc | 46 +- test/index.html | 1 + test/tests/array.js | 111 + test/tests/modules/customized.js | 1 - test/tests/object.js | 0 test/tests/string.js | 68 + webpack.config.js | 10 +- yarn.lock | 3263 +++++++++++++++++------------- 42 files changed, 3206 insertions(+), 1524 deletions(-) create mode 100755 scripts/generate-declares create mode 100644 src/array/define.js create mode 100644 src/array/groupBy.js create mode 100644 src/array/methods.js create mode 100644 src/string/capitalize.js create mode 100644 src/string/util/capitalize.js create mode 100644 src/util/class.js create mode 100644 src/util/deepProperties.js create mode 100644 src/util/enumerable.js rename src/{core => }/util/helpers.js (61%) create mode 100644 src/util/object.js create mode 100644 src/util/serialize.js create mode 100644 test/tests/array.js create mode 100644 test/tests/object.js diff --git a/.eslintrc b/.eslintrc index 48aba3449..383bd812e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,40 +1,16 @@ { - "extends": "eslint:recommended", "env": { + "es6": true, "node": true, - "browser": true - }, - "rules": { - "semi": ["error"], - "new-cap": ["error"], - "new-parens": ["error"], - "no-unused-vars": ["error", { - args: "after-used" - }], - "keyword-spacing": ["error"], - "object-shorthand": ["error", "consistent"], - "block-scoped-var": ["error"], - "operator-linebreak": ["error", "before"], - "space-before-function-paren": ["error", "never"], - "quotes": ["error", "single", "avoid-escape"], - "space-before-blocks": ["error", "always"], - "no-multiple-empty-lines": [2, { - "max": 3, - "maxBOF": 1, - "maxEOF": 0 - }], - "object-curly-newline": ["error", { - "consistent": true - }], - "padded-blocks": ["error", { - "classes": "always" - }], - "indent": ["error", 2, { - "SwitchCase": 1 - }], + "browser": true, }, "parserOptions": { - "ecmaVersion": 2019, + "ecmaVersion": 2020, "sourceType": "module" + }, + "extends": "eslint:recommended", + "rules": { + "comma-dangle": ["error", "only-multiline"], + "no-control-regex": "off", } } diff --git a/package.json b/package.json index 0e680deb0..2184dcc83 100644 --- a/package.json +++ b/package.json @@ -29,21 +29,27 @@ }, "scripts": { "build": "webpack", - "test": "node ./node_modules/.bin/ready-test test/index.js", + "test": "ready-test test/index.js", + "declares": "node -r esm ./scripts/generate-declares", "coverage": "istanbul cover --report=lcovonly ready-test test/index.js", "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" }, - "typings": "sugar.d.ts", "devDependencies": { "@babel/core": "^7.6.2", "@babel/plugin-transform-runtime": "^7.6.2", "@babel/preset-env": "^7.6.2", "@babel/runtime": "^7.6.2", "babel-loader": "^8.0.6", + "circular-dependency-plugin": "^5.2.0", + "eslint": "^7.4.0", + "esm": "^3.2.25", + "jsdoc": "^3.6.4", "ready-test": "^1.0.28", "sinon": "^7.5.0", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", - "webpack-cli": "^3.3.9" - } + "webpack-cli": "^3.3.9", + "yargs": "^15.4.1" + }, + "dependencies": {} } diff --git a/scripts/generate-declares b/scripts/generate-declares new file mode 100755 index 000000000..b407eaa35 --- /dev/null +++ b/scripts/generate-declares @@ -0,0 +1,446 @@ +#!/usr/bin/env node + +const fs = require('fs-extra'); +const path = require('path'); +const util = require('util'); +const exec = util.promisify(require('child_process').exec); + +const { capitalize } = require('../src/string'); +const { groupBy } = require('../src/array'); + +var argv = require('yargs') + .usage('Usage: $0 --out ') + .demandOption('out') + .describe('out', 'Directory to output declares.') + .argv; + +// --- JSDocs + +async function getJSDocs() { + try { + const bin = path.resolve('node_modules/.bin/jsdoc'); + const { stdout } = await exec(`${bin} -r -X src`, { + maxBuffer: 5 * 1024 * 1024, + }); + let blocks = JSON.parse(stdout) + .filter((block) => !block.undocumented && block.kind !== 'package') + .map((block) => normalizeBlock(block)); + blocks = groupMembers(blocks); + blocks = groupModules(blocks); + return blocks; + } catch (err) { + console.info(err); + } +} + +function normalizeBlock(block) { + block.members = []; + block.options = []; + if (block.memberof === 'module') { + delete block.memberof; + } + if (block.kind === 'function') { + // JSDoc method name fails when placed before an export keyword + // so extract from the filename. + if (block.name === 'exports') { + block.name = block.meta.filename.replace(/\.js$/, ''); + } + + if (!block.params) { + block.params = []; + } + const options = getOptionsForBlock(block); + if (options.length) { + block.options = block.options.concat(options); + } + if (!block.returns) { + block.returns = []; + } + } + return block; +} + +function getOptionsForBlock(block) { + let { params } = block; + const options = []; + block.params = params.filter((param) => { + if (param.name.includes('.')) { + return false; + } else { + const sub = params.filter((p) => { + return p.name.includes(`${param.name}.`); + }); + if (sub.length) { + const type = getOptionTypeName(block, param); + param.type.names = [type]; + options.push({ + kind: 'options', + name: type, + params: sub.map((p) => { + return { + ...p, + name: p.name.replace(`${param.name}.`, '') + }; + }), + }); + } + return true; + } + }); + return options; +} + +function getOptionTypeName(block, param) { + let output = ''; + if (block.memberof) { + output += block.memberof; + } + output += capitalize(block.name); + output += capitalize(param.name); + return output; +} + +function groupMembers(blocks) { + return blocks.filter((block) => { + const { memberof } = block; + if (memberof) { + const parent = blocks.find((b) => { + return b.name === memberof; + }); + parent.members.push(block); + block.parent = parent; + return false; + } + return true; + }); +} + +function groupModules(blocks) { + const groups = groupBy(blocks, (block) => { + return getModuleName(block); + }); + for (let blocks of Object.values(groups)) { + dedupeOptionTypes(blocks); + } + return groups; +} + +function dedupeOptionTypes(blocks) { + const allOptions = getFlatOptions(blocks); + for (let block of getFlatMembers(blocks)) { + if (block.options) { + for (let option of block.options) { + const duplicates = allOptions + .filter((o) => { + return paramsAreEqual(option.params, o.params); + }).sort((a, b) => { + return a.name.length - b.name.length; + }); + if (duplicates.length) { + const [preferred] = duplicates; + if (preferred.name.length < option.name.length) { + block.options = block.options.filter((o) => o !== option); + for (let param of block.params) { + param.type.names = param.type.names.map((name) => { + if (name === option.name) { + name = preferred.name; + } + return name; + }); + } + } + } + } + } + } +} + +function paramsAreEqual(params1, params2) { + if (params1.length === params2.length) { + return params1.every((p1, i) => { + const p2 = params2[i]; + return p1.name === p2.name + && p1.optional === p2.optional + // TODO: use internal isEqual + && JSON.stringify(p1.type) === JSON.stringify(p2.type); + }); + } + return false; +} + +function getModuleName(doc) { + const match = doc.meta.path.match(/src\/(\w+)/); + switch (match[1]) { + case 'array': return 'Array'; + case 'date': return 'Date'; + case 'function': return 'Function'; + case 'number': return 'Number'; + case 'object': return 'Object'; + case 'regexp': return 'RegExp'; + case 'string': return 'String'; + case 'core': return 'Core'; + } + throw new Error(`Unknown module ${match[1]}`); +} + +async function generateDeclares() { + const modules = await getJSDocs(); + const { Core, ...other } = modules; + //buildMain(Core, other); + buildModules(Core, other); + //exportChainables(other); +} + +function buildModules(Core, modules) { + for (let [name, module] of Object.entries(modules)) { + buildModule(name, module, Core); + } +} + +function buildModule(name, blocks, Core) { + const lower = name.toLowerCase(); + writeFile(`${lower}/index.d.ts`, indent` + declare module 'sugar/${lower}' { + + ${exportClasses(Core)} + + ${exportFunctions(Core, 'export')} + + ${exportChainable(name, blocks)} + + export = ${name}; + } + `); + writeFile(`${lower}/extended.d.ts`, exportExtendedModule(name, blocks)); +} + +function exportChainables(modules) { + const chainables = []; + for (let [name, blocks] of Object.entries(modules)) { + chainables.push(exportChainable(name, blocks)); + } + return chainables.join('\n\n'); +} + +function exportChainable(name, blocks) { + return indent` + + // ${name} Chainable + + ${exportTypedefs(blocks)} + + class ${name} extends SugarChainable { + ${exportFunctions(blocks, 'static')} + ${exportFunctions(blocks, 'instance')} + } + `; +} + +function buildMain(Core, other) { + writeFile('index.d.ts', indent` + declare module 'sugar' { + + ${exportOptionTypes(Core)} + + ${exportClasses(Core)} + + namespace Sugar { + ${exportConstants(Core)} + + ${exportFunctions(Core, 'namespace')} + + ${exportChainables(other)} + } + export = Sugar; + } + `); + writeFile('extended.d.ts', exportExtendedModules(other)); +} + +function exportExtendedModules(modules) { + const interfaces = []; + for (let [name, blocks] of Object.entries(modules)) { + interfaces.push(exportExtendedModule(name, blocks)); + } + return interfaces.join('\n\n'); +} + +function exportExtendedModule(name, blocks) { + return indent` + + ${exportTypedefs(blocks)} + + ${exportOptionTypes(blocks)} + + interface ${name} { + ${exportFunctions(blocks, 'instance')} + } + `; +} + +function exportClasses(blocks) { + return exportBlocks(blocks.filter((b) => b.kind === 'class')); +} + +function exportTypedefs(blocks) { + return exportBlocks(blocks.filter((b) => b.kind === 'typedef')); +} + +function exportConstants(blocks) { + return exportBlocks(blocks.filter((b) => b.kind === 'constant')); +} + +function exportOptionTypes(blocks) { + return exportBlocks(getFlatOptions(blocks)); +} + +function getFlatOptions(blocks) { + return getFlatMembers(blocks).flatMap((block) => { + return block.options; + }); +} + +function getFlatMembers(blocks) { + return blocks.flatMap((block) => { + return [block, ...getFlatMembers(block.members)]; + }); +} + +function exportFunctions(blocks, type) { + return exportBlocks(blocks.filter((b) => b.kind === 'function'), type); +} + +function indent(chunks, ...injected) { + let str = '', lines = []; + for (let [i, chunk] of Object.entries(chunks)) { + str += chunk; + str += injected[i] || ''; + } + let indent = 0, lastWasEmpty = false; + for (let line of str.trim().split('\n')) { + line = line.trim(); + if (line.match(/}/)) { + indent--; + } + if (line) { + lines.push(' '.repeat(indent) + line); + } else if (!lastWasEmpty) { + lines.push(line); + } + if (line.match(/{/)) { + indent++; + } + lastWasEmpty = !line; + } + return lines.join('\n'); +} + +function exportBlocks(blocks, type = 'static') { + return blocks.map((block) => { + if (block.kind === 'function') { + return exportFunction(block, type); + } else if (block.kind === 'class') { + return exportClass(block); + } else if (block.kind === 'options') { + return exportOptions(block); + } else if (block.kind === 'typedef') { + return exportTypedef(block); + } else if (block.kind === 'constant') { + return exportConstant(block); + } else { + console.info(block); + throw new Error('Unknown kind'); + } + }).join('\n'); +} + +function exportTypedef(block) { + return `type ${block.name} = ${exportTypes(block)};`; +} + +function exportConstant(block) { + return `const ${block.name}: ${exportTypes(block)};`; +} + +function exportTypes(obj) { + return obj.type.names.join(' | '); +} + +function exportFunction(block, type) { + let output = ''; + if (type === 'static') { + output += 'static '; + } else if (type === 'export') { + output += 'export '; + } + output += exportFunctionName(block.name, type); + output += `(${exportParams(block.params, type)}): `; + output += `${exportReturns(block.returns)};`; + return output; +} + +function exportOptions(block) { + return indent` + type ${block.name} = { + ${exportParams(block.params, 'options')} + } + `; +} + +function exportClass(block) { + return indent` + class ${block.name} { + ${exportFunctions(block.members, 'static')} + } + `; +} + +function exportFunctionName(name, type) { + let str = ''; + if (type === 'namespace' || type === 'export') { + str += 'function '; + } + str += name; + return str; +} + +function exportParams(params, type) { + if (type === 'instance') { + params = params.slice(1); + } + const output = params.map((param) => exportParam(param)); + return output.join(type === 'options' ? ',\n' : ', '); +} + +function exportParam(param) { + let output = ''; + output += param.name; + if (param.optional) { + output += '?'; + } + output += `: ${exportTypes(param)}`; + return output; +} + +function exportReturns(returns) { + if (!returns.length) { + return 'void'; + } else { + return returns.map((ret) => { + if (ret.description && ret.description.match(/Constructor$/)) { + return `typeof ${ret.description.replace(/Constructor$/, '')}`; + } else { + return `${exportTypes(ret)}`; + } + }); + } +} + +// Utils + +function writeFile(file, code) { + const outputPath = path.resolve(argv.out, file); + fs.outputFileSync(outputPath, code); +} + +generateDeclares(); diff --git a/src/array/define.js b/src/array/define.js new file mode 100644 index 000000000..60862cafc --- /dev/null +++ b/src/array/define.js @@ -0,0 +1,4 @@ +import { defineInstance } from '../core/array'; +import * as methods from './methods'; + +defineInstance('groupBy', methods.groupBy); diff --git a/src/array/groupBy.js b/src/array/groupBy.js new file mode 100644 index 000000000..560bb9782 --- /dev/null +++ b/src/array/groupBy.js @@ -0,0 +1,53 @@ +import { mapWithShortcuts } from '../util/enumerable'; +import { hasOwnProperty, forEachProperty } from '../util/helpers'; + +/** + * Groups the array by `map` to an object. + * + * @param {Array} arr - The array. + * @param {mapFn|string} map - A function that maps the array elements to keys + * or a string acting as a shortcut (supports `deep properties`). + * @param {groupFn} [groupFn] - An optional callback that is called for each group. + * + * @callback mapFn + * + * el {number} The element of the current iteration. + * i {number} The index of the current iteration. + * arr {Array} A reference to the array. + * + * @callback groupFn + * + * arr {Array} The current group as an array. + * key {string} The unique key of the current group. + * obj {Object} A reference to the object. + * + * @example + * + * ['a','aa','aaa'].groupBy('length') -> { 1: ['a'], 2: ['aa'], 3: ['aaa'] } + * + * users.groupBy(function(n) { + * return n.age; + * }); -> users array grouped by age + * + * users.groupBy('age', function(age, users) { + * // iterates each grouping + * }); + * + * @returns {Object} + * + **/ +export default function groupBy(arr, map, groupFn) { + const result = {}; + for (let i = 0, len = arr.length; i < len; i++) { + const el = arr[i]; + const key = mapWithShortcuts(el, map, arr, [el, i, arr]); + if (!hasOwnProperty(result, key)) { + result[key] = []; + } + result[key].push(el); + } + if (groupFn) { + forEachProperty(result, groupFn); + } + return result; +} diff --git a/src/array/index.js b/src/array/index.js index 099e8c6c8..84f6973e9 100644 --- a/src/array/index.js +++ b/src/array/index.js @@ -1 +1,3 @@ export * from '../core/array'; +export * from './methods'; +import './define'; diff --git a/src/array/methods.js b/src/array/methods.js new file mode 100644 index 000000000..eaf22fa67 --- /dev/null +++ b/src/array/methods.js @@ -0,0 +1 @@ +export { default as groupBy } from './groupBy'; diff --git a/src/core/array.js b/src/core/array.js index 85bf9b270..262b5f15e 100644 --- a/src/core/array.js +++ b/src/core/array.js @@ -3,6 +3,7 @@ import { createNamespace } from '../core'; export const Array = createNamespace('Array'); export const { + extend, defineStatic, defineInstance, defineStaticAlias, diff --git a/src/core/function.js b/src/core/function.js index 18fc650d2..55df90190 100644 --- a/src/core/function.js +++ b/src/core/function.js @@ -1,13 +1,9 @@ import { createNamespace } from '../core'; - -/** - * @class Function - * @memberof module:function - */ export const Function = createNamespace('Function'); export const { + extend, defineStatic, defineInstance, defineStaticAlias, diff --git a/src/core/index.js b/src/core/index.js index 55ea6718b..9a16d6e5e 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,20 +1,26 @@ -/** @module core */ - import globalContext from './util/globalContext'; import NamespaceStore from './util/NamespaceStore'; import SugarChainableBase from './util/SugarChainableBase'; import { extendNative, restoreNative } from './util/extend'; -import { hasOwnProperty, forEachProperty, arrayIncludes } from './util/helpers'; +import { hasOwnProperty, forEachProperty, arrayIncludes } from '../util/helpers'; import { isString, isFunction } from '../util/typeChecks'; // --- Constants +/** @const {string} */ export const VERSION = 'edge'; // --- Setup /** - * createNamespace + * Creates a new Sugar namespace. This will be exposed on the Sugar object via + * `globalName`, as well as on the global namespace when extend functionality + * is enabled. + * + * @param {string} globalName - The name of the namespace to be created. This + * must match the name on the global context. + * + * @returns {Function} SugarChainableConstructor */ export function createNamespace(globalName) { @@ -23,29 +29,31 @@ export function createNamespace(globalName) { } if (Sugar[globalName]) { - return; + return Sugar[globalName]; } /** * A chainable object. + * * @param {*} obj - The object to be wrapped by the chainable. */ class SugarChainable extends SugarChainableBase { /** - * Extends Sugar defined methods onto natives. - * - * @example - * - * Sugar.Array.extend(); + * Extends Sugar defined methods onto built-in objects for this type. * * @param {Object} [options] - Options to control what methods are extended. * @param {Array} [options.include] - An array of methods to include - * when extending. + * when extending. Cannot be used together with `options.exclude`. * @param {Array} [options.exclude] - An array of methods to exclude - * when extending. - * @param {boolean} [options.existing] - Whether or not to override existing methods - * when extending. + * when extending. Cannot be used together with `options.include`. + * @param {boolean} [options.existing] - Whether or not to override existing + * methods when extending. This allows enhancements such as + * `['a','b','c'].find('a')`. Default is false. + * + * @example + * + * Sugar.Array.extend(); * */ static extend(opt) { @@ -54,6 +62,9 @@ export function createNamespace(globalName) { /** * defineStatic + * + * @param {string} name - Name of the static method to be defined. + * @param {Function} fn - Function to be added as a static method. */ static defineStatic(...args) { defineWithArgs(globalName, defineStatic, args); @@ -61,11 +72,16 @@ export function createNamespace(globalName) { /** * defineInstance + * + * @param {string} name - Name of the instance method to be defined. + * @param {Function} fn - Function to be added as a chainable instance method. */ static defineInstance(...args) { defineWithArgs(globalName, defineInstance, args); } + // TODO: aliases needed??? + /** * defineStaticAlias */ @@ -145,6 +161,23 @@ function wrapStaticMethodAsInstance(SugarChainable, fn) { // --- Extending +/** + * Extends Sugar defined methods onto all built-in objects. + * + * @param {Object} [options] - Options to control what methods are extended. + * @param {Array} [options.include] - An array of methods to include + * when extending. Cannot be used together with `options.exclude`. + * @param {Array} [options.exclude] - An array of methods to exclude + * when extending. Cannot be used together with `options.include`. + * @param {boolean} [options.existing] - Whether or not to override existing + * methods when extending. This allows enhancements such as + * `['a','b','c'].find('a')`. Default is false. + * + * @example + * + * Sugar.extend(); + * + */ export function extend(opt) { try { opt = collectExtendOptions(opt); @@ -161,6 +194,15 @@ export function extend(opt) { } } +/** + * Restores all built-ins to their original state, removing all Sugar defined + * methods. + * + * @example + * + * Sugar.restore(); + * + */ export function restore() { forEachNamespace(restoreNamespace); } diff --git a/src/core/number.js b/src/core/number.js index da3df67d3..ed7dbfcc4 100644 --- a/src/core/number.js +++ b/src/core/number.js @@ -3,6 +3,7 @@ import { createNamespace } from '../core'; export const Number = createNamespace('Number') export const { + extend, defineStatic, defineInstance, defineStaticAlias, diff --git a/src/core/object.js b/src/core/object.js index c1fb02dca..a787a69da 100644 --- a/src/core/object.js +++ b/src/core/object.js @@ -6,6 +6,7 @@ import { createNamespace } from '../core'; const Namespace = createNamespace('Object'); export const { + extend, defineStatic, defineInstance, defineStaticAlias, diff --git a/src/core/regexp.js b/src/core/regexp.js index a519a691c..5c7105c9a 100644 --- a/src/core/regexp.js +++ b/src/core/regexp.js @@ -3,6 +3,7 @@ import { createNamespace } from '../core'; export const RegExp = createNamespace('RegExp'); export const { + extend, defineStatic, defineInstance, defineStaticAlias, diff --git a/src/core/string.js b/src/core/string.js index 788786de6..46555235a 100644 --- a/src/core/string.js +++ b/src/core/string.js @@ -3,6 +3,7 @@ import { createNamespace } from '../core'; export const String = createNamespace('String'); export const { + extend, defineStatic, defineInstance, defineStaticAlias, diff --git a/src/core/util/NamespaceStore.js b/src/core/util/NamespaceStore.js index 627b8f51d..982e0211e 100644 --- a/src/core/util/NamespaceStore.js +++ b/src/core/util/NamespaceStore.js @@ -1,3 +1,4 @@ +import { hasOwnProperty } from '../../util/helpers'; export default class NamespaceStore { @@ -7,7 +8,7 @@ export default class NamespaceStore { has(name, member, isInstance) { const key = this.getKey(name, member, isInstance); - return this.store.hasOwnProperty(key); + return hasOwnProperty(this.store, key); } get(name, member, isInstance) { diff --git a/src/core/util/extend.js b/src/core/util/extend.js index 483d5b943..f97ba2d65 100644 --- a/src/core/util/extend.js +++ b/src/core/util/extend.js @@ -1,5 +1,5 @@ import NamespaceStore from './NamespaceStore'; -import { hasOwnProperty } from './helpers'; +import { hasOwnProperty } from '../../util/helpers'; const nativeDescriptors = new NamespaceStore(); diff --git a/src/function/debounce.js b/src/function/debounce.js index deee1d03a..795cec6ef 100644 --- a/src/function/debounce.js +++ b/src/function/debounce.js @@ -20,11 +20,8 @@ import { assertPositiveInteger } from '../util/assertions'; * * @returns {Function} * - * @method debounce - * @static - * */ -export function debounce(fn, ms = 0) { +export default function debounce(fn, ms = 0) { assertPositiveInteger(ms); diff --git a/src/function/index.js b/src/function/index.js index 30d509ab5..bee03b76a 100644 --- a/src/function/index.js +++ b/src/function/index.js @@ -1,22 +1,3 @@ -/** @module function */ - -/** - * @static - * @method memoize - * @see module:function/memoize - */ -/** - * @static - * @method throttle - * @see module:function/throttle - */ -/** - * @static - * @method debounce - * @see module:function/debounce - */ - export * from '../core/function'; export * from './methods'; import './define'; - diff --git a/src/function/memoize.js b/src/function/memoize.js index 7ce32bfba..a2117c8d7 100644 --- a/src/function/memoize.js +++ b/src/function/memoize.js @@ -1,4 +1,4 @@ -/** @module */ +import { hasOwnProperty } from '../util/helpers'; /** * Creates a function that will memoize results for unique calls. @@ -26,8 +26,6 @@ * * @param {Function} fn - The function to memoize. * @param {Function} [hashFn] - The function to memoize. - * - * @method memoize * @static * */ @@ -36,7 +34,7 @@ export default function memoize(fn, hashFn) { hashFn = hashFn || defaultHashFn; return function memoized() { const key = hashFn.apply(this, arguments); - if (cache.hasOwnProperty(key)) { + if (hasOwnProperty(cache, key)) { return cache[key]; } return cache[key] = fn.apply(this, arguments); diff --git a/src/function/throttle.js b/src/function/throttle.js index 917aa5c1c..181ef3211 100644 --- a/src/function/throttle.js +++ b/src/function/throttle.js @@ -1,5 +1,3 @@ -/** @module */ - import { assertPositiveInteger, assertPositiveIntegerOrInfinity, @@ -20,11 +18,6 @@ const DEFAULT_OPTIONS = { * will receive the first arguments before it was locked, where `debounce` * will receive the last. * - * @example - * - * var fn = throttle(logHello, 50); - * runTenTimes(fn); // Will only log once - * * @param {number} ms - The delay to throttle the function by. * @param {Object} [options] - Options to be passed to throttle. * @@ -33,17 +26,14 @@ const DEFAULT_OPTIONS = { * @param {string} [options.immediate = false] - Whether to perform the initial * execution immediately before waiting. * - * @returns Function + * @example + * + * var fn = throttle(logHello, 50); + * runTenTimes(fn); // Will only log once * - * @method throttle - * @static + * @returns {Function} * */ -/** - * @memberof module:function.Function - * @instance - * @param {number} foo - foooooooooooooo - */ export default function throttle(fn, ms = 0, options) { const opt = { diff --git a/src/number/abbr.js b/src/number/abbr.js index dd7ed9337..f4d1afd7d 100644 --- a/src/number/abbr.js +++ b/src/number/abbr.js @@ -1,5 +1,3 @@ -/** @module */ - import { assertFinite } from '../util/assertions'; import { trunc, round } from './util/math'; import { isNumber } from '../util/typeChecks'; @@ -32,9 +30,9 @@ const SAFE_PRECISION = 10; /** * Returns an abbreviated form of the number. * - * @param {string} n - The number. + * @param {number} n - The number. * - * @param {string} [precision] - When passed, will truncate + * @param {number} [precision] - When passed, will truncate * the number to the given precision. If null, the precision will * be 0 unless the number is between -1 and 1. A negative number * may also be passed. @@ -64,8 +62,6 @@ const SAFE_PRECISION = 10; * abbr(.15, 2, 'common'); // "150m" * abbr(1234, 2, null, deFormatter); // "1,23k" * - * @method abbr - * */ export default function abbr(n, precision, units, formatter) { diff --git a/src/regexp/define.js b/src/regexp/define.js index b4b102b74..35852035d 100644 --- a/src/regexp/define.js +++ b/src/regexp/define.js @@ -1,4 +1,4 @@ import { defineStatic } from '../core/regexp'; -import * as methods from './'; +import * as methods from './methods'; defineStatic('escape', methods.escape); diff --git a/src/string/capitalize.js b/src/string/capitalize.js new file mode 100644 index 000000000..5b26ef4bc --- /dev/null +++ b/src/string/capitalize.js @@ -0,0 +1 @@ +export { default } from './util/capitalize'; diff --git a/src/string/define.js b/src/string/define.js index 8f5e2920a..7a59ed761 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -1,4 +1,5 @@ -import { defineStatic } from '../core/string'; +import { defineStatic, defineInstance } from '../core/string'; import * as methods from './methods'; defineStatic('range', methods.range); +defineInstance('capitalize', methods.capitalize); diff --git a/src/string/methods.js b/src/string/methods.js index 53eee9fb5..c53a1174d 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -1 +1,2 @@ export { default as range } from './range'; +export { default as capitalize } from './capitalize'; diff --git a/src/string/util/capitalize.js b/src/string/util/capitalize.js new file mode 100644 index 000000000..4c936ff7f --- /dev/null +++ b/src/string/util/capitalize.js @@ -0,0 +1,31 @@ + +// Matches non-punctuation characters except apostrophe for capitalization. +const CAPITALIZE_REG = /[^\u0000-\u0040\u005B-\u0060\u007B-\u007F]+('s)?/g; + +/** + * Capitalizes the first character of the string. + * + * @param {string} str - The string. + * @param {boolean} [lower] - When `true` the remainder of the string will + * be lower case. Default is `false`. + * @param {boolean} [all] - When `true` all words in the string will be + * capitalized. Default is `false`. + * + * @example + * + * 'hello'.capitalize() -> 'Hello' + * 'HELLO'.capitalize(true) -> 'Hello' + * 'hello kitty'.capitalize() -> 'Hello kitty' + * 'hEllO kItTy'.capitalize(true, true) -> 'Hello Kitty' + * + **/ +export default function capitalize(str, downcase, all) { + if (downcase) { + str = str.toLowerCase(); + } + return all ? str.replace(CAPITALIZE_REG, caps) : caps(str); +} + +function caps(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} diff --git a/src/util/assertions.js b/src/util/assertions.js index 164c48fc9..ba835dafd 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -1,3 +1,4 @@ +import { isArray, isFunction, isPrimitive } from './typeChecks'; const MIN = 1e-6; const MAX = 1e21; @@ -51,3 +52,31 @@ export function assertDecimal(n) { throw new TypeError(n + ' cannot be represented as a decimal'); } } + +export function assertArgument(exists) { + if (!exists) { + throw new TypeError('Argument required'); + } +} + +export function assertCallable(obj) { + if (!isFunction(obj)) { + throw new TypeError('Function is not callable'); + } +} + +export function assertArray(obj) { + if (!isArray(obj)) { + throw new TypeError('Array required'); + } +} + +export function assertWritable(obj) { + if (isPrimitive(obj)) { + // If strict mode is active then primitives will throw an + // error when attempting to write properties. We can't be + // sure if strict mode is available, so pre-emptively + // throw an error here to ensure consistent behavior. + throw new TypeError('Property cannot be written'); + } +} diff --git a/src/util/class.js b/src/util/class.js new file mode 100644 index 000000000..c6dfa6f8e --- /dev/null +++ b/src/util/class.js @@ -0,0 +1,16 @@ +const toString = Object.prototype.toString; + +// PERF: Attempts to speed this method up get very Heisenbergy. Quickly +// returning based on typeof works for primitives, but slows down object +// types. Even === checks on null and undefined (no typeof) will end up +// basically breaking even. This seems to be as fast as it can go. +export function classToString(obj) { + return toString.call(obj); +} + +export function isClass(obj, className, classTag) { + if (!classTag) { + classTag = classToString(obj); + } + return classTag === '[object '+ className +']'; +} diff --git a/src/util/deepProperties.js b/src/util/deepProperties.js new file mode 100644 index 000000000..a2d5b5c0c --- /dev/null +++ b/src/util/deepProperties.js @@ -0,0 +1,164 @@ +import { isString, isObjectType } from './typeChecks'; +import { isDefined, hasOwnProperty } from './helpers'; +import { assertArray, assertWritable } from './assertions'; + +export function deepHasProperty(obj, key, any) { + return handleDeepProperty(obj, key, any, true); +} + +export function deepGetProperty(obj, key, any) { + return handleDeepProperty(obj, key, any, false); +} + +export function deepSetProperty(obj, key, val) { + handleDeepProperty(obj, key, false, false, true, false, val); + return obj; +} + +// Matches 1..2 style ranges in properties. +const PROPERTY_RANGE_REG = /^(.*?)\[([-\d]*)\.\.([-\d]*)\](.*)$/; + +function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { + var ns, bs, ps, cbi, set, isLast, isPush, isIndex, nextIsIndex, exists; + ns = obj; + if (key == null) return; + + if (isObjectType(key)) { + // Allow array and array-like accessors + bs = [key]; + } else { + key = String(key); + if (key.indexOf('..') !== -1) { + return handleArrayIndexRange(obj, key, any, val); + } + bs = key.split('['); + } + + set = isDefined(val); + + for (var i = 0, blen = bs.length; i < blen; i++) { + ps = bs[i]; + + if (isString(ps)) { + ps = ps.split('.'); + } + + for (var j = 0, plen = ps.length; j < plen; j++) { + key = ps[j]; + + // Is this the last key? + isLast = i === blen - 1 && j === plen - 1; + + // Index of the closing ] + cbi = key.indexOf(']'); + + // Is the key an array index? + isIndex = cbi !== -1; + + // Is this array push syntax "[]"? + isPush = set && cbi === 0; + + // If the bracket split was successful and this is the last element + // in the dot split, then we know the next key will be an array index. + nextIsIndex = blen > 1 && j === plen - 1; + + if (isPush) { + // Set the index to the end of the array + key = ns.length; + } else if (isIndex) { + // Remove the closing ] + key = key.slice(0, -1); + } + + // If the array index is less than 0, then + // add its length to allow negative indexes. + if (isIndex && key < 0) { + key = +key + ns.length; + } + + // Bracket keys may look like users[5] or just [5], so the leading + // characters are optional. We can enter the namespace if this is the + // 2nd part, if there is only 1 part, or if there is an explicit key. + if (i || key || blen === 1) { + + // TODO: need to be sure this check handles ''.length when + // we refactor. + exists = any ? key in Object(ns) : hasOwnProperty(ns, key); + + // Non-existent namespaces are only filled if they are intermediate + // (not at the end) or explicitly filling the last. + if (fill && (!isLast || fillLast) && !exists) { + // For our purposes, last only needs to be an array. + ns = ns[key] = nextIsIndex || (fillLast && isLast) ? [] : {}; + continue; + } + + if (has) { + if (isLast || !exists) { + return exists; + } + } else if (set && isLast) { + assertWritable(ns); + ns[key] = val; + } + + ns = exists ? ns[key] : undefined; + } + + } + } + return ns; +} + +// Get object property with support for 0..1 style range notation. +function handleArrayIndexRange(obj, key, any, val) { + var match, start, end, leading, trailing, arr, set; + match = key.match(PROPERTY_RANGE_REG); + if (!match) { + return; + } + + set = isDefined(val); + leading = match[1]; + + if (leading) { + arr = handleDeepProperty(obj, leading, any, false, set ? true : false, true); + } else { + arr = obj; + } + + assertArray(arr); + + trailing = match[4]; + start = match[2] ? +match[2] : 0; + end = match[3] ? +match[3] : arr.length; + + // A range of 0..1 is inclusive, so we need to add 1 to the end. If this + // pushes the index from -1 to 0, then set it to the full length of the + // array, otherwise it will return nothing. + end = end === -1 ? arr.length : end + 1; + + if (set) { + for (var i = start; i < end; i++) { + handleDeepProperty(arr, i + trailing, any, false, true, false, val); + } + } else { + arr = arr.slice(start, end); + + // If there are trailing properties, then they need to be mapped for each + // element in the array. + if (trailing) { + if (trailing.charAt(0) === '.') { + // Need to chomp the period if one is trailing after the range. We + // can't do this at the regex level because it will be required if + // we're setting the value as it needs to be concatentated together + // with the array index to be set. + trailing = trailing.slice(1); + } + return arr.map((el) => { + return handleDeepProperty(el, trailing); + }); + } + } + return arr; +} diff --git a/src/util/enumerable.js b/src/util/enumerable.js new file mode 100644 index 000000000..9e16c245a --- /dev/null +++ b/src/util/enumerable.js @@ -0,0 +1,18 @@ +import { isArray, isFunction } from './typeChecks'; +import { deepGetProperty } from './deepProperties'; + +export function mapWithShortcuts(el, map, context, mapArgs) { + if (!map) { + return el; + } else if (map.apply) { + return map.apply(context, mapArgs); + } else if (isArray(map)) { + return map.map((m) => { + return mapWithShortcuts(el, m, context, mapArgs); + }); + } else if (isFunction(el[map])) { + return el[map].call(el); + } else { + return deepGetProperty(el, map, true); + } +} diff --git a/src/core/util/helpers.js b/src/util/helpers.js similarity index 61% rename from src/core/util/helpers.js rename to src/util/helpers.js index 42d8b6cbd..df2020449 100644 --- a/src/core/util/helpers.js +++ b/src/util/helpers.js @@ -1,6 +1,8 @@ +const hasOwn = Object.prototype.hasOwnProperty; + export function hasOwnProperty(obj, prop) { - return !!obj && Object.prototype.hasOwnProperty.call(obj, prop); + return !!obj && hasOwn.call(obj, prop); } export function forEachProperty(obj, fn) { @@ -13,3 +15,11 @@ export function forEachProperty(obj, fn) { export function arrayIncludes(arr, el) { return arr.includes ? arr.includes(el) : arr.indexOf(el) !== -1; } + +export function isDefined(o) { + return o !== undefined; +} + +export function isUndefined(o) { + return o === undefined; +} diff --git a/src/util/object.js b/src/util/object.js new file mode 100644 index 000000000..853eb0626 --- /dev/null +++ b/src/util/object.js @@ -0,0 +1,127 @@ +import { isObjectType } from './typeChecks'; +import { hasOwnProperty, forEachProperty } from './helpers'; +import { isClass } from './class'; + +export function isPlainObject(obj, classTag) { + return isObjectType(obj) + && isClass(obj, 'Object', classTag) + && hasValidPlainObjectPrototype(obj) + && hasOwnEnumeratedProperties(obj); +} + +export function isSerializable(obj, classTag) { + // Only known objects can be serialized. This notably excludes functions, + // host objects, Symbols (which are matched by reference), and instances + // of classes. The latter can arguably be matched by value, but + // distinguishing between these and host objects -- which should never be + // compared by value -- is very tricky so not dealing with it here. + return isKnownClassTag(classTag) || isPlainObject(obj, classTag); +} + +export function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { + + function next(val, key) { + var cyc = false; + + // Allowing a step into the structure before triggering this check to save + // cycles on standard JSON structures and also to try as hard as possible to + // catch basic properties that may have been modified. + if (stack.length > 1) { + var i = stack.length; + while (i--) { + if (stack[i] === val) { + cyc = true; + } + } + } + + stack.push(val); + fn(key, val, cyc, stack); + stack.pop(); + } + + function iterateWithSortedKeys() { + // Sorted keys is required for serialization, where object order + // does not matter but stringified order does. + var arr = Object.keys(obj).sort(), key; + for (var i = 0; i < arr.length; i++) { + key = arr[i]; + next(obj[key], arr[i]); + } + } + + // This method for checking for cyclic structures was egregiously stolen from + // the ingenious method by @kitcambridge from the Underscore script: + // https://github.com/documentcloud/underscore/issues/240 + if (!stack) { + stack = []; + } + + if (sortedKeys) { + iterateWithSortedKeys(); + } else { + forEachProperty(obj, next); + } +} + +// Add core types as known so that they can be checked by value below, +// notably excluding Functions and adding Arguments and Error. +const KNOWN_CLASS_TAGS = [ + 'Arguments', + 'Boolean', + 'Number', + 'String', + 'Date', + 'RegExp', + 'Error', + 'Array', + 'Set', + 'Map', + 'Int8Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'Int16Array', + 'Uint16Array', + 'Int32Array', + 'Uint32Array', + 'Float32Array', + 'Float64Array', +].reduce((tags, className) => { + tags[`[object ${className}]`] = true; + return tags; +}, {}); + +function isKnownClassTag(classTag) { + return !!KNOWN_CLASS_TAGS[classTag]; +} + +function hasValidPlainObjectPrototype(obj) { + var hasToString = 'toString' in obj; + var hasConstructor = 'constructor' in obj; + // An object created with Object.create(null) has no methods in the + // prototype chain, so check if any are missing. The additional hasToString + // check is for false positives on some host objects in old IE which have + // toString but no constructor. If the object has an inherited constructor, + // then check if it is Object (the "isPrototypeOf" tapdance here is a more + // robust way of ensuring this if the global has been hijacked). Note that + // accessing the constructor directly (without "in" or "hasOwnProperty") + // will throw a permissions error in IE8 on cross-domain windows. + return (!hasConstructor && !hasToString) + || (hasConstructor && !hasOwnProperty(obj, 'constructor') + && hasOwnProperty(obj.constructor.prototype, 'isPrototypeOf')); +} + +function hasOwnEnumeratedProperties(obj) { + // Plain objects are generally defined as having enumerated properties + // all their own, however in early IE environments without defineProperty, + // there may also be enumerated methods in the prototype chain, so check + // for both of these cases. + var objectProto = Object.prototype; + for (var key in obj) { + var val = obj[key]; + if (!hasOwnProperty(obj, key) && val !== objectProto[key]) { + return false; + } + } + return true; +} diff --git a/src/util/serialize.js b/src/util/serialize.js new file mode 100644 index 000000000..e09d99c69 --- /dev/null +++ b/src/util/serialize.js @@ -0,0 +1,48 @@ +import { isPrimitive, isObjectType, isRealNaN } from '../typeChecks'; +import { isSerializable, iterateWithCyclicCheck } from './object'; +import { classToString } from './class'; + +// Serializes an object in a way that will provide a token unique +// to the type, class, and value of an object. Host objects, class +// instances etc, are not serializable, and are held in an array +// of references that will return the index as a unique identifier +// for the object. This array is passed from outside so that the +// calling function can decide when to dispose of this array. +export function serialize(obj, refs, stack) { + var type = typeof obj, sign = '', className, value, ref; + + // Check for -0 + if (1 / obj === -Infinity) { + sign = '-'; + } + + // Return quickly for primitives to save cycles + if (isPrimitive(obj, type) && !isRealNaN(obj)) { + return type + sign + obj; + } + + className = classToString(obj); + + if (!isSerializable(obj, className)) { + ref = refs.indexOf(obj); + if (ref === -1) { + ref = refs.length; + refs.push(obj); + } + return ref; + } else if (isObjectType(obj)) { + value = serializeDeep(obj, refs, stack) + obj.toString(); + } else if (obj.valueOf) { + value = obj.valueOf(); + } + return type + className + sign + value; +} + +function serializeDeep(obj, refs, stack) { + var result = ''; + iterateWithCyclicCheck(obj, true, stack, function(key, val, cyc, stack) { + result += cyc ? 'CYC' : key + serialize(val, refs, stack); + }); + return result; +} + diff --git a/src/util/typeChecks.js b/src/util/typeChecks.js index 4aad24ea6..c206a3a23 100644 --- a/src/util/typeChecks.js +++ b/src/util/typeChecks.js @@ -1,11 +1,73 @@ -export function isNumber(obj) { - return typeof obj === 'number'; +import { isClass } from './class'; + +export const isBoolean = buildPrimitiveClassCheck('Boolean'); +export const isNumber = buildPrimitiveClassCheck('Number'); +export const isString = buildPrimitiveClassCheck('String'); + +export const isDate = buildClassCheck('Date'); +export const isRegExp = buildClassCheck('RegExp'); + +export const isError = buildClassCheck('Error'); + +export const isArray = Array.isArray || buildClassCheck('Array'); + +export const isSet = buildClassCheck('Set', typeof Set !== 'undefined' && Set); +export const isMap = buildClassCheck('Map', typeof Map !== 'undefined' && Map); + +// Wanted to enhance performance here by using simply "typeof" +// but Firefox has two major issues that make this impossible, +// one fixed, the other not, so perform a full class check here. +// +// 1. Regexes can be typeof "function" in FF < 3 +// https://bugzilla.mozilla.org/show_bug.cgi?id=61911 (fixed) +// +// 2. HTMLEmbedElement and HTMLObjectElement are be typeof "function" +// https://bugzilla.mozilla.org/show_bug.cgi?id=268945 (won't fix) +export const isFunction = buildClassCheck('Function'); + +export function isPrimitive(obj, type) { + type = type || typeof obj; + return obj == null || type === 'string' || type === 'number' || type === 'boolean'; +} + +export function isRealNaN(obj) { + // This is only true of NaN + return obj != null && obj !== obj; +} + +export function isObjectType(obj, type) { + return !!obj && (type || typeof obj) === 'object'; +} + +function buildPrimitiveClassCheck(className) { + const type = className.toLowerCase(); + return function(obj) { + const t = typeof obj; + return t === type || t === 'object' && isClass(obj, className); + }; +} + +function buildClassCheck(className, Constructor) { + if (Constructor && isClass(new Constructor, 'Object')) { + // Map and Set may be [object Object] in IE 11. + // In this case we need to perform a check using the constructor + // instead of Object.prototype.toString. + return getConstructorClassCheck(Constructor); + } else { + return getToStringClassCheck(className); + } } -export function isString(obj) { - return typeof obj === 'string'; +function getToStringClassCheck(className) { + return function(obj, str) { + // perf: Returning up front on instanceof appears to be slower. + return isClass(obj, className, str); + }; } -export function isFunction(obj) { - return typeof obj === 'function'; +function getConstructorClassCheck(obj) { + const ctorStr = String(obj); + return function(obj) { + return String(obj.constructor) === ctorStr; + }; } diff --git a/test/.eslintrc b/test/.eslintrc index 7a2b6468c..0cefdfb77 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,11 +1,43 @@ { + "env": { + "es6": false, + "node": true, + "browser": true, + }, "rules": { - "no-undef": ["off"], - "comma-dangle": ["error"], - "no-global-assign": [ - "error", { - "exceptions": ["Number"] - } - ] + 'no-global-assign': 'off', + }, + "globals": { + it: true, + add: true, + mult: true, + noop: true, + arg2: true, + args: true, + clock: true, + square: true, + concatA: true, + describe: true, + namespace: true, + describeStatic: true, + describeInstance: true, + afterEach: true, + beforeEach: true, + assertNaN: true, + assertNull: true, + assertTrue: true, + assertFalse: true, + assertMatch: true, + assertOneOf: true, + assertEqual: true, + assertError: true, + assertNoError: true, + assertUndefined: true, + assertArrayEqual: true, + assertObjectEqual: true, + assertInstanceOf: true, + withNumberFormatter: true, + ensureNamespaceNotInitialized: true, + Sugar: true, } } diff --git a/test/index.html b/test/index.html index 4817bf90e..a656d35cf 100644 --- a/test/index.html +++ b/test/index.html @@ -20,6 +20,7 @@ + diff --git a/test/tests/array.js b/test/tests/array.js new file mode 100644 index 000000000..5fcd3c8a3 --- /dev/null +++ b/test/tests/array.js @@ -0,0 +1,111 @@ +'use strict'; + +namespace('Array', function() { + + describeInstance('groupBy', function(groupBy) { + + var basic = [ + { a: 1, b: 2 }, + { a: 1, b: 3 }, + { a: 2, b: 3 }, + ]; + + var people = [ + { name: { first: 'Jim', last: 'Beam' }, age: 52 }, + { name: { first: 'Edmund', last: 'Edgar' }, age: 27 }, + { name: { first: 'Jim', last: 'Croche' }, age: 27 }, + { name: { first: 'Ron', last: 'Howard' }, age: 13 } + ]; + + it('should group empty arrays', function () { + assertObjectEqual(groupBy([]), {}); + }); + + it('should group by function', function () { + assertObjectEqual( + groupBy(basic, function(el) { + return el['a']; + }), + { + 1: [{ a: 1, b: 2 }, { a: 1, b: 3 }], + 2: [{ a: 2, b: 3 }], + } + ); + assertObjectEqual( + groupBy(people, function(person) { + return person.age; + }), + { + 52: [people[0]], + 27: [people[1], people[2]], + 13: [people[3]], + } + ); + }); + + it('should group by identity', function () { + assertObjectEqual(groupBy([1,1,2,2,3,3,4]), {1:[1,1],2:[2,2],3:[3,3],4:[4]}); + assertObjectEqual(groupBy(['a','b','a','e']), {'a':['a','a'],'b':['b'],'e':['e']}); + }); + + it('should group by string shortcut', function () { + assertObjectEqual( + groupBy(basic, 'a'), + { + 1: [{ a: 1, b: 2 }, { a: 1, b: 3 }], + 2: [{ a: 2, b: 3 }], + } + ); + assertObjectEqual( + groupBy(['one','two','three'], 'length'), + { + 3: ['one', 'two'], + 5: ['three'], + } + ); + }); + + it('should group by deep shortcut', function () { + assertObjectEqual( + groupBy(people, 'name.first'), + { + 'Jim': [ + { name: { first: 'Jim', last: 'Beam' }, age: 52 }, + { name: { first: 'Jim', last: 'Croche' }, age: 27 }, + ], + 'Edmund': [ + { name: { first: 'Edmund', last: 'Edgar' }, age: 27 }, + ], + 'Ron': [ + { name: { first: 'Ron', last: 'Howard' }, age: 13 } + ], + } + ); + }); + + it('should call a function if necessary', function () { + const arr = [ + { name: function() { return 'Jim'; } }, + ]; + assertObjectEqual( + groupBy(arr, 'name'), + { + 'Jim': [ + arr[0], + ], + } + ); + }); + + it('should have correct arguments', function () { + groupBy(['a'], function(el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertArrayEqual(this, ['a']); + }); + }); + + }); + +}); diff --git a/test/tests/modules/customized.js b/test/tests/modules/customized.js index 8dd39c2c7..9ecb7910e 100644 --- a/test/tests/modules/customized.js +++ b/test/tests/modules/customized.js @@ -6,7 +6,6 @@ defineInstance('abbr', abbr); // TODO //import 'sugar/string/capitalize/define'; import { Number } from '../../../src/core/number'; -import { String } from '../../../src/core/string'; describe('Customized Module', function() { diff --git a/test/tests/object.js b/test/tests/object.js new file mode 100644 index 000000000..e69de29bb diff --git a/test/tests/string.js b/test/tests/string.js index b2cd598ec..0fc60defd 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -101,4 +101,72 @@ namespace('String', function() { }); + describeInstance('capitalize', function(capitalize) { + + it('should capitalize basic latin characters', function() { + assertEqual(capitalize('wasabi'), 'Wasabi'); + assertEqual(capitalize('Wasabi'), 'Wasabi'); + assertEqual(capitalize('WASABI'), 'WASABI'); + assertEqual(capitalize('WasAbI'), 'WasAbI'); + assertEqual(capitalize('wasabi sandwich'), 'Wasabi sandwich'); + assertEqual(capitalize('WASABI SANDWICH'), 'WASABI SANDWICH'); + assertEqual(capitalize("wasabi's SANDWICH"), "Wasabi's SANDWICH"); + assertEqual(capitalize(''), ''); + }); + + it('should force lower case', function() { + assertEqual(capitalize('wasabi', true), 'Wasabi'); + assertEqual(capitalize('Wasabi', true), 'Wasabi'); + assertEqual(capitalize('WASABI', true), 'Wasabi'); + assertEqual(capitalize('WasAbI', true), 'Wasabi'); + assertEqual(capitalize('wasabi sandwich', true), 'Wasabi sandwich'); + assertEqual(capitalize('WASABI SANDWICH', true), 'Wasabi sandwich'); + assertEqual(capitalize("wasabi's SANDWICH", true), "Wasabi's sandwich"); + assertEqual(capitalize("wasabis' SANDWICH", true), "Wasabis' sandwich"); + assertEqual(capitalize('reuben sandwich', true), 'Reuben sandwich'); + assertEqual(capitalize('фыва йцук', true), 'Фыва йцук'); + }); + + it('should work on all words', function() { + assertEqual(capitalize('wasabi', false, true), 'Wasabi'); + assertEqual(capitalize('Wasabi', false, true), 'Wasabi'); + assertEqual(capitalize('WASABI', false, true), 'WASABI'); + assertEqual(capitalize('WasAbI', false, true), 'WasAbI'); + assertEqual(capitalize('wasabi sandwich', false, true), 'Wasabi Sandwich'); + assertEqual(capitalize('WASABI SANDWICH', false, true), 'WASABI SANDWICH'); + assertEqual(capitalize("wasabi's SANDWICH", false, true), "Wasabi's SANDWICH"); + assertEqual(capitalize("'you' and 'me'", false, true), "'You' And 'Me'"); + }); + + it('should downcase with all words', function() { + assertEqual(capitalize('wasabi', true, true), 'Wasabi'); + assertEqual(capitalize('Wasabi', true, true), 'Wasabi'); + assertEqual(capitalize('WASABI', true, true), 'Wasabi'); + assertEqual(capitalize('WasAbI', true, true), 'Wasabi'); + assertEqual(capitalize('wasabi sandwich', true, true), 'Wasabi Sandwich'); + assertEqual(capitalize('WASABI SANDWICH', true, true), 'Wasabi Sandwich'); + assertEqual(capitalize("wasabi's SANDWICH", true, true), "Wasabi's Sandwich"); + + assertEqual(capitalize('reuben-sandwich', true, true), 'Reuben-Sandwich'); + assertEqual(capitalize('reuben(sandwich)', true, true), 'Reuben(Sandwich)'); + assertEqual(capitalize('reuben,sandwich', true, true), 'Reuben,Sandwich'); + assertEqual(capitalize('reuben;sandwich', true, true), 'Reuben;Sandwich'); + assertEqual(capitalize('reuben.sandwich', true, true), 'Reuben.Sandwich'); + assertEqual(capitalize('reuben_sandwich', true, true), 'Reuben_Sandwich'); + assertEqual(capitalize('reuben\nsandwich', true, true), 'Reuben\nSandwich'); + assertEqual(capitalize("reuben's sandwich", true, true), "Reuben's Sandwich"); + + assertEqual(capitalize('фыва-йцук', true, true), 'Фыва-Йцук'); + assertEqual(capitalize('фыва,йцук', true, true), 'Фыва,Йцук'); + assertEqual(capitalize('фыва;йцук', true, true), 'Фыва;Йцук'); + assertEqual(capitalize('фыва7йцук', true, true), 'Фыва7Йцук'); + + assertEqual(capitalize('what a shame of a title', true, true), 'What A Shame Of A Title'); + assertEqual(capitalize('What A Shame Of A Title', true, true), 'What A Shame Of A Title'); + assertEqual(capitalize(' what a shame of a title ', true, true), ' What A Shame Of A Title '); + assertEqual(capitalize(' what a shame of\n a title ', true, true), ' What A Shame Of\n A Title '); + }); + + }); + }); diff --git a/webpack.config.js b/webpack.config.js index 40ce50f6d..876315fb3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,6 @@ const path = require('path'); const VERSION = require('./package.json').version; +const CircularDependencyPlugin = require('circular-dependency-plugin'); module.exports = { mode: 'development', @@ -30,5 +31,12 @@ module.exports = { } } ] - } + }, + plugins: [ + new CircularDependencyPlugin({ + exclude: /node_modules/, + failOnError: true, + cwd: process.cwd(), + }), + ], }; diff --git a/yarn.lock b/yarn.lock index 6187fe835..0ef613533 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,662 +2,807 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.0.0" + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.4.tgz#706a6484ee6f910b719b696a9194f8da7d7ac241" + integrity sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" "@babel/core@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91" - integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" - "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.2" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" - convert-source-map "^1.1.0" + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d" + integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + convert-source-map "^1.7.0" debug "^4.1.0" - json5 "^2.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" - integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== +"@babel/generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" + integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== dependencies: - "@babel/types" "^7.6.0" + "@babel/types" "^7.10.4" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.10.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" +"@babel/helper-create-class-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz#2d4015d0136bd314103a70d84a7183e4b344a355" + integrity sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092" + integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.4" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.10.4" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" + integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.10.4" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== +"@babel/helper-module-transforms@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d" + integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.10.4" -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" - integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== +"@babel/helper-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d" + integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.4", "@babel/parser@^7.9.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" + integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== + +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz#4b65abb3d9bacc6c657aaa413e56696f9f170fc6" + integrity sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg== dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== dependencies: - "@babel/types" "^7.4.4" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/helpers@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" - integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/parser@^7.6.0", "@babel/parser@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" - integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== +"@babel/plugin-proposal-object-rest-spread@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz#50129ac216b9a6a55b3853fdd923e74bf553a4c0" + integrity sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== +"@babel/plugin-proposal-optional-chaining@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7" + integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" - integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" - integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-dynamic-import@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-async-to-generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-transform-block-scoping@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" - integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== +"@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + +"@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz#a670d1364bb5019a621b9ea2001482876d734787" + integrity sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== +"@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" - integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== +"@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" - integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-duplicate-keys@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" - integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== +"@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== +"@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== +"@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== +"@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" - integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== +"@babel/plugin-transform-modules-amd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz#cb407c68b862e4c1d13a2fc738c7ec5ed75fc520" + integrity sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA== dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" - integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== +"@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz#8f576afd943ac2f789b35ded0a6312f929c633f9" + integrity sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz#c1ca0bb84b94f385ca302c3932e870b0fb0e522b" - integrity sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== dependencies: - regexpu-core "^4.6.0" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-object-super@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" - integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== +"@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== +"@babel/plugin-transform-parameters@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz#7b4d137c87ea7adc2a0f3ebf53266871daa6fced" + integrity sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ== dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== +"@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== +"@babel/plugin-transform-regenerator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: - regenerator-transform "^0.14.0" + regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-runtime@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8" - integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.4.tgz#594fb53453ea1b6f0779cceb48ce0718a447feb7" + integrity sha512-8ULlGv8p+Vuxu+kz2Y1dk6MYS2b/Dki+NO6/0ZlfSj5tMalfDL7jI/o/2a+rrWLqSXvnadEqc2WguB4gdQIxZw== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== +"@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" - integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== +"@babel/plugin-transform-spread@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz#4e2c85ea0d6abaee1b24dcfbbae426fe8d674cff" + integrity sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== +"@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz#e6375407b30fcb7fcfdbba3bb98ef3e9d36df7bc" + integrity sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" - integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-env@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.2.tgz#abbb3ed785c7fe4220d4c82a53621d71fc0c75d3" - integrity sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q== +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.2" - "@babel/plugin-transform-classes" "^7.5.5" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.6.2" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.6.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.2" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.6.2" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.6.2" - "@babel/types" "^7.6.0" - browserslist "^4.6.0" - core-js-compat "^3.1.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.6.2": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f" + integrity sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw== + dependencies: + "@babel/compat-data" "^7.10.4" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.10.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.10.4" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.10.4" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.4" + browserslist "^4.12.0" + core-js-compat "^3.6.2" invariant "^2.2.2" - js-levenshtein "^1.1.3" + levenary "^1.1.1" semver "^5.5.0" -"@babel/runtime@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" - integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg== +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== dependencies: - regenerator-runtime "^0.13.2" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" -"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" - integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.2" - "@babel/types" "^7.6.0" +"@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" + integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" + integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" - integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== +"@babel/types@^7.10.4", "@babel/types@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" + integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.13" to-fast-properties "^2.0.0" -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" - integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" + integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== dependencies: type-detect "4.0.8" @@ -683,150 +828,159 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/json-schema@^7.0.4": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -839,15 +993,20 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" - integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== +acorn@^7.2.0: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== ajv-errors@^1.0.0: version "1.0.1" @@ -855,35 +1014,35 @@ ajv-errors@^1.0.0: integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + version "3.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957" + integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA== -ajv@^6.1.0, ajv@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -891,6 +1050,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -907,18 +1074,17 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + sprintf-js "~1.0.2" argv@^0.0.2: version "0.0.2" @@ -972,30 +1138,36 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== babel-loader@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" pify "^4.0.1" + schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -1033,19 +1205,31 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" -bluebird@^3.5.5: - version "3.7.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" - integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== +bluebird@^3.5.5, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== brace-expansion@^1.1.7: version "1.1.11" @@ -1114,7 +1298,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -1123,17 +1307,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -1142,14 +1328,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.6.0, browserslist@^4.6.6: - version "4.7.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" - integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== +browserslist@^4.12.0, browserslist@^4.8.5: + version "4.13.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d" + integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ== dependencies: - caniuse-lite "^1.0.30000989" - electron-to-chromium "^1.3.247" - node-releases "^1.1.29" + caniuse-lite "^1.0.30001093" + electron-to-chromium "^1.3.488" + escalade "^3.0.1" + node-releases "^1.1.58" buffer-from@^1.0.0: version "1.1.1" @@ -1162,9 +1349,9 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1176,9 +1363,9 @@ builtin-status-codes@^3.0.0: integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -1211,17 +1398,29 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30000989: - version "1.0.30000998" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744" - integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ== +caniuse-lite@^1.0.30001093: + version "1.0.30001099" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001099.tgz#540118fcc6842d1fde62f4ee5521d1ec6afdb40e" + integrity sha512-sdS9A+sQTk7wKoeuZBN/YMAHVztUfVnjDi4/UV3sDE8xoh7YR12hKW+pIdB3oqKGwr9XaFL2ovfzt9w8eUI5CA== -chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: +catharsis@^0.8.11: + version "0.8.11" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" + integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== + dependencies: + lodash "^4.17.14" + +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1230,7 +1429,15 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chokidar@^2.0.2: +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -1249,10 +1456,10 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.1.tgz#4634772a1924512d990d4505957bf3a510611387" - integrity sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w== +chokidar@^3.2.1, chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -1260,14 +1467,14 @@ chokidar@^3.2.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.1.3" + readdirp "~3.4.0" optionalDependencies: - fsevents "~2.1.0" + fsevents "~2.1.2" chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: version "1.0.2" @@ -1284,6 +1491,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular-dependency-plugin@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" + integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1303,10 +1515,14 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" collection-visit@^1.0.0: version "1.0.0" @@ -1323,15 +1539,27 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commander@^2.20.0: - version "2.20.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" - integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commondir@^1.0.1: version "1.0.1" @@ -1359,26 +1587,19 @@ concat-stream@^1.5.0: typedarray "^0.0.6" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -convert-source-map@^1.1.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" @@ -1399,13 +1620,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" - integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== dependencies: - browserslist "^4.6.6" - semver "^6.3.0" + browserslist "^4.8.5" + semver "7.0.0" core-util-is@~1.0.0: version "1.0.2" @@ -1420,7 +1641,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -1431,7 +1652,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -1443,7 +1664,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@6.0.5, cross-spawn@^6.0.0: +cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1454,6 +1675,15 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1476,11 +1706,6 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1488,14 +1713,7 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0: +debug@^4.0.1, debug@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -1512,10 +1730,10 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= define-properties@^1.1.2: version "1.1.3" @@ -1546,15 +1764,10 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -1564,11 +1777,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -1583,6 +1791,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -1598,15 +1813,15 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -electron-to-chromium@^1.3.247: - version "1.3.275" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.275.tgz#19a38436e34216f51820fa2f4326d5ce141fa36f" - integrity sha512-/YWtW/VapMnuYA1lNOaa1F4GhR1LBf+CUTp60lzDPEEh0XOzyOAyULyYZVF9vziZ3qSbTqCwmKwsyRXp66STbw== +electron-to-chromium@^1.3.488: + version "1.3.497" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.497.tgz#de00f2f2f44c258c4577fbfbd5124b94c18bfa44" + integrity sha512-sPdW5bUDZwiFtoonuZCUwRGzsZmKzcLM0bMVhp6SMCfUG+B3faENLx3cE+o+K0Jl+MPuNA9s9cScyFjOlixZpQ== -elliptic@^6.0.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" - integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg== +elliptic@^6.0.0, elliptic@^6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -1621,10 +1836,15 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" @@ -1633,15 +1853,27 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== +enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" + integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== dependencies: graceful-fs "^4.1.2" - memory-fs "^0.4.0" + memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -1649,11 +1881,21 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" +escalade@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" + integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -1662,11 +1904,94 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.4.0.tgz#4e35a2697e6c1972f9d6ef2b690ad319f80f206f" + integrity sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.0.0" + eslint-visitor-keys "^1.2.0" + espree "^7.1.0" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.14" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== +espree@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" + integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== + dependencies: + acorn "^7.2.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.2.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -1679,15 +2004,20 @@ estraverse@^4.1.0, estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -1697,19 +2027,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -1759,20 +2076,37 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^4.0.0: version "4.0.0" @@ -1791,7 +2125,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -1807,7 +2141,15 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -findup-sync@3.0.0: +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== @@ -1817,6 +2159,20 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -1845,13 +2201,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -1868,49 +2217,38 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: + bindings "^1.5.0" nan "^2.12.1" - node-pre-gyp "^0.12.0" -fsevents@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.0.tgz#ce1a5f9ac71c6d75278b0c5bd236d7dfece4cbaa" - integrity sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -1924,17 +2262,17 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" glob@^7.1.3, glob@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1943,13 +2281,6 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -1959,6 +2290,13 @@ global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -1984,25 +2322,32 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.9: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has-symbols@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== has-value@^0.3.1: version "0.3.1" @@ -2036,12 +2381,13 @@ has-values@^1.0.0: kind-of "^4.0.0" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -2072,13 +2418,6 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -2089,14 +2428,20 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" - integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== dependencies: - minimatch "^3.0.4" + parent-module "^1.0.0" + resolve-from "^4.0.0" -import-local@2.0.0: +import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== @@ -2122,7 +2467,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2137,28 +2482,23 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -interpret@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -2241,18 +2581,16 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -2286,11 +2624,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2328,16 +2661,46 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js2xmlparser@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" + integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw== + dependencies: + xmlcreate "^2.0.3" + +jsdoc@^3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.4.tgz#246b2832a0ea8b37a441b61745509cfe29e174b6" + integrity sha512-3G9d37VHv7MFdheviDCjUfQoIjdv4TC5zTTf5G9VODLtOnVS6La1eoYBDlbWfsRT3/Xo+j2MIqki2EV12BZfwA== + dependencies: + "@babel/parser" "^7.9.4" + bluebird "^3.7.2" + catharsis "^0.8.11" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.1" + klaw "^3.0.0" + markdown-it "^10.0.0" + markdown-it-anchor "^5.2.7" + marked "^0.8.2" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" + taffydb "2.6.2" + underscore "~1.10.2" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -2358,6 +2721,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -2365,17 +2733,17 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" + integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -2397,29 +2765,56 @@ kind-of@^5.0.0: integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== dependencies: - invert-kv "^2.0.0" + uc.micro "^1.0.1" loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== +loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: big.js "^5.2.2" - emojis-list "^2.0.0" + emojis-list "^3.0.0" json5 "^1.0.1" locate-path@^3.0.0: @@ -2430,16 +2825,30 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash@^4.17.13, lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -lolex@^4.1.0, lolex@^4.2.0: +lolex@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== +lolex@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" + loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -2462,18 +2871,6 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -2486,6 +2883,27 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-it-anchor@^5.2.7: + version "5.3.0" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" + integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== + +markdown-it@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" + integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== + dependencies: + argparse "^1.0.7" + entities "~2.0.0" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +marked@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" + integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -2495,16 +2913,12 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= -memory-fs@^0.4.0, memory-fs@^0.4.1: +memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -2512,6 +2926,14 @@ memory-fs@^0.4.0, memory-fs@^0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -2539,11 +2961,6 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2561,30 +2978,10 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mississippi@^3.0.0: version "3.0.0" @@ -2610,12 +3007,17 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== move-concurrently@^1.0.1: version "1.0.1" @@ -2640,9 +3042,9 @@ ms@^2.1.1: integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanomatch@^1.2.9: version "1.2.13" @@ -2661,19 +3063,15 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nice-try@^1.0.4: version "1.0.5" @@ -2681,14 +3079,14 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" - integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== + version "1.5.3" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" + integrity sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ== dependencies: "@sinonjs/formatio" "^3.2.1" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" - lolex "^4.1.0" + lolex "^5.0.1" path-to-regexp "^1.7.0" node-libs-browser@^2.2.1: @@ -2720,36 +3118,10 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.29: - version "1.1.34" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.34.tgz#ced4655ee1ba9c3a2c5dcbac385e19434155fd40" - integrity sha512-fNn12JTEfniTuCqo0r9jXgl44+KxRH/huV7zM/KAGOKxDKrHr6EbT7SSs4B+DNxyBE2mks28AD+Jw6PkfY5uwA== - dependencies: - semver "^6.3.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" +node-releases@^1.1.58: + version "1.1.59" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e" + integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw== normalize-path@^2.1.1: version "2.1.1" @@ -2763,42 +3135,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.4" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -2848,57 +3185,27 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -2909,15 +3216,22 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parallel-transform@^1.1.0: version "1.2.0" @@ -2928,7 +3242,14 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -parse-asn1@^5.0.0: +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== @@ -2965,32 +3286,42 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -2998,10 +3329,10 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -picomatch@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^4.0.1: version "4.0.1" @@ -3020,10 +3351,10 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== process-nextick-args@~2.0.0: version "2.0.1" @@ -3035,6 +3366,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -3107,7 +3443,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -3122,20 +3458,10 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -3145,6 +3471,15 @@ rc@^1.2.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -3154,12 +3489,12 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.3.tgz#d6e011ed5b9240a92f08651eeb40f7942ceb6cc1" - integrity sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.4" + picomatch "^2.2.1" ready-test@^1.0.28: version "1.0.28" @@ -3172,29 +3507,29 @@ ready-test@^1.0.28: esm "^3.2.25" glob "^7.1.4" -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: - private "^0.1.6" + "@babel/runtime" "^7.8.4" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -3204,27 +3539,32 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + unicode-match-property-value-ecmascript "^1.2.0" -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== dependencies: jsesc "~0.5.0" @@ -3253,6 +3593,13 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requizzle@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" + integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== + dependencies: + lodash "^4.17.14" + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -3273,15 +3620,20 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.3.2, resolve@^1.8.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" - integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -3290,7 +3642,14 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -3312,10 +3671,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" @@ -3329,16 +3688,6 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -3348,22 +3697,38 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +schema-utils@^2.6.5: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -serialize-javascript@^1.7.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -3398,15 +3763,22 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== sinon@^7.5.0: version "7.5.0" @@ -3421,6 +3793,15 @@ sinon@^7.5.0: nise "^1.5.2" supports-color "^5.5.0" +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -3457,20 +3838,20 @@ source-list-map@^2.0.0: integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" source-map-support@~0.5.12: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -3497,6 +3878,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -3540,34 +3926,17 @@ stream-http@^2.7.2: xtend "^4.0.0" stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== string-replace-loader@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.2.0.tgz#0a0e6543fcec783d85c353a3e96a23872d45a94f" - integrity sha512-Ukt4ZC8+xVWdBRut3/iwnPJCNL1yV8AbVKXn8UcWdYrHgtuW4UDDAbBSi/J/CQDEWQBt824AJvPYahF23eJLRg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.3.0.tgz#7f29be7d73c94dd92eccd5c5a15651181d7ecd3d" + integrity sha512-HYBIHStViMKLZC/Lehxy42OuwsBaPzX/LjcF5mkJlE2SnHXmW6SW6eiHABTXnY8ZCm/REbdJ8qnA0ptmIzN0Ng== dependencies: loader-utils "^1.2.3" - schema-utils "^1.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + schema-utils "^2.6.5" string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" @@ -3578,7 +3947,16 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string_decoder@^1.0.0: +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -3592,20 +3970,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -3613,72 +3977,88 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" -supports-color@6.1.0: +supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +taffydb@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" + integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -terser-webpack-plugin@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" - integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== +terser-webpack-plugin@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" + integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^1.7.0" + serialize-javascript "^3.1.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" worker-farm "^1.7.0" terser@^4.1.2: - version "4.3.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.7.tgz#9dafb4a6730868608c9c7af96d44182f4107b29f" - integrity sha512-rJFxzWIzJdgiOwYIPJHu6L3hDegEYJj2cHuKcngMraUfhMXGDEbok9Tqjw7yxzrU4IagvG74uTEKdiqeG6T7bg== + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" source-map "~0.6.1" source-map-support "~0.5.12" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -3737,25 +4117,47 @@ to-regex@^3.0.1, to-regex@^3.0.2: safe-regex "^1.1.0" tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +underscore@~1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" + integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -3769,15 +4171,15 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== union-value@^1.0.0: version "1.0.1" @@ -3841,7 +4243,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -3860,41 +4262,50 @@ util@^0.11.0: dependencies: inherits "2.0.3" -v8-compile-cache@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== vm-browserify@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" - integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" webpack-cli@^3.3.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a" - integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A== - dependencies: - chalk "2.4.2" - cross-spawn "6.0.5" - enhanced-resolve "4.1.0" - findup-sync "3.0.0" - global-modules "2.0.0" - import-local "2.0.0" - interpret "1.2.0" - loader-utils "1.2.3" - supports-color "6.1.0" - v8-compile-cache "2.0.3" - yargs "13.2.4" + version "3.3.12" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" + integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== + dependencies: + chalk "^2.4.2" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.1" + findup-sync "^3.0.0" + global-modules "^2.0.0" + import-local "^2.0.0" + interpret "^1.4.0" + loader-utils "^1.4.0" + supports-color "^6.1.0" + v8-compile-cache "^2.1.1" + yargs "^13.3.2" webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" @@ -3905,15 +4316,15 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-map "~0.6.1" webpack@^4.41.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b" - integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" @@ -3924,13 +4335,13 @@ webpack@^4.41.0: loader-utils "^1.2.3" memory-fs "^0.4.1" micromatch "^3.1.10" - mkdirp "^0.5.1" + mkdirp "^0.5.3" neo-async "^2.6.1" node-libs-browser "^2.2.1" schema-utils "^1.0.0" tapable "^1.1.3" - terser-webpack-plugin "^1.4.1" - watchpack "^1.6.0" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.1" webpack-sources "^1.4.1" which-module@^2.0.0: @@ -3945,12 +4356,17 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== worker-farm@^1.7.0: version "1.7.0" @@ -3968,11 +4384,32 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xmlcreate@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497" + integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -3983,32 +4420,56 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^13.1.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" get-caller-file "^2.0.1" - os-locale "^3.1.0" require-directory "^2.1.1" require-main-filename "^2.0.0" set-blocking "^2.0.0" string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.0" + yargs-parser "^13.1.2" + +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" From 4d1b74aef409e203003fdfa9ffbbc10e10acebf9 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 18 Jul 2020 14:15:15 +0900 Subject: [PATCH 027/191] removed old number tests and removed Number#exp. --- CHANGELOG.md | 5 +- src/number/define.js | 1 - src/number/exp.js | 1 - src/number/methods.js | 1 - test/OLD/tests/number.js | 1093 -------------------------------------- test/tests/number.js | 11 +- 6 files changed, 5 insertions(+), 1107 deletions(-) delete mode 100644 src/number/exp.js delete mode 100644 test/OLD/tests/number.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e87d974a..1f9dd085a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,9 +23,12 @@ v3.0.0 - Changed `Number#times` to collects all return values including undefined. - Changed `Number#times` to error on any input that is not a positive finite integer. - Changed `Number#format` to no longer support thousands or decimal separtors. Use Intl for this. -- Removed `Number#sin`, `Number#cos`, etc in favor of native Math. - Removed `RegExp#getFlags`, `RegExp#setFlags`, `RegExp#addFlags` and `RegExp#removeFlags`. - Removed `Function#memoize` ability to deeply serialize all arguments. +- Removed Math aliases `Number#sin/asin/cos/acos/tan/atan/exp` in favor of directly using `Math`. + `Number#round/floor/ceil/abs/sqrt/pow` aliases are retained. +- Added `Number#trunc` Math alias. + TODO: diff --git a/src/number/define.js b/src/number/define.js index 987199cc2..ee00aad64 100644 --- a/src/number/define.js +++ b/src/number/define.js @@ -9,7 +9,6 @@ defineInstance('abs', methods.abs); defineInstance('ceil', methods.ceil); defineInstance('clamp', methods.clamp); defineInstance('downto', methods.downto); -defineInstance('exp', methods.exp); defineInstance('floor', methods.floor); defineInstance('format', methods.format); defineInstance('isEven', methods.isEven); diff --git a/src/number/exp.js b/src/number/exp.js deleted file mode 100644 index 101a23811..000000000 --- a/src/number/exp.js +++ /dev/null @@ -1 +0,0 @@ -export default Math.exp; diff --git a/src/number/methods.js b/src/number/methods.js index 34b4345d4..49b0d67cc 100644 --- a/src/number/methods.js +++ b/src/number/methods.js @@ -3,7 +3,6 @@ export { default as abs } from './abs'; export { default as ceil } from './ceil'; export { default as clamp } from './clamp'; export { default as downto } from './downto'; -export { default as exp } from './exp'; export { default as floor } from './floor'; export { default as format } from './format'; export { default as isEven } from './isEven'; diff --git a/test/OLD/tests/number.js b/test/OLD/tests/number.js deleted file mode 100644 index 8f3f2a334..000000000 --- a/test/OLD/tests/number.js +++ /dev/null @@ -1,1093 +0,0 @@ -namespace('Number', function () { - 'use strict'; - - group('Options', function() { - equal(Sugar.Number.getOption('thousands'), ',', 'Thousands should be comma by default'); - equal(Sugar.Number.getOption('decimal'), '.', 'Decimal should be dot by default'); - }); - - method('random', function() { - var rand; - - rand = run(Number); - equal(rand == 0 || rand == 1, true, 'no params = 0 or 1'); - - rand = run(Number, 'random', [10]); - equal(rand >= 0 && rand <= 10, true, 'min not defined, max is 10'); - equal(rand % 1, 0, 'number is whole'); - - rand = run(Number, 'random', [536224, 536280]); - equal(rand >= 536224 && rand <= 536280, true, 'min and max defined'); - - rand = run(Number, 'random', [6, -5]); - equal(rand >= -5 && rand <= 6, true, 'min and max can be reversed'); - - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - test(Number, [0, 0], 0, '0 should always remain 0'); - }); - - method('toNumber', function() { - test(4, 4, '4 is 4'); - test(10000, 10000, '10000 is 10000'); - test(5.2345, 5.2345, '5.2345 is 5.2345'); - }); - - method('ceil', function() { - test(5.5, 6, '5.5'); - test(5.14, 6, '5.14'); - test(5, 5, '5'); - test(-5.5, -5, '-5.5'); - test(-5.14, -5, '-5.14'); - test(-5, -5, '-5'); - test(4417.1318, [0], 4418, '0'); - test(4417.1318, [1], 4417.2, '1'); - test(4417.1318, [2], 4417.14, '2'); - test(4417.1318, [3], 4417.132, '3'); - test(4417.1318, [-1], 4420, '-1'); - test(4417.1318, [-2], 4500, '-2'); - test(4417.1318, [-3], 5000, '-3'); - }); - - method('floor', function() { - test(5.5, 5, '5.5'); - test(5.14, 5, '5.14'); - test(5.9, 5, '5.9'); - test(5, 5, '5'); - test(-5.5, -6, '-5.5'); - test(-5.14, -6, '-5.14'); - test(-5, -5, '-5'); - test(4417.1318, [0], 4417, '0'); - test(4417.1318, [1], 4417.1, '1'); - test(4417.1318, [2], 4417.13, '2'); - test(4417.1318, [3], 4417.131, '3'); - test(4417.1318, [-1], 4410, '-1'); - test(4417.1318, [-2], 4400, '-2'); - test(4417.1318, [-3], 4000, '-3'); - }); - - method('abs', function() { - test(-5, 5, '-5'); - test(5, 5, '5'); - test(-3.324, 3.324, '-3.324'); - test(3.324, 3.324, '3.324'); - }); - - method('pow', function() { - test(3, [2], 9, '3 ^ 2'); - test(3, [1], 3, '3 ^ 1'); - test(12, [2], 144, '12 ^ 2'); - test(3, [3], 27, '3 ^ 3'); - test(3, [0], 1, 'zero is allowed'); - test(3, NaN, 'defaults to no number'); - }); - - method('sin', function() { - // A recent change in the V8 engine now produces less accurate values for - // trigonomic functions in Chrome: https://code.google.com/p/v8/issues/detail?id=3006 - // This issue is flagged for landing in M35. - equalWithMargin(run(1, 'sin'), 0.8414709848078965, 0.000000000000001); - test(0, 0); - test(Math.PI/2, 1); - }); - - method('cos', function() { - test(0, 1); - test(Math.PI, -1, 'PI'); - test(Math.PI*2, 1, 'PI*2'); - }); - - method('tan', function() { - test(0, 0); - // See above - equalWithMargin(run(45, 'tan'), 1.6197751905438615, 0.000000000000001); - equalWithMargin(run(90, 'tan'), -1.995200412208242, 0.000000000000001); - }); - - method('asin', function() { - test(0, 0); - test(1, Math.PI/2, '1 is PI/2'); - }); - - method('acos', function() { - test(0, Math.PI/2, '0 is PI/2'); - test(1, 0); - }); - - method('atan', function() { - test(0, 0); - test(45, 1.5485777614681775); - }); - - method('log', function() { - test(64, [2], 6, '64 with base 2'); - equalWithMargin(run(9, 'log', [3]), 2, 0.000000000000001, '9 with base 3'); - test(5, 1.6094379124341003, '5'); - test(Math.E, 1, 'E'); - }); - - method('exp', function() { - equalWithMargin(run(1, 'exp', []), Math.E, 0.000000000000001); - test(0, 1); - }); - - method('sqrt', function() { - test(9, 3); - test(1024, 32); - }); - - method('round', function() { - test(3, 3); - test(3.241, 3); - test(3.752, 4); - test(-3.241, -3); - test(-3.752, -4); - test(3.241, [1], 3.2, '3.241 to 1 place'); - - test(3.752, [1], 3.8, '3.752 to 1 place'); - test(3.241, [2], 3.24, '3.241 to 2 places'); - test(3.752, [2], 3.75, '3.752 to 2 places'); - - test(322855.241, [-2], 322900, '322855.241 to -2 places'); - test(322855.241, [-3], 323000, '322855.241 to -3 places'); - test(322855.241, [-4], 320000, '322855.241 to -4 places'); - test(322855.241, [-6], 0, '322855.241 to -6 places'); - test(722855.241, [-6], 1000000, '722855.241 to -6 places'); - test(722855.241, [-8], 0, '722855.241 to -8 places'); - }); - - method('chr', function() { - test(65, 'A'); - test(24536, '忘'); - test(20294, '但'); - }); - - method('times', function() { - var count = 0; - var callback = function(first) { - equal(first, count, 'first parameter is the index'); - count++; - return count; - }; - var result = run(5, 'times', [callback]); - equal(result, [1,2,3,4,5], 'result should be the collected return values'); - equal(count, 5, 'iterated 5 times'); - - var fn = function() {}; - var result = run(3, 'times', [fn]); - equal(result, undefined, 'Returning undefined should return nothing'); - - var fn = function(i) { - return i || undefined; - }; - var result = run(3, 'times', [fn]); - equal(result, [1, 2], 'Mixed return values only collects non-undefined'); - - raisesError(function() { run(5, 'times', []); }, 'no callback raises error', TypeError); - }); - - method('isMultipleOf', function() { - test(2, [2], true, '2 is a multiple of 2'); - test(6, [2], true, '6 is a multiple of 2'); - test(100, [2], true, '100 is a multiple of 2'); - test(2, [100], false, '2 is a multiple of 100'); - test(100, [-2], true, '100 is a multiple of -2'); - test(6, [-2], true, '6 is a multiple of -2'); - test(6, [3], true, '6 is a multiple of 3'); - test(7, [3], false, '7 is a multiple of 3'); - test(2.5, [1.25], true, '2.5 is a multiple of 1.25'); - test(2, ['a'], false, 'string arguments'); - test(2, [/af/], false, 'other random arguments'); - test(2, [null], false, 'null'); - test(2, false, 'no argument passed'); - }); - - method('isOdd', function() { - test(0, false); - test(1, true); - test(2, false); - test(24, false); - test(200, false); - test(1.1, false); - test(NaN, false); - test(Infinity, false); - test(-Infinity, false); - }); - - method('isEven', function() { - test(0, true); - test(1, false); - test(2, true); - test(24, true); - test(200, true); - test(1.1, false); - test(NaN, false); - test(Infinity, false); - test(-Infinity, false); - }); - - method('ordinalize', function() { - test(0, '0th'); - test(1, '1st'); - test(2, '2nd'); - test(3, '3rd'); - test(4, '4th'); - test(5, '5th'); - test(6, '6th'); - test(7, '7th'); - test(8, '8th'); - test(9, '9th'); - test(10, '10th'); - test(11, '11th'); - test(12, '12th'); - test(13, '13th'); - test(14, '14th'); - test(15, '15th'); - test(20, '20th'); - test(21, '21st'); - test(22, '22nd'); - test(23, '23rd'); - test(24, '24th'); - test(25, '25th'); - test(100, '100th'); - test(101, '101st'); - test(102, '102nd'); - test(103, '103rd'); - test(104, '104th'); - test(105, '105th'); - test(111, '111th'); - test(112, '112th'); - test(113, '113th'); - test(114, '114th'); - test(-1, '-1st'); - - var OrdinalNumbers = { - "-1" : "-1st", - "-2" : "-2nd", - "-3" : "-3rd", - "-4" : "-4th", - "-5" : "-5th", - "-6" : "-6th", - "-7" : "-7th", - "-8" : "-8th", - "-9" : "-9th", - "-10" : "-10th", - "-11" : "-11th", - "-12" : "-12th", - "-13" : "-13th", - "-14" : "-14th", - "-20" : "-20th", - "-21" : "-21st", - "-22" : "-22nd", - "-23" : "-23rd", - "-24" : "-24th", - "-100" : "-100th", - "-101" : "-101st", - "-102" : "-102nd", - "-103" : "-103rd", - "-104" : "-104th", - "-110" : "-110th", - "-111" : "-111th", - "-112" : "-112th", - "-113" : "-113th", - "-1000" : "-1000th", - "-1001" : "-1001st", - "0" : "0th", - "1" : "1st", - "2" : "2nd", - "3" : "3rd", - "4" : "4th", - "5" : "5th", - "6" : "6th", - "7" : "7th", - "8" : "8th", - "9" : "9th", - "10" : "10th", - "11" : "11th", - "12" : "12th", - "13" : "13th", - "14" : "14th", - "20" : "20th", - "21" : "21st", - "22" : "22nd", - "23" : "23rd", - "24" : "24th", - "100" : "100th", - "101" : "101st", - "102" : "102nd", - "103" : "103rd", - "104" : "104th", - "110" : "110th", - "111" : "111th", - "112" : "112th", - "113" : "113th", - "1000" : "1000th", - "1001" : "1001st" - } - - testIterateOverObject(OrdinalNumbers, function(str, ordinalized) { - test(+str, ordinalized); - }); - - }); - - method('format', function() { - - test(100, '100'); - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1,000'); - test(10000, '10,000'); - test(100000, '100,000'); - test(1000000, '1,000,000'); - test(1000000.01, '1,000,000.01'); - test(-100, '-100'); - test(-1, '-1'); - test(-1000, '-1,000'); - test(-1000000.01, '-1,000,000.01'); - test(0.52, '0.52'); - test(9999999.99, '9,999,999.99'); - - // These discrepancies are due to floating point variable limitations. - equal(run(100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '100,046,546,510,000'); - equal(run(-100046546510000.022435451, 'format').replace(/\.\d+$/, ''), '-100,046,546,510,000'); - - Sugar.Number.setOption('thousands', ' '); - Sugar.Number.setOption('decimal', ','); - test(1000, [null, ' '], '1 000', 'with space'); - test(1532587, [null, ' '], '1 532 587', 'larget with space'); - test(1532587.5752, [null, ' ', ','], '1 532 587,5752', 'larger number with decimal'); - - Sugar.Number.setOption('thousands', '.'); - Sugar.Number.setOption('decimal', ','); - test(9999999.99, [null, '.',','], '9.999.999,99', 'Euro style!'); - - Sugar.Number.setOption('thousands', ''); - Sugar.Number.setOption('decimal', '.'); - test(9999999.99, [null, ''], '9999999.99', 'empty string'); - - Sugar.Number.setOption('thousands', ''); - Sugar.Number.setOption('decimal', ''); - test(9999999.99, [null, '', ''], '999999999', 'no punctuation'); - - Sugar.Number.setOption('thousands', null); - Sugar.Number.setOption('decimal', null); - test(9999999.99, [null, '', ''], '9,999,999.99', 'null returns to defaults'); - - withArgs([2], function() { - test(1, '1.00'); - test(10, '10.00'); - test(100, '100.00'); - test(1000, '1,000.00'); - test(10000, '10,000.00'); - test(100000, '100,000.00'); - test(1000000, '1,000,000.00'); - - test(-1, '-1.00'); - test(-10, '-10.00'); - test(-100, '-100.00'); - test(-1000, '-1,000.00'); - test(-10000, '-10,000.00'); - test(-100000, '-100,000.00'); - test(-1000000, '-1,000,000.00'); - - test(2.435, '2.44'); - }); - - withArgs([4], function() { - test(1, '1.0000'); - test(10, '10.0000'); - test(100, '100.0000'); - test(1000, '1,000.0000'); - test(10000, '10,000.0000'); - test(100000, '100,000.0000'); - test(1000000, '1,000,000.0000'); - test(-1, '-1.0000'); - test(-10, '-10.0000'); - test(-100, '-100.0000'); - test(-1000, '-1,000.0000'); - test(-10000, '-10,000.0000'); - test(-100000, '-100,000.0000'); - test(-1000000, '-1,000,000.0000'); - }); - - test(553599.435, [2], '553,599.44', 'to 2 places'); - test(553599.435, [1], '553,599.4', 'to 1 place'); - test(553599.435, [0], '553,599', 'to 0 places'); - test(553599.435, [-1], '553,600', 'to -1 places'); - test(553599.435, [-2], '553,600', 'to -2 places'); - test(553599.435, [-3], '554,000', 'to -3 places'); - test(553599.435, [-4], '550,000', 'to -4 places'); - test(553599.435, [-5], '600,000', 'to -5 places'); - - // Testing object form - Sugar.Number.setOption({ - thousands: 'y' - }); - test(1000, [null, ' '], '1y000', 'y as separator'); - Sugar.Number.setOption({ - thousands: null - }); - - }); - - method('pad', function() { - test(1, [0], '1', '1 no padding'); - test(1, [1], '1', '1 padded to 1 place'); - test(1, [2], '01', '1 padded to 2 places'); - test(1, [3], '001', '1 padded to 3 places'); - test(1, [4], '0001', '1 padded to 4 places'); - test(547, [0], '547', '547 no padding'); - test(547, [1], '547', '547 padded to 1 place'); - test(547, [2], '547', '547 padded to 2 places'); - test(547, [3], '547', '547 padded to 3 places'); - test(547, [4], '0547', '547 padded to 4 places'); - test(0, [0], '0', '0 no padding'); - test(0, [1], '0', '0 padded to 1 place'); - test(0, [2], '00', '0 padded to 2 places'); - test(0, [3], '000', '0 padded to 3 places'); - test(0, [4], '0000', '0 padded to 4 places'); - test(-1, [1], '-1', '-1 padded to 1 places'); - test(-1, [2], '-01', '-1 padded to 2 places'); - test(-1, [3], '-001', '-1 padded to 3 places'); - test(-1, [4], '-0001', '-1 padded to 4 places'); - test(1, [1, true], '+1', '1 padded to 1 places and sign'); - test(1, [2, true], '+01', '1 padded to 2 places and sign'); - test(1, [3, true], '+001', '1 padded to 3 places and sign'); - test(1, [4, true], '+0001', '1 padded to 4 places and sign'); - test(0, [1, true], '+0', '0 padded to 1 place and sign'); - test(547.528, [4], '0547.528', 'does not take decimal places into account'); - - test(255, [4, false, 16], '00ff', 'handles hex'); - test(2, [4, false, 2], '0010', 'handles binary'); - }); - - method('hex', function() { - test(0, '0'); - test(10, 'a'); - test(255, 'ff'); - test(0.5, '0.8'); - test(2.5, '2.8'); - test(2553423, '26f64f'); - - withArgs([2], function() { - test(0, '00'); - test(10, '0a'); - test(255, 'ff'); - test(0.5, '00.8'); - test(2.5, '02.8'); - }); - - withArgs([4], function() { - test(0, '0000'); - test(10, '000a'); - test(255, '00ff'); - test(0.5, '0000.8'); - test(2.5, '0002.8'); - }); - }); - - method('isInteger', function() { - test(15, true); - test(15.2, false); - test(15.2668, false); - test(15.0, true); - test('15', true); - test('15.8', false); - }); - - method('abbr', function() { - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1k'); - test(10000, '10k'); - test(100000, '100k'); - test(1000000, '1m'); - test(10000000, '10m'); - test(100000000, '100m'); - test(1000000000, '1b'); - test(10000000000, '10b'); - test(100000000000, '100b'); - test(1000000000000, '1t'); - test(1000000000000000000, '1,000,000t'); - - test(1, '1'); - test(12, '12'); - test(124, '124'); - test(1249, '1k'); - test(1749, '2k'); - test(12495, '12k'); - test(17495, '17k'); - test(124958, '125k'); - test(174958, '175k'); - test(1249584, '1m'); - test(1749584, '2m'); - - withArgs([1], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2k', 'decimal 1 place | 1,249'); - test(1749, '1.7k', 'decimal 1 place | 1,749'); - test(12495, '12.5k', 'decimal 1 place | 12,495'); - test(17495, '17.5k', 'decimal 1 place | 17,495'); - test(124958, '125k', 'decimal 1 place | 124,958'); - test(174958, '175k', 'decimal 1 place | 174,958'); - test(1249584, '1.2m', 'decimal 1 place | 1,249,584'); - test(1749584, '1.7m', 'decimal 1 place | 1,749,584'); - }); - - withArgs([2], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25k', 'decimal 2 places | 1,249'); - test(1749, '1.75k', 'decimal 2 places | 1,749'); - test(12495, '12.5k', 'decimal 2 places | 12,495'); - test(17495, '17.5k', 'decimal 2 places | 17,495'); - test(124958, '124.96k', 'decimal 2 places | 124,958'); - test(174958, '174.96k', 'decimal 2 places | 174,958'); - test(1249584, '1.25m', 'decimal 2 places | 1,249,584'); - test(1749584, '1.75m', 'decimal 2 places | 1,749,584'); - }); - - withArgs([3], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249k', 'decimal 3 places | 1,249'); - test(1749, '1.749k', 'decimal 3 places | 1,749'); - test(12495, '12.495k', 'decimal 3 places | 12,495'); - test(17495, '17.495k', 'decimal 3 places | 17,495'); - test(124958, '124.958k', 'decimal 3 places | 124,958'); - test(174958, '174.958k', 'decimal 3 places | 174,958'); - test(1249584, '1.25m', 'decimal 3 places | 1,249,584'); - test(1749584, '1.75m', 'decimal 3 places | 1,749,584'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(1749584, '1,75m', 'should respect global decimal marker'); - Sugar.Number.setOption('decimal', null); - }); - - withArgs([-1], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0k', 'decimal -1 places | 1,249'); - test(1749, '0k', 'decimal -1 places | 1,749'); - test(12495, '10k', 'decimal -1 places | 12,495'); - test(17495, '20k', 'decimal -1 places | 17,495'); - test(124958, '120k', 'decimal -1 places | 124,958'); - test(174958, '170k', 'decimal -1 places | 174,958'); - test(1249584, '0m', 'decimal -1 places | 1,249,584'); - test(1749584, '0m', 'decimal -1 places | 1,749,584'); - }); - - test(0.1, '0', '0.1'); - test(0.01, '0', '0.01'); - test(0.001, '0', '0.001'); - test(0.0001, '0', '0.00001'); - test(0.00001, '0', '0.000001'); - test(0.000001, '0', '0.0000001'); - test(0.0000001, '0', '0.00000001'); - test(0.00000001, '0', '0.000000001'); - - test(1.1, '1', '1.1'); - test(1.01, '1', '1.01'); - test(1.001, '1', '1.001'); - test(1.0001, '1', '1.00001'); - test(1.00001, '1', '1.000001'); - test(1.000001, '1', '1.0000001'); - test(1.0000001, '1', '1.00000001'); - test(1.00000001, '1', '1.000000001'); - - test(1000.004, '1k', '1000.004'); - test(10000.004, '10k', '10,000.004'); - test(100000.004, '100k', '100,000.004'); - test(1000000.004, '1m', '1,000,000.004'); - - withArgs([2], function() { - test(1000.004, '1k', '2 places | 1000.004'); - test(10000.004, '10k', '2 places | 10,000.004'); - test(100000.004, '100k', '2 places | 100,000.004'); - test(1000000.004, '1m', '2 places | 1,000,000.004'); - }); - }); - - method('metric', function() { - - test(1, '1'); - test(10, '10'); - test(100, '100'); - test(1000, '1k'); - test(10000, '10k'); - test(100000, '100k'); - test(1000000, '1,000k'); - test(10000000, '10,000k'); - test(100000000, '100,000k'); - test(1000000000, '1,000,000k'); - test(10000000000, '10,000,000k'); - test(100000000000, '100,000,000k'); - test(1000000000000, '1,000,000,000k'); - test(10000000000000, '10,000,000,000k'); - test(100000000000000, '100,000,000,000k'); - test(1000000000000000, '1,000,000,000,000k'); - test(10000000000000000, '10,000,000,000,000k'); - test(100000000000000000, '100,000,000,000,000k'); - - test(1, '1', 'decimal | 1'); - test(12, '12', 'decimal | 12'); - test(124, '124', 'decimal | 124'); - test(1249, '1k', 'decimal | 1,249'); - test(1749, '2k', 'decimal | 1,749'); - test(12495, '12k', 'decimal | 12,495'); - test(17495, '17k', 'decimal | 17,495'); - test(124958, '125k', 'decimal | 124,958'); - test(174958, '175k', 'decimal | 174,958'); - test(1249584, '1,250k', 'decimal | 1,249,584'); - test(1749584, '1,750k', 'decimal | 1,749,584'); - test(1249584000, '1,249,584k', 'decimal | 1,249,584,000'); - test(1749584000, '1,749,584k', 'decimal | 1,749,584,000'); - - test(0.1000000000000, '100m', 'fractional | 0.1'); - test(0.0100000000000, '10m', 'fractional | 0.01'); - test(0.0010000000000, '1m', 'fractional | 0.001'); - test(0.0001000000000, '100μ', 'fractional | 0.0001'); - test(0.0000100000000, '10μ', 'fractional | 0.00001'); - test(0.0000010000000, '1μ', 'fractional | 0.000001'); - test(0.0000001000000, '100n', 'fractional | 0.0000001'); - test(0.0000000100000, '10n', 'fractional | 0.00000001'); - test(0.0000000010000, '1n', 'fractional | 0.000000001'); - test(0.0000000001000, '0.1n', 'fractional | 0.0000000001'); - test(0.0000000000100, '0.01n', 'fractional | 0.00000000001'); - test(0.0000000000010, '0.001n', 'fractional | 0.000000000001'); - test(0.0000000000001, '0.0001n', 'fractional | 0.0000000000001'); - - test(0.1111111111111, '111m', 'fractional | 0 places | 0.1111111111111'); - test(0.0111111111111, '11m', 'fractional | 0 places | 0.0111111111111'); - test(0.0011111111111, '1m', 'fractional | 0 places | 0.0011111111111'); - test(0.0001111111111, '111μ', 'fractional | 0 places | 0.0001111111111'); - test(0.0000111111111, '11μ', 'fractional | 0 places | 0.0000111111111'); - test(0.0000011111111, '1μ', 'fractional | 0 places | 0.0000011111111'); - test(0.0000001111111, '111n', 'fractional | 0 places | 0.0000001111111'); - test(0.0000000111111, '11n', 'fractional | 0 places | 0.0000000111111'); - test(0.0000000011111, '1n', 'fractional | 0 places | 0.0000000011111'); - test(0.0000000001111, '0.1n', 'fractional | 0 places | 0.0000000001111'); - test(0.0000000000111, '0.01n', 'fractional | 0 places | 0.0000000000111'); - test(0.0000000000011, '0.001n', 'fractional | 0 places | 0.0000000000011'); - test(0.0000000000001, '0.0001n', 'fractional | 0 places | 0.0000000000001'); - - test(0.000000000000000001, '1e-9n', 'fractional | 0 places | 0.0000000000001'); - - test(1.1111111111111, '1', 'fractional | 0 places | 1.1111111111111'); - test(1.0111111111111, '1', 'fractional | 0 places | 1.0111111111111'); - test(1.0011111111111, '1', 'fractional | 0 places | 1.0011111111111'); - test(1.0001111111111, '1', 'fractional | 0 places | 1.0001111111111'); - test(1.0000111111111, '1', 'fractional | 0 places | 1.0000111111111'); - test(1.0000011111111, '1', 'fractional | 0 places | 1.0000011111111'); - test(1.0000001111111, '1', 'fractional | 0 places | 1.0000001111111'); - test(1.0000000111111, '1', 'fractional | 0 places | 1.0000000111111'); - test(1.0000000011111, '1', 'fractional | 0 places | 1.0000000011111'); - test(1.0000000001111, '1', 'fractional | 0 places | 1.0000000001111'); - test(1.0000000000111, '1', 'fractional | 0 places | 1.0000000000111'); - test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); - - test(1.1000000000001, '1', 'fractional | 0 places | 1.1000000000001'); - test(1.0100000000001, '1', 'fractional | 0 places | 1.0100000000001'); - test(1.0010000000001, '1', 'fractional | 0 places | 1.0010000000001'); - test(1.0001000000001, '1', 'fractional | 0 places | 1.0001000000001'); - test(1.0000100000001, '1', 'fractional | 0 places | 1.0000100000001'); - test(1.0000010000001, '1', 'fractional | 0 places | 1.0000010000001'); - test(1.0000001000001, '1', 'fractional | 0 places | 1.0000001000001'); - test(1.0000000100001, '1', 'fractional | 0 places | 1.0000000100001'); - test(1.0000000010001, '1', 'fractional | 0 places | 1.0000000010001'); - test(1.0000000001001, '1', 'fractional | 0 places | 1.0000000001001'); - test(1.0000000000101, '1', 'fractional | 0 places | 1.0000000000101'); - test(1.0000000000011, '1', 'fractional | 0 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 0 places | 1.0000000000001'); - - withArgs([0, 'all'], function() { - test(10000000, '10M'); - test(100000000, '100M'); - test(1000000000, '1G'); - test(10000000000, '10G'); - test(100000000000, '100G'); - test(1000000000000, '1T'); - test(10000000000000, '10T'); - test(100000000000000, '100T'); - test(1000000000000000, '1P'); - test(10000000000000000, '10P'); - test(100000000000000000, '100P'); - - test(1, '1', 'decimal | 1'); - test(12, '12', 'decimal | 12'); - test(124, '124', 'decimal | 124'); - test(1249, '1K', 'decimal | 1,249'); - test(1749, '2K', 'decimal | 1,749'); - test(12495, '12K', 'decimal | 12,495'); - test(17495, '17K', 'decimal | 17,495'); - test(124958, '125K', 'decimal | 124,958'); - test(174958, '175K', 'decimal | 174,958'); - test(1249584, '1M', 'decimal | 1,249,584'); - test(1749584, '2M', 'decimal | 1,749,584'); - test(1249584000, '1G', 'decimal | 1,249,584,000'); - test(1749584000, '2G', 'decimal | 1,749,584,000'); - }); - - withArgs([1], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2k', 'decimal 1 place | 1,249'); - test(1749, '1.7k', 'decimal 1 place | 1,749'); - test(12495, '12.5k', 'decimal 1 place | 12,495'); - test(17495, '17.5k', 'decimal 1 place | 17,495'); - test(124958, '125k', 'decimal 1 place | 124,958'); - test(174958, '175k', 'decimal 1 place | 174,958'); - test(1249584, '1,249.6k', 'decimal 1 place | 1,249,584'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(3232, [1], '3,2k', 'should respect global decimal marker'); - Sugar.Number.setOption('decimal', null); - }); - - withArgs([1, 'all'], function() { - test(1, '1', 'decimal 1 place | 1'); - test(12, '12', 'decimal 1 place | 12'); - test(124, '124', 'decimal 1 place | 124'); - test(1249, '1.2K', 'decimal 1 place | 1,249'); - test(1749, '1.7K', 'decimal 1 place | 1,749'); - test(12495, '12.5K', 'decimal 1 place | 12,495'); - test(17495, '17.5K', 'decimal 1 place | 17,495'); - test(124958, '125K', 'decimal 1 place | 124,958'); - test(174958, '175K', 'decimal 1 place | 174,958'); - test(1249584, '1.2M', 'decimal 1 place | 1,249,584'); - test(1749584, '1.7M', 'decimal 1 place | 1,749,584'); - test(1249584000, '1.2G', 'decimal 1 place | 1,249,584,000'); - test(1749584000, '1.7G', 'decimal 1 place | 1,749,584,000'); - }); - - withArgs([2], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25k', 'decimal 2 places | 1,249'); - test(1749, '1.75k', 'decimal 2 places | 1,749'); - test(12495, '12.5k', 'decimal 2 places | 12,495'); - test(17495, '17.5k', 'decimal 2 places | 17,495'); - test(124958, '124.96k', 'decimal 2 places | 124,958'); - test(174958, '174.96k', 'decimal 2 places | 174,958'); - test(1249584, '1,249.58k', 'decimal 2 places | 1,249,584'); - }); - - withArgs([2, 'all'], function() { - test(1, '1', 'decimal 2 places | 1'); - test(12, '12', 'decimal 2 places | 12'); - test(124, '124', 'decimal 2 places | 124'); - test(1249, '1.25K', 'decimal 2 places | 1,249'); - test(1749, '1.75K', 'decimal 2 places | 1,749'); - test(12495, '12.5K', 'decimal 2 places | 12,495'); - test(17495, '17.5K', 'decimal 2 places | 17,495'); - test(124958, '124.96K', 'decimal 2 places | 124,958'); - test(174958, '174.96K', 'decimal 2 places | 174,958'); - test(1249584, '1.25M', 'decimal 2 places | 1,249,584'); - test(1749584, '1.75M', 'decimal 2 places | 1,749,584'); - test(1249584000, '1.25G', 'decimal 2 places | 1,249,584,000'); - test(1749584000, '1.75G', 'decimal 2 places | 1,749,584,000'); - }); - - withArgs([3], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249k', 'decimal 3 places | 1,249'); - test(1749, '1.749k', 'decimal 3 places | 1,749'); - test(12495, '12.495k', 'decimal 3 places | 12,495'); - test(17495, '17.495k', 'decimal 3 places | 17,495'); - test(124958, '124.958k', 'decimal 3 places | 124,958'); - test(174958, '174.958k', 'decimal 3 places | 174,958'); - test(1249584, '1,249.584k', 'decimal 3 places | 1,249,584'); - }); - - withArgs([3, 'all'], function() { - test(1, '1', 'decimal 3 places | 1'); - test(12, '12', 'decimal 3 places | 12'); - test(124, '124', 'decimal 3 places | 124'); - test(1249, '1.249K', 'decimal 3 places | 1,249'); - test(1749, '1.749K', 'decimal 3 places | 1,749'); - test(12495, '12.495K', 'decimal 3 places | 12,495'); - test(17495, '17.495K', 'decimal 3 places | 17,495'); - test(124958, '124.958K', 'decimal 3 places | 124,958'); - test(174958, '174.958K', 'decimal 3 places | 174,958'); - test(1249584, '1.25M', 'decimal 3 places | 1,249,584'); - test(1749584, '1.75M', 'decimal 3 places | 1,749,584'); - test(1249584000, '1.25G', 'decimal 3 places | 1,249,584,000'); - test(1749584000, '1.75G', 'decimal 3 places | 1,749,584,000'); - }); - - withArgs([-1], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0k', 'decimal -1 places | 1,249'); - test(1749, '0k', 'decimal -1 places | 1,749'); - test(12495, '10k', 'decimal -1 places | 12,495'); - test(17495, '20k', 'decimal -1 places | 17,495'); - test(124958, '120k', 'decimal -1 places | 124,958'); - test(174958, '170k', 'decimal -1 places | 174,958'); - test(1249584, '1,250k', 'decimal -1 places | 1,249,584'); - }); - - withArgs([-1, 'all'], function() { - test(1, '0', 'decimal -1 places | 1'); - test(12, '10', 'decimal -1 places | 12'); - test(124, '120', 'decimal -1 places | 124'); - test(1249, '0K', 'decimal -1 places | 1,249'); - test(1749, '0K', 'decimal -1 places | 1,749'); - test(12495, '10K', 'decimal -1 places | 12,495'); - test(17495, '20K', 'decimal -1 places | 17,495'); - test(124958, '120K', 'decimal -1 places | 124,958'); - test(174958, '170K', 'decimal -1 places | 174,958'); - test(1249584, '0M', 'decimal -1 places | 1,249,584'); - test(1749584, '0M', 'decimal -1 places | 1,749,584'); - test(1249584000, '0G', 'decimal -1 places | 1,249,584,000'); - test(1749584000, '0G', 'decimal -1 places | 1,749,584,000'); - }); - - withArgs([2], function() { - test(0.1111111111111, '111.11m', 'fractional | 2 places | 0.1111111111111'); - test(0.0111111111111, '11.11m', 'fractional | 2 places | 0.0111111111111'); - test(0.0011111111111, '1.11m', 'fractional | 2 places | 0.0011111111111'); - test(0.0001111111111, '111.11μ', 'fractional | 2 places | 0.0001111111111'); - test(0.0000111111111, '11.11μ', 'fractional | 2 places | 0.0000111111111'); - test(0.0000011111111, '1.11μ', 'fractional | 2 places | 0.0000011111111'); - test(0.0000001111111, '111.11n', 'fractional | 2 places | 0.0000001111111'); - test(0.0000000111111, '11.11n', 'fractional | 2 places | 0.0000000111111'); - test(0.0000000011111, '1.11n', 'fractional | 2 places | 0.0000000011111'); - test(0.0000000001111, '0.1n', 'fractional | 2 places | 0.0000000001111'); - test(0.0000000000111, '0.01n', 'fractional | 2 places | 0.0000000000111'); - test(0.0000000000011, '0.001n', 'fractional | 2 places | 0.0000000000011'); - test(0.0000000000001, '0.0001n', 'fractional | 2 places | 0.0000000000001'); - - test(1.1111111111111, '1.11', 'fractional | 2 places | 1.1111111111111'); - test(1.0111111111111, '1.01', 'fractional | 2 places | 1.0111111111111'); - test(1.0011111111111, '1', 'fractional | 2 places | 1.0011111111111'); - test(1.0001111111111, '1', 'fractional | 2 places | 1.0001111111111'); - test(1.0000111111111, '1', 'fractional | 2 places | 1.0000111111111'); - test(1.0000011111111, '1', 'fractional | 2 places | 1.0000011111111'); - test(1.0000001111111, '1', 'fractional | 2 places | 1.0000001111111'); - test(1.0000000111111, '1', 'fractional | 2 places | 1.0000000111111'); - test(1.0000000011111, '1', 'fractional | 2 places | 1.0000000011111'); - test(1.0000000001111, '1', 'fractional | 2 places | 1.0000000001111'); - test(1.0000000000111, '1', 'fractional | 2 places | 1.0000000000111'); - test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); - - test(1.1000000000001, '1.1', 'fractional | 2 places | 1.1000000000001'); - test(1.0100000000001, '1.01', 'fractional | 2 places | 1.0100000000001'); - test(1.0010000000001, '1', 'fractional | 2 places | 1.0010000000001'); - test(1.0001000000001, '1', 'fractional | 2 places | 1.0001000000001'); - test(1.0000100000001, '1', 'fractional | 2 places | 1.0000100000001'); - test(1.0000010000001, '1', 'fractional | 2 places | 1.0000010000001'); - test(1.0000001000001, '1', 'fractional | 2 places | 1.0000001000001'); - test(1.0000000100001, '1', 'fractional | 2 places | 1.0000000100001'); - test(1.0000000010001, '1', 'fractional | 2 places | 1.0000000010001'); - test(1.0000000001001, '1', 'fractional | 2 places | 1.0000000001001'); - test(1.0000000000101, '1', 'fractional | 2 places | 1.0000000000101'); - test(1.0000000000011, '1', 'fractional | 2 places | 1.0000000000011'); - test(1.0000000000001, '1', 'fractional | 2 places | 1.0000000000001'); - }); - - equal(run(0.0001) + 'm', '100μm', '100μm'); - equal(run(0.001) + 'm', '1mm', '1mm'); - equal(run(0.01) + 'm', '10mm', '10mm'); - equal(run(0.1) + 'm', '100mm', '100mm'); - equal(run(1) + 'm', '1m', '1m'); - equal(run(1000) + 'm', '1km', '1km'); - equal(run(1000000) + 'm', '1,000km', '1,000km'); - equal(run(1000000000) + 'm', '1,000,000km', '1,000,000km'); - - withArgs([0, '|'], function() { - equal(run(1000000000) + 'm', '1,000,000,000m', 'limited to meters | 1,000,000,000m'); - equal(run(1000000) + 'm', '1,000,000m', 'limited to meters | 1,000,000m'); - equal(run(1000) + 'm', '1,000m', 'limited to meters | 1,000m'); - equal(run(1) + 'm', '1m', 'limited to meters | 1m'); - }); - - test(12334.5880, '12k', 'fractional | 0 places | 12334.5880'); - test(12334.5880, [3], '12.335k', 'fractional | 3 places | 12334.5880'); - test(.588500, [9], '588.5m', 'fractional | 9 places | .5885'); - test(.580085, [9], '580.085m', 'fractional | 9 places | .580085'); - test(.580085, [7], '580.085m', 'fractional | 7 places | .580085'); - test(.580085, [5], '580.085m', 'fractional | 5 places | .580085'); - test(.580085, [3], '580.085m', 'fractional | 3 places | .580085'); - test(.580085, [1], '580.1m', 'fractional | 1 places | .580085'); - test(12323.424558, [3, '|'], '12,323.425', 'limited and 3 decimals'); - - equal(run(1, 'metric', [0, '']) + 'm', '1m', 'no format uses short'); - equal(run(1000, 'metric', [0, '|']) + 'm', '1,000m', 'simple placeholder limits'); - - equal(run(1, 'metric', [0, 'm']) + 'm', '1,000mm', 'millimeter max'); - equal(run(1, 'metric', [0, 'μ_']) + 'm', '1,000,000μm', 'micrometer max'); - equal(run(1, 'metric', [0, 'n__']) + 'm', '1,000,000,000nm', 'nanometer max'); - equal(run(1, 'metric', [3, '_k']) + 'm', '0.001km', 'kilometer min'); - - equal(run(0.0000001, 'metric', [0, 'nμ_']) + 'm', '100nm', '100nm with micrometer max'); - equal(run(0.0001, 'metric', [0, 'nμ_']) + 'm', '100μm', '100μm with micrometer max'); - - equal(run(1000000, 'metric', [3, '_KG']) + 'W', '1GW', 'minimum can format higher'); - }); - - method('bytes', function() { - - test(1, '1B', 'default | 1B '); - test(10, '10B', 'default | 10B '); - test(100, '100B', 'default | 100B '); - test(1000, '1KB', 'default | 1KB '); - test(10000, '10KB', 'default | 10KB '); - test(100000, '100KB', 'default | 100KB'); - test(1000000, '1MB', 'default | 1MB '); - test(10000000, '10MB', 'default | 10MB '); - test(100000000, '100MB', 'default | 100MB'); - test(1000000000, '1GB', 'default | 1GB '); - test(10000000000, '10GB', 'default | 10GB '); - test(100000000000, '100GB', 'default | 100GB'); - test(1000000000000, '1TB', 'default | 1TB '); - test(10000000000000, '10TB', 'default | 10TB '); - test(100000000000000, '100TB', 'default | 100TB'); - test(1000000000000000, '1PB', 'default | 1PB '); - test(10000000000000000, '10PB', 'default | 10PB '); - test(100000000000000000, '100PB', 'default | 100PB'); - - withArgs([2], function() { - test(1, '1B', '2 places | 1B '); - test(10, '10B', '2 places | 10B '); - test(100, '100B', '2 places | 100B '); - test(1000, '1KB', '2 places | 1KB '); - test(10000, '10KB', '2 places | 10KB '); - test(100000, '100KB', '2 places | 100KB'); - test(1000000, '1MB', '2 places | 1MB '); - test(10000000, '10MB', '2 places | 10MB '); - test(100000000, '100MB', '2 places | 100MB'); - test(1000000000, '1GB', '2 places | 1GB '); - test(10000000000, '10GB', '2 places | 10GB '); - test(100000000000, '100GB', '2 places | 100GB'); - test(1000000000000, '1TB', '2 places | 1TB '); - test(10000000000000, '10TB', '2 places | 10TB '); - test(100000000000000, '100TB', '2 places | 100TB'); - test(1000000000000000, '1PB', '2 places | 1PB '); - test(10000000000000000, '10PB', '2 places | 10PB '); - test(100000000000000000, '100PB', '2 places | 100PB'); - }); - - withArgs([0, true], function() { - test(1, '1B', '0 places | base 2 | 1B '); - test(10, '10B', '0 places | base 2 | 10B '); - test(100, '100B', '0 places | base 2 | 100B '); - test(1000, '1KiB', '0 places | base 2 | 1KiB '); - test(10000, '10KiB', '0 places | base 2 | 10KiB '); - test(100000, '98KiB', '0 places | base 2 | 100KiB'); - test(1000000, '1MiB', '0 places | base 2 | 1MiB '); - test(10000000, '10MiB', '0 places | base 2 | 10MiB '); - test(100000000, '95MiB', '0 places | base 2 | 100MiB'); - test(1000000000, '1GiB', '0 places | base 2 | 1GiB '); - test(10000000000, '9GiB', '0 places | base 2 | 10GiB '); - test(100000000000, '93GiB', '0 places | base 2 | 100GiB'); - test(1000000000000, '1TiB', '0 places | base 2 | 1TiB '); - test(10000000000000, '9TiB', '0 places | base 2 | 10TiB '); - test(100000000000000, '91TiB', '0 places | base 2 | 100TiB'); - test(1000000000000000, '1PiB', '0 places | base 2 | 1PiB '); - test(10000000000000000, '9PiB', '0 places | base 2 | 10PiB '); - test(100000000000000000, '89PiB', '0 places | base 2 | 100PiB'); - }); - - withArgs([2, true], function() { - - test(1, '1B', '2 places | base 2 | 1B '); - test(10, '10B', '2 places | base 2 | 10B '); - test(100, '100B', '2 places | base 2 | 100B '); - test(1000, '0.98KiB', '2 places | base 2 | 1KB '); - test(10000, '9.77KiB', '2 places | base 2 | 10KB '); - test(100000, '97.66KiB', '2 places | base 2 | 100KB'); - test(1000000, '0.95MiB', '2 places | base 2 | 1MB '); - test(10000000, '9.54MiB', '2 places | base 2 | 10MB '); - test(100000000, '95.37MiB', '2 places | base 2 | 100MB'); - test(1000000000, '0.93GiB', '2 places | base 2 | 1GB '); - test(10000000000, '9.31GiB', '2 places | base 2 | 10GB '); - test(100000000000, '93.13GiB', '2 places | base 2 | 100GB'); - test(1000000000000, '0.91TiB', '2 places | base 2 | 1TB '); - test(10000000000000, '9.09TiB', '2 places | base 2 | 10TB '); - test(100000000000000, '90.95TiB', '2 places | base 2 | 100TB'); - test(1000000000000000, '0.89PiB', '2 places | base 2 | 1PB '); - test(10000000000000000, '8.88PiB', '2 places | base 2 | 10PB '); - test(100000000000000000, '88.82PiB', '2 places | base 2 | 100PB'); - - // Issue #422 - Sugar.Number.setOption('decimal', ','); - test(1000, '0,98KiB', 'should respect global decimal'); - Sugar.Number.setOption('decimal', null); - - }); - - withArgs([0, true, 'si'], function() { - test(1, '1B', 'base 2 with si units | 1B '); - test(10, '10B', 'base 2 with si units | 10B '); - test(100, '100B', 'base 2 with si units | 100B '); - test(1000, '1KB', 'base 2 with si units | 1KB '); - test(10000, '10KB', 'base 2 with si units | 10KB '); - test(100000, '98KB', 'base 2 with si units | 100KB'); - test(1000000, '1MB', 'base 2 with si units | 1MB '); - test(10000000, '10MB', 'base 2 with si units | 10MB '); - test(100000000, '95MB', 'base 2 with si units | 100MB'); - test(1000000000, '1GB', 'base 2 with si units | 1GB '); - test(10000000000, '9GB', 'base 2 with si units | 10GB '); - test(100000000000, '93GB', 'base 2 with si units | 100GB'); - test(1000000000000, '1TB', 'base 2 with si units | 1TB '); - test(10000000000000, '9TB', 'base 2 with si units | 10TB '); - test(100000000000000, '91TB', 'base 2 with si units | 100TB'); - test(1000000000000000, '1PB', 'base 2 with si units | 1PB '); - test(10000000000000000, '9PB', 'base 2 with si units | 10PB '); - test(100000000000000000, '89PB', 'base 2 with si units | 100PB'); - }); - - withArgs([0, false, 'binary'], function() { - - test(1, '1B', 'base 10 with binary units | 1B '); - test(10, '10B', 'base 10 with binary units | 10B '); - test(100, '100B', 'base 10 with binary units | 100B '); - test(1000, '1KiB', 'base 10 with binary units | 1KiB '); - test(10000, '10KiB', 'base 10 with binary units | 10KiB '); - test(100000, '100KiB', 'base 10 with binary units | 100KiB'); - test(1000000, '1MiB', 'base 10 with binary units | 1MiB '); - test(10000000, '10MiB', 'base 10 with binary units | 10MiB '); - test(100000000, '100MiB', 'base 10 with binary units | 100MiB'); - test(1000000000, '1GiB', 'base 10 with binary units | 1GiB '); - test(10000000000, '10GiB', 'base 10 with binary units | 10GiB '); - test(100000000000, '100GiB', 'base 10 with binary units | 100GiB'); - test(1000000000000, '1TiB', 'base 10 with binary units | 1TiB '); - test(10000000000000, '10TiB', 'base 10 with binary units | 10TiB '); - test(100000000000000, '100TiB', 'base 10 with binary units | 100TiB'); - test(1000000000000000, '1PiB', 'base 10 with binary units | 1PiB '); - test(10000000000000000, '10PiB', 'base 10 with binary units | 10PiB '); - test(100000000000000000, '100PiB', 'base 10 with binary units | 100PiB'); - - }); - - test(1024, [0, true], '1KiB', '1024 bytes is 1KiB'); - test(1048576, [0, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); - test(1024, [2, true], '1KiB', '2 places | 1024 bytes is 1KiB'); - test(1048576, [2, true], '1MiB', '2 places | 1048576 bytes is 1MiB'); - - test(Math.pow(10, 16), [0, true], '9PiB', '10 ^ 16 bytes'); - test(Math.pow(10, 16), [-2, true], '0PiB', '10 ^ 16 bytes | -2 places'); - }); - -}); diff --git a/test/tests/number.js b/test/tests/number.js index 89f6b49b2..b545f1005 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -4,7 +4,7 @@ namespace('Number', function() { describeStatic('random', function(random) { - it('should generate random numbers', function() { + it('should generate random integers', function() { assertOneOf(random(), [0,1]); assertOneOf(random(10), [0,1,2,3,4,5,6,7,8,9,10]); assertOneOf(random(25, 30), [25,26,27,28,29,30]); @@ -224,15 +224,6 @@ namespace('Number', function() { }); - describeInstance('exp', function(exp) { - - it('should get exp', function() { - assertEqual(exp(0), 1); - assertEqual(exp(1), Math.exp(1)); - }); - - }); - describeInstance('sqrt', function(sqrt) { it('should get square root', function() { From ca421dd915372bc0f6b6a7675cdaa2bb370a9ac0 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 18 Jul 2020 16:19:36 +0900 Subject: [PATCH 028/191] removed old tests --- CHANGELOG.md | 3 +- test/OLD/tests/function.js | 219 ------------------- test/OLD/tests/range/number.js | 386 --------------------------------- test/OLD/tests/range/string.js | 143 ------------ test/OLD/tests/regexp.js | 22 -- test/OLD/tests/string.js | 70 ------ 6 files changed, 1 insertion(+), 842 deletions(-) delete mode 100644 test/OLD/tests/range/number.js delete mode 100644 test/OLD/tests/range/string.js delete mode 100644 test/OLD/tests/regexp.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f9dd085a..d3795b50e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ v3.0.0 - Removed ability to extend Object.prototype - Removed support for bower. - Removed `String#padLeft` and `String#padRight` in favor of native `String#padStart` and `String#padEnd`. +- Removed `String#trimLeft` and `String#trimRight` in favor of native `String#trimStart` and `String#trimEnd`. - Added `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. - Renamed `Number#chr` to `Number#toChar`. - Renamed `Number#ordinalize` to `Number#toOrdinal`. @@ -33,8 +34,6 @@ v3.0.0 TODO: - DOCUMENT CHANGES TO EXTEND API -- String#padStart/String#padEnd? -- String#trimStart/String#trimEnd? - Object.values / Object.entries? - Array#flat/Array#flatMap - String#matchAll - does it do what Sugar methods already do? diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index c19586e19..0b14e674b 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -344,96 +344,6 @@ namespace('Function', function () { equal(count, 1, 'should have been called once'); }); - method('debounce', function() { - var fn, ret, count, expected; - - // Basic debouncing - clock.reset(); - count = 0; - expected = [['leia', 5], ['han solo', 7]]; - fn = run(function(one){ - equal([this.toString(), one], expected[count], 'scope and arguments are correct'); - count++; - }, 'debounce', [20]); - - ret = fn.call('3p0', 1); - fn.call('r2d2', 2); - clock.tick(5); - fn.call('chewie', 3); - clock.tick(10); - fn.call('leia', 5); - - clock.tick(20); - equal(count, 1, 'should have fired after 30ms'); - fn.call('luke', 6); - fn.call('han solo', 7); - - equal(ret, undefined, 'calls to a debounced function return undefined'); - - clock.tick(40); - equal(count, 2, 'count should still be correct after another 10ms'); - - - // Canceling debounced functions - count = 0; - fn = run(function() { - count++; - }, 'debounce', [50]); - fn(); - fn(); - fn(); - run(fn, 'cancel'); - equal(count, 0, 'canceled debounce function should not have been called yet'); - clock.tick(50); - equal(count, 0, 'canceled debounce function should not have been called after 50ms'); - - }); - - method('throttle', function() { - var fn, ret, count, expected; - - // Basic throttle functionality - clock.reset(); - count = 0; - expected = [['3p0', 1], ['luke', 6]]; - fn = run(function(one){ - equal([this.toString(), one], expected[count], 'immediate execution | scope and arguments are correct'); - count++; - return count; - }, 'throttle', [50]); - - equal(fn.call('3p0', 1), 1, 'first run, gets value'); - equal(fn.call('r2d2', 2), 1, 'second run, return value is caching'); - equal(fn.call('chewie', 3), 1, 'third run, return value is caching'); - equal(fn.call('vader', 4), 1, 'fourth run, return value is caching'); - - clock.tick(25); - equal(fn.call('leia', 5), 1, 'fifth run, return value is caching'); - - clock.tick(50); - equal(fn.call('luke', 6), 2, 'sixth run, gets value'); - equal(fn.call('han solo', 7), 2, 'seventh run, return value is caching'); - - clock.tick(100); - equal(count, 2, 'count is correct'); - - - // Throttle memoizing - clock.reset(); - count = 1; - fn = run(function() { - return ++count; - }, 'throttle', [50]); - - equal(fn(), 2, 'iteration 1'); - equal(fn(), 2, 'iteration 2'); - equal(fn(), 2, 'iteration 3'); - - clock.tick(200); - equal(fn(), 3, 'memoize | result expires after 200 ms'); - - }); - method('every', function() { var fn, count; @@ -616,135 +526,6 @@ namespace('Function', function () { }); - method('memoize', function() { - - // Simple memoization - - var count = 0; - var fn = run(function(n) { - count++; - return n + 1; - }, 'memoize'); - equal(fn(3), 4, 'running with 3 should add 1'); - equal(fn(4), 5, 'running with 4 should still add 1'); - equal(fn(500), 501, 'running with 500 should still add 1'); - // Runs - fn(1); - // Runs - fn(2); - // Cached - fn(3); - equal(count, 5, 'should have run 5 times'); - - - // Custom hash function. - - var firstArgument = function(x) { - return x; - } - var count = 0; - var fn = run(function(n) { - count++; - return n + 1; - }, 'memoize', [firstArgument]); - equal(fn(1, 'a'), 2, 'first time should run'); - equal(fn(1, 'a'), 2, 'second time should be cached'); - equal(fn(2, 'a'), 3, 'different first argument should run'); - equal(fn(2, 'b'), 3, 'different second argument should be cached'); - equal(count, 2, 'should have run 2 times'); - - - // Complex memoization - - var foo1 = { foo: 'bar' }; - var foo2 = { foo: 'bar' }; - var foo3 = { foo: 'bar', moo: 'car' }; - - var count = 0; - var fn = run(function(n) { - count++; - }, 'memoize'); - fn(foo1); // Should run - fn(foo1); // Should cache - fn(foo2); // Equal by value, should also cache - fn(foo3); // Not equal by value, should run - fn(foo2, 'c'); // Equal first argument, but different second so should run - fn(foo2, 'c'); // Identical to last, should cache - fn(foo1, 'c'); // Equivalent to last, should also cache - - equal(count, 3, 'should have run 3 times'); - - - // Dot operator can serve as a shortcut to the hashing function. - - var p1 = { name: { first: 'Tom', last: 'Hanks' }}; - var p2 = { name: { first: 'Jon', last: 'Voight' }}; - var p3 = { name: { first: 'Tom', last: 'Cruise' }}; - var p4 = { name: { first: 'Joe', last: 'Rogan' }}; - var p5 = { name: { first: 'Tom', last: 'Waits' }}; - - var count = 0; - var fn = run(function(obj) { - count++; - return obj.name.first + ' ' + obj.name.last; - }, 'memoize', ['name.first']); - - equal(fn(p1), 'Tom Hanks', 'first should run'); - equal(fn(p2), 'Jon Voight', 'second should run'); - equal(fn(p3), 'Tom Hanks', 'third should cache'); - equal(fn(p4), 'Joe Rogan', 'fourth should run'); - equal(fn(p5), 'Tom Hanks', 'fifth should run'); - equal(count, 3, 'should have run 3 times'); - - - // Limit argument - - var count = 0; - var fn = run(function() { count++; }, 'memoize', [function() {}, 1]); - fn(1); - fn(2); - fn(3); - fn(4); - // Noop hash function always returns undefined, which means - // the function will be memoized indefinitely, so limit is ignored. - equal(count, 1, 'limit ignored with noop'); - - var count = 0; - var fn = run(function() { count++; }, 'memoize', [2]); - fn(1); // First hit, not cached. +1 - fn(2); // First hit, not cached. +1 - fn(1); // Second hit, cached. +0 - fn(2); // Second hit, cached. +0 - fn(3); // First hit, not cached. +1 - overflow so cache reset - fn(1); // Second hit, was reset. +1 - fn(2); // Second hit, was reset. +1 - fn(3); // Third hit, was reset. +1 - fn(4); // First ,hit, not cached. +1 - - // Cache was cleared once, fn should have been called 7 times. - equal(count, 7, 'limit hit 7 times'); - - - // Class instances - - function Foo() {} - var o1 = new Foo; - var o2 = new Foo; - - var count = 0; - var fn = run(function() { count++; }, 'memoize', []); - fn(o1); - fn(o1); - equal(count, 1, 'instances | same reference is memoized'); - - var count = 0; - var fn = run(function() { count++; }, 'memoize', []); - fn(o1); - fn(o2); - equal(count, 2, 'instances | different references are not memoized'); - - }); - method('partial', function() { var format = function(place, last){ diff --git a/test/OLD/tests/range/number.js b/test/OLD/tests/range/number.js deleted file mode 100644 index 7d7e99e7d..000000000 --- a/test/OLD/tests/range/number.js +++ /dev/null @@ -1,386 +0,0 @@ -namespace('Number', function () { - 'use strict'; - - function getRange() { - return Sugar.Number.range.apply(null, testGetArgs(arguments)); - } - - function testRange(start, end, isValid, expectedCount, expectedResult, iterations) { - var range = getRange(start, end); - var count = 0; - var result = range.every(iterations || 1, function() { - count++; - }); - - equal(range.isValid(), isValid, start + ' <> ' + end + ' | is valid'); - equal(count, expectedCount, start + ' <> ' + end + ' | count'); - equal(result, expectedResult, start + ' <> ' + end + ' | result'); - } - - group('range', function() { - var range = getRange(5, 10); - - equal(range.toString(), '5..10', 'toString'); - equal(range.isValid(), true, 'isValid'); - equal(range.span(), 6, 'span'); - equal(range.contains(), false, 'contains undefined'); - equal(range.contains(1), false, 'contains 1'); - equal(range.contains(4), false, 'contains 4'); - equal(range.contains(5), true, 'contains 5'); - equal(range.contains(6), true, 'contains 6'); - equal(range.contains(7), true, 'contains 7'); - equal(range.contains(8), true, 'contains 8'); - equal(range.contains(9), true, 'contains 9'); - equal(range.contains(10), true, 'contains 10'); - equal(range.contains(11), false, 'contains 11'); - - testRange(NaN, NaN, false, 0, []); - testRange(0, NaN, false, 0, []); - testRange(NaN, 0, false, 0, []); - testRange(0, -Infinity, false, 0, []); - testRange(0, Infinity, false, 0, []); - testRange(-Infinity, 0, false, 0, []); - testRange(Infinity, 0, false, 0, []); - testRange(Infinity, Infinity, false, 0, []); - testRange(-Infinity, Infinity, false, 0, []); - testRange(Infinity, -Infinity, false, 0, []); - testRange(-Infinity, -Infinity, false, 0, []); - - testRange(0.1, 0.5, true, 5, [0.1,0.2,0.3,0.4,0.5], 0.1); - testRange(-5.016, 2, true, 8, [-5.016,-4.016,-3.016,-2.016,-1.016,-0.016,0.984,1.984]); - - }); - - method('union', function() { - var range = getRange(5, 10), mergedRange; - - mergedRange = range.union(getRange(1, 5)); - equal(mergedRange.start, 1, '1..5 | 5..10 | start'); - equal(mergedRange.end, 10, '1..5 | 5..10 | end'); - - mergedRange = range.union(getRange(1, 4)); - equal(mergedRange.start, 1, '1..4 | 5..10 | start'); - equal(mergedRange.end, 10, '1..4 | 5..10 | end'); - - mergedRange = range.union(getRange(1, 3)); - equal(mergedRange.start, 1, '1..3 | 5..10 | start'); - equal(mergedRange.end, 10, '1..3 | 5..10 | end'); - - mergedRange = range.union(getRange(1, 1)); - equal(mergedRange.start, 1, '1..1 | 5..10 | start'); - equal(mergedRange.end, 10, '1..1 | 5..10 | end'); - - mergedRange = range.union(getRange(1, 20)); - equal(mergedRange.start, 1, '1..20 | 5..10 | start'); - equal(mergedRange.end, 20, '1..20 | 5..10 | end'); - - mergedRange = range.union(getRange(-5, 7)); - equal(mergedRange.start, -5, '-5..7 | 5..10 | start'); - equal(mergedRange.end, 10, '-5..7 | 5..10 | end'); - - mergedRange = range.union(getRange(-5, 50)); - equal(mergedRange.start, -5, '-5..50 | 5..10 | start'); - equal(mergedRange.end, 50, '-5..50 | 5..10 | end'); - }); - - method('intersect', function() { - var range = getRange(5, 10), mergedRange; - - mergedRange = range.intersect(getRange(1, 5)); - equal(mergedRange.start, 5, '1..5 & 5..10 | start'); - equal(mergedRange.end, 5, '1..5 & 5..10 | end'); - - mergedRange = range.intersect(getRange(7, 8)); - equal(mergedRange.start, 7, '7..8 & 5..10 | start'); - equal(mergedRange.end, 8, '7..8 & 5..10 | end'); - - mergedRange = range.intersect(getRange(1, 4)); - equal(mergedRange.isValid(), false, '1..4 & 5..10 | isValid'); - - mergedRange = range.intersect(getRange(1, 3)); - equal(mergedRange.isValid(), false, '1..3 & 5..10 | isValid'); - - mergedRange = range.intersect(getRange(1, 1)); - equal(mergedRange.isValid(), false, '1..1 & 5..10 | isValid'); - - mergedRange = range.intersect(getRange(1, 20)); - equal(mergedRange.start, 5, '1..20 & 5..10 | start'); - equal(mergedRange.end, 10, '1..20 & 5..10 | end'); - - mergedRange = range.intersect(getRange(-5, 7)); - equal(mergedRange.start, 5, '-5..7 & 5..10 | start'); - equal(mergedRange.end, 7, '-5..7 & 5..10 | end'); - - mergedRange = range.intersect(getRange(-5, 50)); - equal(mergedRange.start, 5, '-5..50 & 5..10 | start'); - equal(mergedRange.end, 10, '-5..50 & 5..10 | end'); - - mergedRange = getRange(-5, 5).intersect(getRange(-20, 0)); - equal(mergedRange.start, -5, '-5..5 & -20..0 | start'); - equal(mergedRange.end, 0, '-5..5 & -20..0 | end'); - }); - - method('clone', function() { - var range = getRange(5, 10); - var clonedRange = range.clone(); - - equal(clonedRange.start, 5, 'cloned range start'); - equal(clonedRange.end, 10, 'cloned range end'); - equal(clonedRange === range, false, 'cloned range should not be strictly equal'); - }); - - - method('every', function() { - var count, callback, result; - var range = getRange(5, 10); - - count = 0; - result = range.every(1, function() { - count++; - }); - - equal(result, [5,6,7,8,9,10], 'result should be an array'); - equal(count, 6, 'every 1'); - - count = 0; - - result = range.every(2, function() { - count++; - }); - - equal(result, [5,7,9], 'every 2 | result should be an array'); - equal(count, 3, 'every 2 | count'); - - count = 0; - - result = range.every(function() { - count++; - }); - - equal(result, [5,6,7,8,9,10], 'result should be an array'); - equal(count, 6, 'every 1'); - - equal(getRange(1, 5).every(null, function(){}), [1,2,3,4,5], 'Number | 1..5 | null increment defaults to 1'); - - }); - - method('clamp', function() { - var range = getRange(5, 10); - - equal(range.clamp(25), 10, '25'); - equal(range.clamp(10), 10, '10'); - equal(range.clamp(9), 9, '9'); - equal(range.clamp(8), 8, '8'); - equal(range.clamp(7), 7, '7'); - equal(range.clamp(6), 6, '6'); - equal(range.clamp(5), 5, '5'); - equal(range.clamp(4), 5, '4'); - equal(range.clamp(1), 5, '1'); - equal(range.clamp(0), 5, '0'); - equal(range.clamp(-1), 5, '-1'); - }); - - method('inverse', function() { - var range = getRange(4, 1); - - equal(range.toString(), '4..1', 'toString'); - equal(range.isValid(), true, 'isValid'); - equal(range.every(), [4,3,2,1], 'every'); - - equal(getRange(NaN, NaN).toString(), 'Invalid Range', 'toString'); - }); - - - method('contains', function() { - var range; - - range = getRange(1, Infinity); - equal(range.contains(1), true, '1..Infinity | contains 1'); - equal(range.contains(10), true, '1..Infinity | contains 10'); - equal(range.contains(100), true, '1..Infinity | contains 100'); - equal(range.contains(Infinity), true, '1..Infinity | contains 100'); - equal(range.contains(0), false, '1..Infinity | contains 0'); - equal(range.contains(-1), false, '1..Infinity | contains -1'); - equal(range.contains(-10), false, '1..Infinity | contains -10'); - equal(range.contains(-100), false, '1..Infinity | contains -100'); - equal(range.contains(-Infinity), false, '1..Infinity | contains -Infinity'); - - range = getRange(-Infinity, 1); - equal(range.contains(1), true, '-Infinity..1 | contains 1'); - equal(range.contains(10), false, '-Infinity..1 | contains 10'); - equal(range.contains(100), false, '-Infinity..1 | contains 100'); - equal(range.contains(Infinity), false, '-Infinity..1 | contains 100'); - equal(range.contains(0), true, '-Infinity..1 | contains 0'); - equal(range.contains(-1), true, '-Infinity..1 | contains -1'); - equal(range.contains(-10), true, '-Infinity..1 | contains -10'); - equal(range.contains(-100), true, '-Infinity..1 | contains -100'); - equal(range.contains(-Infinity), true, '-Infinity..1 | contains -Infinity'); - - range = getRange(-Infinity, Infinity); - equal(range.contains(1), true, '-Infinity..Infinity | contains 1'); - equal(range.contains(10), true, '-Infinity..Infinity | contains 10'); - equal(range.contains(100), true, '-Infinity..Infinity | contains 100'); - equal(range.contains(Infinity), true, '-Infinity..Infinity | contains 100'); - equal(range.contains(0), true, '-Infinity..Infinity | contains 0'); - equal(range.contains(-1), true, '-Infinity..Infinity | contains -1'); - equal(range.contains(-10), true, '-Infinity..Infinity | contains -10'); - equal(range.contains(-100), true, '-Infinity..Infinity | contains -100'); - equal(range.contains(-Infinity), true, '-Infinity..Infinity | contains -Infinity'); - - range = getRange(0, 0); - equal(range.contains(-1), false, '0..0 | contains -1'); - equal(range.contains(0), true, '0..0 | contains 0'); - equal(range.contains(1), false, '0..0 | contains 1'); - - range = getRange(null, null); - equal(range.contains(-1), false, 'null..null | contains -1'); - equal(range.contains(0), true, 'null..null | contains 0'); - equal(range.contains(1), false, 'null..null | contains 1'); - equal(range.isValid(), false, 'null..null | isValid'); - - range = getRange(undefined, undefined); - equal(range.contains(-1), false, 'undefined..undefined | contains -1'); - equal(range.contains(0), false, 'undefined..undefined | contains 0'); - equal(range.contains(1), false, 'undefined..undefined | contains 1'); - equal(range.isValid(), false, 'undefined..undefined | isValid'); - - equal(getRange(new Date(2010, 0).getTime(), new Date(2010, 2).getTime()).contains(new Date(2010, 0)), true, 'contains different type'); - }); - - method('toArray', function() { - equal(getRange(1, 5).toArray(), [1,2,3,4,5], 'should work on number ranges'); - equal(getRange(5, 1).toArray(), [5,4,3,2,1], 'should work on inverse number ranges'); - }); - - method('clamp', function() { - test(25, [5, 10], 10, '25'); - test(10, [5, 10], 10, '10'); - test(9, [5, 10], 9, '9'); - test(8, [5, 10], 8, '8'); - test(7, [5, 10], 7, '7'); - test(6, [5, 10], 6, '6'); - test(5, [5, 10], 5, '5'); - test(4, [5, 10], 5, '4'); - test(1, [5, 10], 5, '1'); - test(0, [5, 10], 5, '0'); - test(-1, [5, 10], 5, '-1'); - - test(25, [10, 5], 10, 'inverted | 25'); - test(10, [10, 5], 10, 'inverted | 10'); - test(9, [10, 5], 9, 'inverted | 9'); - test(8, [10, 5], 8, 'inverted | 8'); - test(7, [10, 5], 7, 'inverted | 7'); - test(6, [10, 5], 6, 'inverted | 6'); - test(5, [10, 5], 5, 'inverted | 5'); - test(4, [10, 5], 5, 'inverted | 4'); - test(1, [10, 5], 5, 'inverted | 1'); - test(0, [10, 5], 5, 'inverted | 0'); - test(-1, [10, 5], 5, 'inverted | -1'); - }); - - method('cap', function() { - test(5, [6], 5, '5 capped to 6'); - test(5, [5], 5, '5 capped to 5'); - test(5, [4], 4, '5 capped to 4'); - test(5, [1], 1, '5 capped to 1'); - test(5, [0], 0, '5 capped to 0'); - test(5, [-1], -1, '5 capped to -1'); - test(5, [-5], -5, '5 capped to -5'); - test(5, [-10], -10, '5 capped to -10'); - - test(0, [6], 0, '0 capped to 6'); - test(0, [5], 0, '0 capped to 5'); - test(0, [4], 0, '0 capped to 4'); - test(0, [1], 0, '0 capped to 1'); - test(0, [0], 0, '0 capped to 0'); - test(0, [-1], -1, '0 capped to -1'); - test(0, [-5], -5, '0 capped to -5'); - test(0, [-10], -10, '0 capped to -10'); - - test(-5, [6], -5, '-5 capped to 6'); - test(-5, [5], -5, '-5 capped to 5'); - test(-5, [4], -5, '-5 capped to 4'); - test(-5, [1], -5, '-5 capped to 1'); - test(-5, [0], -5, '-5 capped to 0'); - test(-5, [-1], -5, '-5 capped to -1'); - test(-5, [-5], -5, '-5 capped to -5'); - test(-5, [-10], -10, '-5 capped to -10'); - }); - - method('upto', function() { - - var ret; - var counter = 0; - var dCounter = 1; - var callback = function(n, i) { - equal(n, dCounter, 'n is set'); - equal(i, counter, 'index is set'); - counter++; - dCounter++; - }; - var ret = run(1, 'upto', [5, callback]); - equal(counter, 5, 'iterated 5 times'); - equal(ret, [1,2,3,4,5], 'returns array'); - - var counter = 0; - var dCounter = 5; - var callback = function(n, i) { - equal(n, dCounter, 'n is set'); - equal(i, counter, 'index is set'); - counter++; - dCounter--; - }; - var ret = run(5, 'upto', [1, callback]); - equal(counter, 5, 'up to 1 | iterates 5 times'); - equal(ret, [5,4,3,2,1], 'up to 1 | returns equivalent of downto'); - - test(3, [9, 3], [3,6,9], 'step by 3'); - test(3, [10, 3], [3,6,9], 'step by 3 | stops at 9'); - test(3, [8, 3], [3,6], 'step by 3 | stops at 8'); - - - // Issue #394 - Ranges using infinity are not valid. - - test(1, [Infinity], [], 'cannot go up to infinity'); - test(1, [-Infinity], [], 'cannot go up to negative infinity'); - test(Infinity, [1], [], 'cannot go up from infinity'); - test(-Infinity, [1], [], 'cannot go up from negative infinity'); - - }); - - method('downto', function() { - var ret; - var counter = 0; - var dCounter = 5; - var callback = function(n, i) { - equal(n, dCounter, 'n is set'); - equal(i, counter, 'index is set'); - counter++; - dCounter--; - } - - ret = run(5, 'downto', [1, callback]); - equal(counter, 5, 'iterated 5 times'); - equal(ret, [5,4,3,2,1], 'returns array'); - - - counter = 0; - dCounter = 5; - callback = function(n, i) { - equal(n, dCounter, 'n is set'); - equal(i, counter, 'index is set'); - counter++; - dCounter++; - }; - ret = run(5, 'downto', [10, callback]); - equal(counter, 6, '5 downto 10 | iterates 6 times'); - equal(ret, [5,6,7,8,9,10], '5 downto 10 | returns equivalent of upto'); - - test(9, [3, 3], [9,6,3], 'can handle multiples'); - test(9, [4, 3], [9,6], 'can handle multiples stops at 4'); - test(9, [2, 3], [9,6,3], 'can handle multiples stops at 2'); - - }); - - -}); diff --git a/test/OLD/tests/range/string.js b/test/OLD/tests/range/string.js deleted file mode 100644 index ba4febf63..000000000 --- a/test/OLD/tests/range/string.js +++ /dev/null @@ -1,143 +0,0 @@ -namespace('String', function () { - 'use strict'; - - function getRange() { - return Sugar.String.range.apply(null, testGetArgs(arguments)); - } - - group('basics', function() { - var range = getRange('k', 'o'); - - equal(range.toString(), 'k..o', 'String | Range | toString'); - equal(range.isValid(), true, 'String | Range | isValid'); - equal(range.span(), 5, 'String | Range | span'); - equal(range.contains(), false, 'String | Range | contains undefined'); - equal(range.contains('j'), false, 'String | Range | contains j'); - equal(range.contains('k'), true, 'String | Range | contains k'); - equal(range.contains('l'), true, 'String | Range | contains l'); - equal(range.contains('m'), true, 'String | Range | contains m'); - equal(range.contains('n'), true, 'String | Range | contains n'); - equal(range.contains('o'), true, 'String | Range | contains o'); - equal(range.contains('p'), false, 'String | Range | contains p'); - - var range = getRange('o', 'k'); - - equal(range.toString(), 'o..k', 'String | Range | inverse | toString'); - equal(range.isValid(), true, 'String | Range | inverse | isValid'); - - equal(getRange(NaN, NaN).toString(), 'Invalid Range', 'String | Range | invalid | toString'); - - }); - - method('union', function() { - var range = getRange('k', 'o'); - - var mergedRange = range.union(getRange('h', 'm')); - equal(mergedRange.start, 'h', 'String | h..m | k..o | start'); - equal(mergedRange.end, 'o', 'String | h..m | k..o | end'); - - var mergedRange = range.union(getRange('a', 'd')); - equal(mergedRange.start, 'a', 'String | a..d | k..o | start'); - equal(mergedRange.end, 'o', 'String | a..d | a..d | end'); - - var mergedRange = range.union(getRange('a', 'c')); - equal(mergedRange.start, 'a', 'String | a..c | k..o | start'); - equal(mergedRange.end, 'o', 'String | a..c | k..o | end'); - - var mergedRange = range.union(getRange('a', 'a')); - equal(mergedRange.start, 'a', 'String | a..a | k..o | start'); - equal(mergedRange.end, 'o', 'String | a..a | k..o | end'); - - var mergedRange = range.union(getRange('a', 'z')); - equal(mergedRange.start, 'a', 'String | a..z | k..o | start'); - equal(mergedRange.end, 'z', 'String | a..z | k..o | end'); - - var mergedRange = range.union(getRange('', '')); - equal(mergedRange.isValid(), false, 'String | .. | k..o | is not valid'); - equal(mergedRange.start, '', 'String | .. | k..o | start'); - equal(mergedRange.end, 'o', 'String | .. | k..o | end'); - }); - - method('intersect', function() { - var range = getRange('k', 'o'); - - var mergedRange = range.intersect(getRange('a', 'd')); - equal(mergedRange.isValid(), false, 'String | a..d | k..o | invalid'); - - var mergedRange = range.intersect(getRange('c', 'l')); - equal(mergedRange.start, 'k', 'String | c..l | k..o | start'); - equal(mergedRange.end, 'l', 'String | c..l | k..o | end'); - - var mergedRange = range.intersect(getRange('l', 'n')); - equal(mergedRange.start, 'l', 'String | l..n | k..o | start'); - equal(mergedRange.end, 'n', 'String | l..n | k..o | end'); - - var mergedRange = range.intersect(getRange('n', 'q')); - equal(mergedRange.start, 'n', 'String | n..q | k..o | start'); - equal(mergedRange.end, 'o', 'String | n..q | k..o | end'); - - var mergedRange = range.intersect(getRange('s', 'z')); - equal(mergedRange.isValid(), false, 'String | s..z | k..o | invalid'); - - }); - - method('clone', function() { - var range = getRange('k', 'o'); - var clonedRange = range.clone(); - - equal(clonedRange.start, 'k', 'String | Range | cloned range start'); - equal(clonedRange.end, 'o', 'String | Range | cloned range end'); - equal(clonedRange === range, false, 'String | Range | cloned range should not be strictly equal'); - - }); - - method('every', function() { - var range = getRange('k', 'o'); - - var count = 0; - var result = range.every(1, function() { - count++; - }); - - equal(result, ['k','l','m','n','o'], 'String | Range | result should be an array'); - equal(count, 5, 'String | Range | every 1'); - - var count = 0; - var result = range.every(2, function() { - count++; - }); - - equal(result, ['k','m','o'], 'String | Range every 2 | result should be an array'); - equal(count, 3, 'String | Range every 2 | count'); - - var count = 0; - var result = range.every(function() { - count++; - }); - equal(result, ['k','l','m','n','o'], 'String | Range | result should be an array'); - equal(count, 5, 'String | Range | every 1'); - - }); - - method('clamp', function() { - var range = getRange('k', 'o'); - - equal(range.clamp('z'), 'o', 'String | Range#clamp | z'); - equal(range.clamp('j'), 'k', 'String | Range#clamp | j'); - equal(range.clamp('k'), 'k', 'String | Range#clamp | k'); - equal(range.clamp('l'), 'l', 'String | Range#clamp | l'); - equal(range.clamp('n'), 'n', 'String | Range#clamp | n'); - equal(range.clamp('o'), 'o', 'String | Range#clamp | o'); - equal(range.clamp('p'), 'o', 'String | Range#clamp | p'); - equal(range.clamp(-1), -1, 'String | Range#clamp | -1'); - equal(range.clamp(0), 0, 'String | Range#clamp | 0'); - equal(range.clamp(1), 1, 'String | Range#clamp | 1'); - - }); - - method('toArray', function() { - equal(getRange('a', 'd').toArray(), ['a','b','c','d'], 'should work on string ranges'); - equal(getRange('d', 'a').toArray(), ['d','c','b','a'], 'should work on inverse string ranges'); - }); - -}); diff --git a/test/OLD/tests/regexp.js b/test/OLD/tests/regexp.js deleted file mode 100644 index bd4a6b80e..000000000 --- a/test/OLD/tests/regexp.js +++ /dev/null @@ -1,22 +0,0 @@ -namespace('RegExp', function () { - 'use strict'; - - method('escape', function() { - }); - - method('setFlags', function() { - }); - - method('addFlags', function() { - }); - - - method('removeFlags', function() { - }); - - - method('getFlags', function() { - }); - -}); - diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 77a62a79f..3dc28ccaf 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -120,76 +120,6 @@ namespace('String', function () { }); - method('capitalize', function() { - - test('wasabi', 'Wasabi', 'lowercase word'); - test('Wasabi', 'Wasabi', 'capitalized word'); - test('WASABI', 'WASABI', 'all caps'); - test('WasAbI', 'WasAbI', 'mixed'); - test('wasabi sandwich', 'Wasabi sandwich', 'two words'); - test('WASABI SANDWICH', 'WASABI SANDWICH', 'two words all caps'); - test("wasabi's SANDWICH", "Wasabi's SANDWICH", 'mixed with apostrophe'); - - withArgs([true], 'Downcase', function() { - test('wasabi', 'Wasabi', 'downcase | lowercase word'); - test('Wasabi', 'Wasabi', 'downcase | capitalized word'); - test('WASABI', 'Wasabi', 'downcase | all caps'); - test('WasAbI', 'Wasabi', 'downcase | mixed'); - test('wasabi sandwich', 'Wasabi sandwich', 'two words'); - test('WASABI SANDWICH', 'Wasabi sandwich', 'two words all caps'); - - test("wasabi's SANDWICH", "Wasabi's sandwich", 'mixed with apostrophe'); - test("wasabis' SANDWICH", "Wasabis' sandwich", 'mixed with apostrophe last'); - - test('reuben sandwich', 'Reuben sandwich', 'should capitalize all first letters'); - test('фыва йцук', 'Фыва йцук', 'should capitalize unicode letters'); - }); - - withArgs([false, true], 'All Words', function() { - test('wasabi', 'Wasabi', 'lowercase word'); - test('Wasabi', 'Wasabi', 'capitalized word'); - test('WASABI', 'WASABI', 'all caps'); - test('WasAbI', 'WasAbI', 'mixed'); - test('wasabi sandwich', 'Wasabi Sandwich', 'two words'); - test('WASABI SANDWICH', 'WASABI SANDWICH', 'two words all caps'); - - test("wasabi's SANDWICH", "Wasabi's SANDWICH", 'should not touch apostrophe'); - test("'you' and 'me'", "'You' And 'Me'", 'should find words in single quotes'); - - }); - - withArgs([true, true], 'Downcase | All Words', function() { - test('wasabi', 'Wasabi', 'downcase | lowercase word'); - test('Wasabi', 'Wasabi', 'downcase | capitalized word'); - test('WASABI', 'Wasabi', 'downcase | all caps'); - test('WasAbI', 'Wasabi', 'downcase | mixed'); - test('wasabi sandwich', 'Wasabi Sandwich', 'two words'); - test('WASABI SANDWICH', 'Wasabi Sandwich', 'two words all caps'); - test("wasabi's SANDWICH", "Wasabi's Sandwich", 'mixed with apostrophe'); - - test('reuben-sandwich', 'Reuben-Sandwich', 'hyphen'); - test('reuben(sandwich)', 'Reuben(Sandwich)', 'parentheses'); - test('reuben,sandwich', 'Reuben,Sandwich', 'comma'); - test('reuben;sandwich', 'Reuben;Sandwich', 'semicolon'); - test('reuben.sandwich', 'Reuben.Sandwich', 'period'); - test('reuben_sandwich', 'Reuben_Sandwich', 'underscore'); - test('reuben\nsandwich', 'Reuben\nSandwich', 'new line'); - test("reuben's sandwich", "Reuben's Sandwich", 'apostrophe should not trigger capitalize'); - - test('фыва-йцук', 'Фыва-Йцук', 'Russian with hyphens'); - test('фыва,йцук', 'Фыва,Йцук', 'Russian with comma'); - test('фыва;йцук', 'Фыва;Йцук', 'Russian with semicolon'); - test('фыва7йцук', 'Фыва7Йцук', 'Russian with 7'); - - test('what a shame of a title', 'What A Shame Of A Title', 'all lower-case'); - test('What A Shame Of A Title', 'What A Shame Of A Title', 'already capitalized'); - test(' what a shame of a title ', ' What A Shame Of A Title ', 'preserves whitespace'); - test(' what a shame of\n a title ', ' What A Shame Of\n A Title ', 'preserves new lines'); - }); - - test('', '', 'blank'); - }); - method('trimLeft', function() { test(' wasabi ', 'wasabi ', 'should trim left whitespace only'); test('', '', 'blank'); From 34ed98abe4f9b43aa1d4c8997ac71bc0d95fea25 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 18 Jul 2020 17:22:50 +0900 Subject: [PATCH 029/191] Added String#pad. --- CHANGELOG.md | 2 + src/string/define.js | 1 + src/string/methods.js | 1 + src/string/pad.js | 27 +++++++++++++ test/OLD/tests/string.js | 86 ---------------------------------------- test/tests/string.js | 61 ++++++++++++++++++++++++++++ 6 files changed, 92 insertions(+), 86 deletions(-) create mode 100644 src/string/pad.js diff --git a/CHANGELOG.md b/CHANGELOG.md index d3795b50e..977c72ce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ v3.0.0 - Removed support for bower. - Removed `String#padLeft` and `String#padRight` in favor of native `String#padStart` and `String#padEnd`. - Removed `String#trimLeft` and `String#trimRight` in favor of native `String#trimStart` and `String#trimEnd`. +- `String#pad` will now place equal padding on either side, reducing the target length by 1 for odd lengths. +- `String#pad` now internally uses `String#padStart` and `String#padEnd`, and will throw the same input errors. - Added `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. - Renamed `Number#chr` to `Number#toChar`. - Renamed `Number#ordinalize` to `Number#toOrdinal`. diff --git a/src/string/define.js b/src/string/define.js index 7a59ed761..f615b0f09 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -3,3 +3,4 @@ import * as methods from './methods'; defineStatic('range', methods.range); defineInstance('capitalize', methods.capitalize); +defineInstance('pad', methods.pad); diff --git a/src/string/methods.js b/src/string/methods.js index c53a1174d..b16d1622d 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -1,2 +1,3 @@ export { default as range } from './range'; export { default as capitalize } from './capitalize'; +export { default as pad } from './pad'; diff --git a/src/string/pad.js b/src/string/pad.js new file mode 100644 index 000000000..3fc50acb6 --- /dev/null +++ b/src/string/pad.js @@ -0,0 +1,27 @@ +/** + * Pads the string evenly on both sides. + * + * @param {string} str - The string. + * @param {number} [length] - The target length to pad the string to. If the + * sum of the string's length and `length` is odd, the resulting string length + * will be `length - 1`. + * @param {string} [padString] - The string to use as padding. Defaults to empty + * space. + * + * @example + * + * 'string'.pad(10) -> ' string ' + * 'hello'.pad(10) -> ' hello ' + * + **/ +export default function pad(str, length, padString) { + if (!length) { + return str; + } + const len = str.length; + let sum = len + length; + if (sum % 2 === 1) { + sum -= 1; + } + return str.padStart(sum / 2, padString).padEnd(sum - len, padString); +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 3dc28ccaf..f06999fc0 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -51,15 +51,11 @@ namespace('String', function () { raisesError(function() { run('% 23'); }, 'should raise an error for malformed urls'); }); - - method('escapeHTML', function() { - test('

some text

', '<p>some text</p>', '

some text

'); test('war & peace & food', 'war & peace & food', 'war & peace'); test('&', '&amp;', 'double escapes &'); test('<span>already escaped, yo</span>', '&lt;span&gt;already escaped, yo&lt;/span&gt;', 'already escaped will be double-escaped'); - }); method('unescapeHTML', function() { @@ -136,88 +132,6 @@ namespace('String', function () { test(lineTerminators, '', 'should trim all LineTerminator characters defined in 7.3'); }); - method('pad', function() { - - raisesError(function(){ run('wasabi', 'pad', [-1]); }, '-1 raises error'); - raisesError(function(){ run('wasabi', 'pad', [-Infinity]); }, '-Infinity raises error'); - raisesError(function(){ run('wasabi', 'pad', [Infinity]); }, 'Infinity raises error'); - - test('wasabi', 'wasabi', 'no arguments default to 0'); - test('wasabi', [undefined], 'wasabi', 'undefined defaults to 0'); - test('wasabi', [null], 'wasabi', 'null defaults to 0'); - test('wasabi', [NaN], 'wasabi', 'NaN defaults to 0'); - - test('', [false], '', 'false is 0'); - test('', [true], ' ', 'true is 1'); - - test('wasabi', [0], 'wasabi', '0'); - test('wasabi', [1], 'wasabi', '1'); - test('wasabi', [2], 'wasabi', '2'); - test('wasabi', [3], 'wasabi', '3'); - test('wasabi', [4], 'wasabi', '4'); - test('wasabi', [5], 'wasabi', '5'); - test('wasabi', [6], 'wasabi', '6'); - test('wasabi', [7], 'wasabi ', '7'); - test('wasabi', [8], ' wasabi ', '8'); - test('wasabi', [9], ' wasabi ', '9'); - test('wasabi', [10], ' wasabi ', '10'); - test('wasabi', [12], ' wasabi ', '12'); - test('wasabi', [20], ' wasabi ', '12'); - - test('wasabi', [8, '"'], '"wasabi"', 'padding with quotes'); - test('wasabi', [8, ''], 'wasabi', 'empty string should have no padding'); - test('wasabi', [8, 's'], 'swasabis', 'padding with s'); - test('wasabi', [8, 5], '5wasabi5', 'padding with a number'); - test('wasabi', [12, '-'], '---wasabi---', 'should pad the string with 6 hyphens'); - - }); - - method('padLeft', function() { - - raisesError(function() { run('wasabi', 'padLeft', [-1]); }, '-1 raises error'); - raisesError(function() { run('wasabi', 'padLeft', [Infinity]); }, 'Infinity raises error'); - - test('wasabi', [0], 'wasabi', '0'); - test('wasabi', [1], 'wasabi', '1'); - test('wasabi', [2], 'wasabi', '2'); - test('wasabi', [3], 'wasabi', '3'); - test('wasabi', [4], 'wasabi', '4'); - test('wasabi', [5], 'wasabi', '5'); - test('wasabi', [6], 'wasabi', '6'); - test('wasabi', [7], ' wasabi', '7'); - test('wasabi', [8], ' wasabi', '8'); - test('wasabi', [9], ' wasabi', '9'); - test('wasabi', [10], ' wasabi', '10'); - test('wasabi', [12], ' wasabi', '12'); - test('wasabi', [20], ' wasabi', '20'); - test('wasabi', [12, '-'], '------wasabi', '12 with hyphens'); - test('wasabi', [12, '+'], '++++++wasabi', '12 with pluses'); - - }); - - method('padRight', function() { - - raisesError(function() { run('wasabi', 'padRight', [-1]); }, '-1 raises error'); - raisesError(function() { run('wasabi', 'padRight', [Infinity]); }, 'Infinity raises error'); - - test('wasabi', [0], 'wasabi', '0'); - test('wasabi', [1], 'wasabi', '1'); - test('wasabi', [2], 'wasabi', '2'); - test('wasabi', [3], 'wasabi', '3'); - test('wasabi', [4], 'wasabi', '4'); - test('wasabi', [5], 'wasabi', '5'); - test('wasabi', [6], 'wasabi', '6'); - test('wasabi', [7], 'wasabi ', '7'); - test('wasabi', [8], 'wasabi ', '8'); - test('wasabi', [9], 'wasabi ', '9'); - test('wasabi', [10], 'wasabi ', '10'); - test('wasabi', [12], 'wasabi ', '12'); - test('wasabi', [20], 'wasabi ', '20'); - test('wasabi', [12, '-'], 'wasabi------', '12 with hyphens'); - test('wasabi', [12, '+'], 'wasabi++++++', '12 with pluses'); - - }); - method('shift', function() { test('ク', [1], 'グ', 'should shift 1 code up'); diff --git a/test/tests/string.js b/test/tests/string.js index 0fc60defd..33016d344 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -169,4 +169,65 @@ namespace('String', function() { }); + describeInstance('pad', function(pad) { + + it('should pad even length string to exact length', () => { + assertEqual(pad('wasabi', 0), 'wasabi'); + assertEqual(pad('wasabi', 1), 'wasabi'); + assertEqual(pad('wasabi', 2), 'wasabi'); + assertEqual(pad('wasabi', 3), 'wasabi'); + assertEqual(pad('wasabi', 4), 'wasabi'); + assertEqual(pad('wasabi', 5), 'wasabi'); + assertEqual(pad('wasabi', 6), 'wasabi'); + assertEqual(pad('wasabi', 7), 'wasabi'); + assertEqual(pad('wasabi', 8), ' wasabi '); + assertEqual(pad('wasabi', 9), ' wasabi '); + assertEqual(pad('wasabi', 10), ' wasabi '); + assertEqual(pad('wasabi', 12), ' wasabi '); + assertEqual(pad('wasabi', 20), ' wasabi '); + }); + + it('should pad odd length string to target length + 1', () => { + assertEqual(pad('hello', 0), 'hello'); + assertEqual(pad('hello', 1), 'hello'); + assertEqual(pad('hello', 2), 'hello'); + assertEqual(pad('hello', 3), 'hello'); + assertEqual(pad('hello', 4), 'hello'); + assertEqual(pad('hello', 5), 'hello'); + assertEqual(pad('hello', 6), 'hello'); + assertEqual(pad('hello', 7), ' hello '); + assertEqual(pad('hello', 8), ' hello '); + assertEqual(pad('hello', 9), ' hello '); + assertEqual(pad('hello', 10), ' hello '); + assertEqual(pad('hello', 12), ' hello '); + assertEqual(pad('hello', 20), ' hello '); + }); + + it('should pad with custom string', () => { + assertEqual(pad('wasabi', 8, '"'), '"wasabi"'); + assertEqual(pad('wasabi', 8, ''), 'wasabi'); + assertEqual(pad('wasabi', 8, 's'), 'swasabis'); + assertEqual(pad('wasabi', 8, 5), '5wasabi5'); + assertEqual(pad('wasabi', 12, '-'), '---wasabi---'); + assertEqual(pad('hello', 12, '-'), '---hello---'); + }); + + it('should pad with non-standard arguments', () => { + assertEqual(pad('wasabi'), 'wasabi'); + assertEqual(pad('wasabi', undefined), 'wasabi'); + assertEqual(pad('wasabi', null), 'wasabi'); + assertEqual(pad('wasabi', NaN), 'wasabi'); + + assertEqual(pad('', false), ''); + assertEqual(pad('', true), ''); + }); + + it('should not throw equivalent errors to padStart/padEnd', () => { + assertNoError(function(){ pad('wasabi', -1); }); + assertNoError(function(){ pad('wasabi', -Infinity); }); + assertError(function(){ pad('wasabi', Infinity); }); + }); + + }); + }); From cafa9eed09af52bd07618515ae6c793d3209f21b Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 18 Jul 2020 17:23:03 +0900 Subject: [PATCH 030/191] version bump and .eslintrc --- package.json | 2 +- test/.eslintrc | 4 ++++ yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2184dcc83..82b400268 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.28", + "ready-test": "^1.0.29", "sinon": "^7.5.0", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/test/.eslintrc b/test/.eslintrc index 0cefdfb77..95ea397fc 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -21,6 +21,10 @@ namespace: true, describeStatic: true, describeInstance: true, + fdescribeStatic: true, + fdescribeInstance: true, + xdescribeStatic: true, + xdescribeInstance: true, afterEach: true, beforeEach: true, assertNaN: true, diff --git a/yarn.lock b/yarn.lock index 0ef613533..884a2c1f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3496,10 +3496,10 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -ready-test@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.28.tgz#550760a9254240ed3f623589dc0dc783cb31cb1d" - integrity sha512-ICQt/L1x0bpgkyuhz2wI4pu/cq7EkC/rvWInF+TbygWEk1k7VKSV7RytcfN+BXGqm/kDXeJrRX/1byCkFGb4jA== +ready-test@^1.0.29: + version "1.0.29" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.29.tgz#943764c6dea38c1f57e245de1892fc1bdc214f9b" + integrity sha512-ISLxp5PvoUpi+NTVf1mzQvh1gzOK25+J5rxiOdLdgwmB41J8knj8ak6jJY1RmFvoLHqPzMjqc7WRcRlTC4cm5w== dependencies: argv "^0.0.2" chalk "^2.4.2" From 1d002f0eaea4e810a2d19985f4e4f500ccf6bb0d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 19 Jul 2020 22:23:47 +0900 Subject: [PATCH 031/191] added String#truncate and String#truncateOnWord --- src/string/define.js | 2 + src/string/methods.js | 2 + src/string/truncate.js | 41 +++++++++ src/string/truncateOnWord.js | 71 +++++++++++++++ test/.eslintrc | 1 + test/OLD/tests/string.js | 102 --------------------- test/tests/string.js | 166 +++++++++++++++++++++++++++++++++++ 7 files changed, 283 insertions(+), 102 deletions(-) create mode 100644 src/string/truncate.js create mode 100644 src/string/truncateOnWord.js diff --git a/src/string/define.js b/src/string/define.js index f615b0f09..95d1cde19 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -4,3 +4,5 @@ import * as methods from './methods'; defineStatic('range', methods.range); defineInstance('capitalize', methods.capitalize); defineInstance('pad', methods.pad); +defineInstance('truncate', methods.truncate); +defineInstance('truncateOnWord', methods.truncateOnWord); diff --git a/src/string/methods.js b/src/string/methods.js index b16d1622d..95afed8a1 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -1,3 +1,5 @@ export { default as range } from './range'; export { default as capitalize } from './capitalize'; export { default as pad } from './pad'; +export { default as truncate } from './truncate'; +export { default as truncateOnWord } from './truncateOnWord'; diff --git a/src/string/truncate.js b/src/string/truncate.js new file mode 100644 index 000000000..c79157507 --- /dev/null +++ b/src/string/truncate.js @@ -0,0 +1,41 @@ +import { assertInteger } from '../util/assertions'; +import { isString } from '../util/typeChecks'; + +/** + * Truncates the string to a specific length. + * + * @param {string} str - The string to truncate. + * @param {number} length - The target length to truncate the string to. + * @param {string} [from] - Determines the position at which to truncate. One of + * `right`, `left` or `middle`. Default is `right`. + * @param {string} [ellipsis] - The ellipsis string to be added when truncating. + * Default is `...`. + * + * @example + * + * 'sittin on the dock'.truncate(10) -> 'sittin on ...' + * 'sittin on the dock'.truncate(10, 'left') -> '...n the dock' + * 'sittin on the dock'.truncate(10, 'middle') -> 'sitti... dock' + * + **/ +export default function truncate(str, length, from = 'right', ellipsis = '...') { + assertInteger(length); + if (!isString(str)) { + str = String(str); + } + length = Math.max(0, length); + if (str.length <= length) { + return str; + } + switch(from) { + case 'left': + str = str.slice(str.length - length); + return ellipsis + str; + case 'middle': + const str1 = str.slice(0, Math.ceil(length / 2)); + const str2 = str.slice(str.length - Math.floor(length / 2)); + return str1 + ellipsis + str2; + default: + return str.slice(0, length) + ellipsis; + } +} diff --git a/src/string/truncateOnWord.js b/src/string/truncateOnWord.js new file mode 100644 index 000000000..75f62b109 --- /dev/null +++ b/src/string/truncateOnWord.js @@ -0,0 +1,71 @@ +import { assertInteger } from '../util/assertions'; +import { isString } from '../util/typeChecks'; + +// Split on whitespace as well as sequences of known punctuation blocks. +const SEPARATOR_REG = /[\s\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00BF\u2000-\u206F\u2E00-\u2E7F\u3000-\u303F]/; + +/** + * Truncates the string to a specific length without splitting up words. + * + * @param {string} str - The string to truncate. + * @param {number} length - The target length to truncate the string to. + * @param {string} [from] - Determines the position at which to truncate. One of + * `right`, `left` or `middle`. Default is `right`. + * @param {string} [ellipsis] - The ellipsis string to be added when truncating. + * Default is `...`. + * + * @example + * + * 'sittin on the dock'.truncate(10) -> 'sittin on...' + * 'sittin on the dock'.truncate(10, 'left') -> '...on the dock' + * 'sittin on the dock'.truncate(10, 'middle') -> 'sittin...dock' + * + **/ +export default function truncateOnWord(str, length, from = 'right', ellipsis = '...') { + assertInteger(length); + if (!isString(str)) { + str = String(str); + } + if (str.length <= length) { + return str; + } + length = Math.max(0, length); + switch(from) { + case 'left': + return ellipsis + fromLeft(str, length); + case 'middle': { + const half = Math.floor(length / 2); + return fromRight(str, half) + ellipsis + fromLeft(str, half); + } + default: + return fromRight(str, length, false) + ellipsis; + } +} + +function fromRight(str, length) { + const reg = RegExp(SEPARATOR_REG.source, 'g'); + let index = null; + while (reg.exec(str)) { + const i = reg.lastIndex; + if (i > length + 1 || i >= str.length) { + break; + } + index = i; + } + if (index === null) { + index = length + 1; + } + return str.slice(0, index - 1); +} + +function fromLeft(str, length) { + str = str.slice(str.length - length - 1); + const match = str.match(SEPARATOR_REG); + let index; + if (match && match.index < str.length - 1) { + index = match.index; + } else { + index = 0; + } + return str.slice(index + 1); +} diff --git a/test/.eslintrc b/test/.eslintrc index 95ea397fc..d455b2b62 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -9,6 +9,7 @@ }, "globals": { it: true, + fit: true, add: true, mult: true, noop: true, diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index f06999fc0..970435c73 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -1098,108 +1098,6 @@ namespace('String', function () { }); - method('truncate', function() { - var str = 'Gotta be an entire sentence.'; - - test(str, [29], 'Gotta be an entire sentence.', 'no arguments | 29'); - test(str, [28], 'Gotta be an entire sentence.', 'no arguments | 28'); - test(str, [21], 'Gotta be an entire se...', 'split words | 21'); - test(str, [20], 'Gotta be an entire s...', 'split words | 20'); - test(str, [14], 'Gotta be an en...', 'split words | 14'); - test(str, [13], 'Gotta be an e...', 'split words | 13'); - test(str, [11], 'Gotta be an...', 'split words | 11'); - test(str, [10], 'Gotta be a...', 'split words | 10'); - test(str, [4], 'Gott...', 'split words | 4'); - test(str, [3], 'Got...', 'split words | 3'); - test(str, [2], 'Go...', 'split words | 2'); - test(str, [1], 'G...', 'split words | 1'); - test(str, [0], '...', 'split words | 0'); - - test('too short!', [30], 'too short!', 'will not add ellipsis if the string is too short'); - test('Gotta be an entire sentence.', [22, 'right', 'hooha'], 'Gotta be an entire senhooha', 'different ellipsis'); - test('booh pooh mooh', [7, 'right', 455], 'booh po455', 'converts numbers to strings'); - - test(str, [21, 'middle'], 'Gotta be an... sentence.', 'middle | no arguments | 21'); - test(str, [11, 'middle'], 'Gotta ...ence.', 'middle | no arguments | 11'); - test(str, [4, 'middle'], 'Go...e.', 'middle | no arguments | 4'); - test(str, [3, 'middle'], 'Go....', 'middle | no arguments | 3'); - test(str, [2, 'middle'], 'G....', 'middle | no arguments | 2'); - test(str, [0, 'middle'], '...', 'middle | no arguments | 0'); - test(str, [-100, 'middle'], '...', 'middle | no arguments | -100'); - - test(str, [21, 'left'], '...e an entire sentence.', 'left | no arguments | 21'); - test(str, [11, 'left'], '...e sentence.', 'left | no arguments | 11'); - test(str, [9, 'left'], '...sentence.', 'left | no arguments | 9'); - test(str, [4, 'left'], '...nce.', 'left | no arguments | 4'); - test(str, [3, 'left'], '...ce.', 'left | no arguments | 3'); - test(str, [2, 'left'], '...e.', 'left | no arguments | 2'); - test(str, [0, 'left'], '...', 'left | no arguments | 0'); - test(str, [-100, 'left'], '...', 'left | no arguments | -100'); - - test(str, [28, 'left', '>>> '], 'Gotta be an entire sentence.', 'custom [splitter] | 28'); - test(str, [23, 'left', '>>> '], '>>> be an entire sentence.', 'custom [splitter] | 23'); - test(str, [5, 'left', '>>> '], '>>> ence.', 'custom [splitter] | 5'); - test(str, [4, 'left', '>>> '], '>>> nce.', 'split | custom [splitter] | 4'); - test(str, [3, 'middle', '-'], 'Go-.', 'custom [splitter] | 4 | -'); - - test('123456', [2, 'left'], '...56', 'split | splitter not included left | 2'); - test('123456', [2, 'middle'], '1...6', 'split | splitter not included center | 2'); - test('123456', [2], '12...', 'split | splitter not included right | 2'); - - }); - - - method('truncateOnWord', function() { - var str = 'Gotta be an entire sentence.'; - - test(str, [21], 'Gotta be an entire...', '21'); - test(str, [20], 'Gotta be an entire...', '20'); - test(str, [19], 'Gotta be an entire...', '19'); - test(str, [18], 'Gotta be an entire...', '18'); - test(str, [17], 'Gotta be an...', '17'); - test(str, [14], 'Gotta be an...', '14'); - test(str, [13], 'Gotta be an...', '13'); - test(str, [11], 'Gotta be an...', '11'); - test(str, [10], 'Gotta be...', '10'); - test(str, [4], '...', '4'); - test(str, [3], '...', '3'); - test(str, [2], '...', '2'); - test(str, [1], '...', '1'); - test(str, [0], '...', '0'); - - test('GOTTA BE AN ENTIRE SENTENCE.', [21], 'GOTTA BE AN ENTIRE...', 'caps too | 21'); - test('GOTTA BE AN ENTIRE SENTENCE.', [17], 'GOTTA BE AN...', 'caps too | 20'); - test('gotta. be. an. entire. sentence.', [17], 'gotta. be. an....', 'no special punctuation treatment | 17'); - test('almost there', [11], 'almost...', 'will not add more than the original string'); - test('Gotta be an entire sentence.', [22, 'right', 'hooha'], 'Gotta be an entirehooha', 'different ellipsis'); - test('こんな ストリングは あまり ない と 思う けど。。。', [6], 'こんな...', 'correctly finds spaces in Japanese'); - test('한국어 도 이렇게 할 수 있어요?', [9], '한국어 도 이렇게...', 'correctly finds spaces in Korean'); - - test(str, [21, 'middle'], 'Gotta be an...sentence.', 'middle | no split | 21'); - test(str, [11, 'middle'], 'Gotta...', 'middle | no split | 11'); - test(str, [4, 'middle'], '...', 'middle | no split | 4'); - test(str, [3, 'middle'], '...', 'middle | no split | 3'); - test(str, [2, 'middle'], '...', 'middle | no split | 2'); - test(str, [0, 'middle'], '...', 'middle | no split | 0'); - test(str, [-100, 'middle'], '...', 'middle | no split | -100'); - - test(str, [21, 'left'], '...an entire sentence.', 'left | no split | 21'); - test(str, [11, 'left'], '...sentence.', 'left | no split | 11'); - test(str, [9, 'left'], '...sentence.', 'left | no split | 9'); - test(str, [4, 'left'], '...', 'left | no split | 4'); - test(str, [3, 'left'], '...', 'left | no split | 3'); - test(str, [2, 'left'], '...', 'left | no split | 2'); - test(str, [0, 'left'], '...', 'left | no split | 0'); - test(str, [-100, 'left'], '...', 'left | no split | -100'); - - test('123456', [2, 'left'], '...', 'splitter not included left | 2'); - test('123456', [2, 'middle'], '...', 'splitter not included center | 2'); - test('123456', [2], '...', 'splitter not included right | 2'); - test(str, [3, 'left', '>>> '], '>>> ', 'custom [splitter] | 4 | >>>'); - - test(str, [10, 'right', ''], 'Gotta be', 'empty [splitter] | 10'); - test('Alpha Beta Gamma Delta Epsilon', [20, 'middle', ''], 'Alpha BetaEpsilon', 'Issue 311'); - }); method('format', function() { diff --git a/test/tests/string.js b/test/tests/string.js index 33016d344..e9a33363a 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -230,4 +230,170 @@ namespace('String', function() { }); + describeInstance('truncate', function(truncate) { + var str = 'Gotta be an entire sentence.'; + + it('should truncate to a specific length', () => { + assertEqual(truncate(str, 29), 'Gotta be an entire sentence.'); + assertEqual(truncate(str, 28), 'Gotta be an entire sentence.'); + assertEqual(truncate(str, 21), 'Gotta be an entire se...'); + assertEqual(truncate(str, 20), 'Gotta be an entire s...'); + assertEqual(truncate(str, 14), 'Gotta be an en...'); + assertEqual(truncate(str, 13), 'Gotta be an e...'); + assertEqual(truncate(str, 11), 'Gotta be an...'); + assertEqual(truncate(str, 10), 'Gotta be a...'); + assertEqual(truncate(str, 4), 'Gott...'); + assertEqual(truncate(str, 3), 'Got...'); + assertEqual(truncate(str, 2), 'Go...'); + assertEqual(truncate(str, 1), 'G...'); + assertEqual(truncate(str, 0), '...'); + }); + + it('should truncate from the left', () => { + assertEqual(truncate(str, 21, 'left'), '...e an entire sentence.'); + assertEqual(truncate(str, 11, 'left'), '...e sentence.'); + assertEqual(truncate(str, 9, 'left'), '...sentence.'); + assertEqual(truncate(str, 4, 'left'), '...nce.'); + assertEqual(truncate(str, 3, 'left'), '...ce.'); + assertEqual(truncate(str, 2, 'left'), '...e.'); + assertEqual(truncate(str, 0, 'left'), '...'); + assertEqual(truncate(str, -100, 'left'), '...'); + }); + + it('should should truncate from the middle', () => { + assertEqual(truncate(str, 21, 'middle'), 'Gotta be an... sentence.'); + assertEqual(truncate(str, 11, 'middle'), 'Gotta ...ence.'); + assertEqual(truncate(str, 4, 'middle'), 'Go...e.'); + assertEqual(truncate(str, 3, 'middle'), 'Go....'); + assertEqual(truncate(str, 2, 'middle'), 'G....'); + assertEqual(truncate(str, 0, 'middle'), '...'); + assertEqual(truncate(str, -100, 'middle'), '...'); + }); + + it('should allow a custom ellipsis', () => { + assertEqual(truncate('string to truncate', 10, 'right', '|'), 'string to |'); + assertEqual(truncate('string to truncate', 10, 'right', 0), 'string to 0'); + assertEqual(truncate(str, 28, 'left', '>>> '), 'Gotta be an entire sentence.'); + assertEqual(truncate(str, 23, 'left', '>>> '), '>>> be an entire sentence.'); + assertEqual(truncate(str, 5, 'left', '>>> '), '>>> ence.'); + assertEqual(truncate(str, 4, 'left', '>>> '), '>>> nce.'); + assertEqual(truncate(str, 3, 'middle', '-'), 'Go-.'); + assertEqual(truncate('123456', 2, 'left'), '...56'); + assertEqual(truncate('123456', 2, 'middle'), '1...6'); + assertEqual(truncate('123456', 2), '12...'); + }); + + it('should handle irregular input', () => { + assertEqual(truncate(500, 2), '50...'); + assertEqual(truncate('short sentence', -1), '...'); + assertEqual(truncate('short sentence', 8, 'bad input'), 'short se...'); + assertEqual(truncate('short sentence', 8, 'right', 8), 'short se8'); + assertEqual(truncate('short sentence', 8, 'right', ''), 'short se'); + assertEqual(truncate('short sentence', 8, 'right', null), 'short senull'); + assertEqual(truncate('short sentence', 8, 'right', undefined), 'short se...'); + assertError(function(){ truncate('word', 'bad input'); }); + }); + + }); + + describeInstance('truncateOnWord', function(truncateOnWord) { + var str = 'Gotta be an entire sentence.'; + + it('should truncate to a specific length', () => { + assertEqual(truncateOnWord(str, 100), 'Gotta be an entire sentence.'); + assertEqual(truncateOnWord(str, 28), 'Gotta be an entire sentence.'); + assertEqual(truncateOnWord(str, 27), 'Gotta be an entire...'); + assertEqual(truncateOnWord(str, 21), 'Gotta be an entire...'); + assertEqual(truncateOnWord(str, 20), 'Gotta be an entire...'); + assertEqual(truncateOnWord(str, 19), 'Gotta be an entire...'); + assertEqual(truncateOnWord(str, 18), 'Gotta be an entire...'); + assertEqual(truncateOnWord(str, 17), 'Gotta be an...'); + assertEqual(truncateOnWord(str, 14), 'Gotta be an...'); + assertEqual(truncateOnWord(str, 13), 'Gotta be an...'); + assertEqual(truncateOnWord(str, 11), 'Gotta be an...'); + assertEqual(truncateOnWord(str, 10), 'Gotta be...'); + assertEqual(truncateOnWord(str, 4), 'Gott...'); + assertEqual(truncateOnWord(str, 3), 'Got...'); + assertEqual(truncateOnWord(str, 2), 'Go...'); + assertEqual(truncateOnWord(str, 1), 'G...'); + assertEqual(truncateOnWord(str, 0), '...'); + }); + + it('should truncate from left', () => { + assertEqual(truncateOnWord(str, 21, 'left'), '...an entire sentence.'); + assertEqual(truncateOnWord(str, 20, 'left'), '...an entire sentence.'); + assertEqual(truncateOnWord(str, 19, 'left'), '...an entire sentence.'); + assertEqual(truncateOnWord(str, 18, 'left'), '...entire sentence.'); + assertEqual(truncateOnWord(str, 17, 'left'), '...entire sentence.'); + assertEqual(truncateOnWord(str, 14, 'left'), '...sentence.'); + assertEqual(truncateOnWord(str, 13, 'left'), '...sentence.'); + assertEqual(truncateOnWord(str, 11, 'left'), '...sentence.'); + assertEqual(truncateOnWord(str, 10, 'left'), '...sentence.'); + assertEqual(truncateOnWord(str, 9, 'left'), '...sentence.'); + assertEqual(truncateOnWord(str, 8, 'left'), '...entence.'); + assertEqual(truncateOnWord(str, 4, 'left'), '...nce.'); + assertEqual(truncateOnWord(str, 3, 'left'), '...ce.'); + assertEqual(truncateOnWord(str, 2, 'left'), '...e.'); + assertEqual(truncateOnWord(str, 1, 'left'), '....'); + assertEqual(truncateOnWord(str, 0, 'left'), '...'); + }); + + it('should truncate from the middle', () => { + assertEqual(truncateOnWord(str, 21, 'middle'), 'Gotta be...sentence.'); + assertEqual(truncateOnWord(str, 20, 'middle'), 'Gotta be...sentence.'); + assertEqual(truncateOnWord(str, 19, 'middle'), 'Gotta be...sentence.'); + assertEqual(truncateOnWord(str, 18, 'middle'), 'Gotta be...sentence.'); + assertEqual(truncateOnWord(str, 17, 'middle'), 'Gotta be...entence.'); + assertEqual(truncateOnWord(str, 14, 'middle'), 'Gotta...ntence.'); + assertEqual(truncateOnWord(str, 13, 'middle'), 'Gotta...tence.'); + assertEqual(truncateOnWord(str, 11, 'middle'), 'Gotta...ence.'); + assertEqual(truncateOnWord(str, 10, 'middle'), 'Gotta...ence.'); + assertEqual(truncateOnWord(str, 9, 'middle'), 'Gott...nce.'); + assertEqual(truncateOnWord(str, 8, 'middle'), 'Gott...nce.'); + assertEqual(truncateOnWord(str, 4, 'middle'), 'Go...e.'); + assertEqual(truncateOnWord(str, 3, 'middle'), 'G....'); + assertEqual(truncateOnWord(str, 2, 'middle'), 'G....'); + assertEqual(truncateOnWord(str, 1, 'middle'), '...'); + assertEqual(truncateOnWord(str, 0, 'middle'), '...'); + }); + + it('should should break on non-space punctuation', () => { + assertEqual(truncateOnWord('a,short,string', 8), 'a,short...'); + assertEqual(truncateOnWord('a|short|string', 8), 'a|short...'); + assertEqual(truncateOnWord('a?short?string', 8), 'a?short...'); + assertEqual(truncateOnWord('a]short]string', 8), 'a]short...'); + assertEqual(truncateOnWord('a¿short¿string', 8), 'a¿short...'); + }); + + it('should should break on non-standard whitespace', () => { + assertEqual(truncateOnWord('a short string', 8), 'a short...'); + }); + + it('should handle special cases', () => { + assertEqual(truncateOnWord('GOTTA BE AN ENTIRE SENTENCE.', 21), 'GOTTA BE AN ENTIRE...'); + assertEqual(truncateOnWord('gotta. be. an. entire. sentence.', 17), 'gotta. be. an....'); + }); + + it('should handle non-latin scripts', () => { + assertEqual(truncateOnWord('한국어 도 이렇게 할 수 있어요?', 9), '한국어 도 이렇게...'); + assertEqual(truncateOnWord('文字列 の 全角 スペース', 12), '文字列 の 全角...'); + }); + + it('should handle irregular input', () => { + assertEqual(truncateOnWord(500, 2), '50...'); + assertEqual(truncateOnWord('short sentence', -1), '...'); + assertEqual(truncateOnWord('short sentence', 8, 'bad input'), 'short...'); + assertEqual(truncateOnWord('short sentence', 8, 'right', 8), 'short8'); + assertEqual(truncateOnWord('short sentence', 8, 'right', ''), 'short'); + assertEqual(truncateOnWord('short sentence', 8, 'right', null), 'shortnull'); + assertEqual(truncateOnWord('short sentence', 8, 'right', undefined), 'short...'); + assertError(function(){ truncate('word', '8'); }); + }); + + it('should handle issues', () => { + // #311 + assertEqual(truncateOnWord('Alpha Beta Gamma Delta Epsilon', 20, 'middle', ''), 'Alpha BetaEpsilon'); + }); + + }); }); From 130fa7494feadbe4e5e4e7569926c558f175550f Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 20 Jul 2020 00:39:19 +0900 Subject: [PATCH 032/191] Added String#camelize/dasherize/parameterize/spacify/titleize/underscore --- CHANGELOG.md | 1 + src/regexp/escape.js | 11 +- src/string/camelize.js | 27 +++++ src/string/dasherize.js | 16 +++ src/string/define.js | 6 + src/string/methods.js | 6 + src/string/parameterize.js | 27 +++++ src/string/spacify.js | 17 +++ src/string/titleize.js | 41 +++++++ src/string/truncate.js | 9 +- src/string/truncateOnWord.js | 6 +- src/string/underscore.js | 16 +++ src/string/util/coerce.js | 8 ++ src/string/util/normalize.js | 13 +++ src/util/regexp.js | 24 ++++ test/OLD/tests/string.js | 179 ----------------------------- test/tests/string.js | 210 +++++++++++++++++++++++++++++++---- 17 files changed, 399 insertions(+), 218 deletions(-) create mode 100644 src/string/camelize.js create mode 100644 src/string/dasherize.js create mode 100644 src/string/parameterize.js create mode 100644 src/string/spacify.js create mode 100644 src/string/titleize.js create mode 100644 src/string/underscore.js create mode 100644 src/string/util/coerce.js create mode 100644 src/string/util/normalize.js create mode 100644 src/util/regexp.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 977c72ce5..e20f2cc77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ v3.0.0 - Removed Math aliases `Number#sin/asin/cos/acos/tan/atan/exp` in favor of directly using `Math`. `Number#round/floor/ceil/abs/sqrt/pow` aliases are retained. - Added `Number#trunc` Math alias. +- Removed Inflections modules. Affected methods `String#camelize/underscore/spacify/titleize`. TODO: diff --git a/src/regexp/escape.js b/src/regexp/escape.js index 3b20d7128..f835b745f 100644 --- a/src/regexp/escape.js +++ b/src/regexp/escape.js @@ -1,10 +1 @@ -import { isString } from '../util/typeChecks'; - -const ESCAPE_REG = /([\\/'*+?|()[\]{}.^$-])/g; - -export default function(str) { - if (!isString(str)) { - str = String(str); - } - return str.replace(ESCAPE_REG,'\\$1'); -} +export { escapeRegExp as default } from '../util/regexp'; diff --git a/src/string/camelize.js b/src/string/camelize.js new file mode 100644 index 000000000..9e62d5de2 --- /dev/null +++ b/src/string/camelize.js @@ -0,0 +1,27 @@ +import normalize from './util/normalize'; +import capitalize from './util/capitalize'; + +// Regex matching camelCase. +const CAMELIZE_REG = /(^|_)([^_]+)/g; + +/** + * Converts underscores and hyphens to camel case. + * + * @param {string} str - The string to convert. + * @param {boolean} first - Whether to upcase the first letter. Default is + * `true`. + * + * + * @example + * + * 'caps_lock'.camelize() -> 'CapsLock' + * 'moz-border-radius'.camelize() -> 'MozBorderRadius' + * 'moz-border-radius'.camelize(false) -> 'mozBorderRadius' + * + **/ +export default function camelize(str, first = true) { + str = normalize(str, '_'); + return str.replace(CAMELIZE_REG, function(match, pre, word, index) { + return first || index > 0 ? capitalize(word, true) : word; + }); +} diff --git a/src/string/dasherize.js b/src/string/dasherize.js new file mode 100644 index 000000000..2d4244485 --- /dev/null +++ b/src/string/dasherize.js @@ -0,0 +1,16 @@ +import normalize from './util/normalize'; + +/** + * Converts underscores and camel casing to hypens. + * + * @param {string} str - The string to convert. + * + * @example + * + * 'a_farewell_to_arms'.dasherize() -> 'a-farewell-to-arms' + * 'capsLock'.dasherize() -> 'caps-lock' + * + **/ +export default function dasherize(str) { + return normalize(str, '-'); +} diff --git a/src/string/define.js b/src/string/define.js index 95d1cde19..a63a31951 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -2,7 +2,13 @@ import { defineStatic, defineInstance } from '../core/string'; import * as methods from './methods'; defineStatic('range', methods.range); +defineInstance('camelize', methods.camelize); defineInstance('capitalize', methods.capitalize); +defineInstance('dasherize', methods.dasherize); defineInstance('pad', methods.pad); +defineInstance('parameterize', methods.parameterize); +defineInstance('spacify', methods.spacify); +defineInstance('titleize', methods.titleize); defineInstance('truncate', methods.truncate); defineInstance('truncateOnWord', methods.truncateOnWord); +defineInstance('underscore', methods.underscore); diff --git a/src/string/methods.js b/src/string/methods.js index 95afed8a1..cd0718877 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -1,5 +1,11 @@ export { default as range } from './range'; +export { default as camelize } from './camelize'; export { default as capitalize } from './capitalize'; +export { default as dasherize } from './dasherize'; export { default as pad } from './pad'; +export { default as parameterize } from './parameterize'; +export { default as spacify } from './spacify'; +export { default as titleize } from './titleize'; export { default as truncate } from './truncate'; export { default as truncateOnWord } from './truncateOnWord'; +export { default as underscore } from './underscore'; diff --git a/src/string/parameterize.js b/src/string/parameterize.js new file mode 100644 index 000000000..31d405c27 --- /dev/null +++ b/src/string/parameterize.js @@ -0,0 +1,27 @@ +import coerce from './util/coerce'; + +const PARAMETER_REG = /[^a-z0-9\-_]+/gi; + +/** + * Replaces special characters in a string so that it may be used as part of a + * pretty URL. + * + * @param {string} str - The string to convert. + * + * @example + * + * 'hell, no!'.parameterize() -> 'hell-no' + * + **/ +export default function parameterize(str, separator = '-') { + str = coerce(str); + str = str.toLowerCase(); + str = str.replace(PARAMETER_REG, (seq, i) => { + if (i === 0 || i + seq.length === str.length) { + return ''; + } else { + return separator; + } + }); + return encodeURI(str); +} diff --git a/src/string/spacify.js b/src/string/spacify.js new file mode 100644 index 000000000..21e306f0c --- /dev/null +++ b/src/string/spacify.js @@ -0,0 +1,17 @@ +import normalize from './util/normalize'; + +/** + * Converts camelcase, underscores, and hyphens to spaces. + * + * @param {string} str - The string to convert. + * + * @example + * + * 'camelCase'.spacify() -> 'camel case' + * 'an-ugly-string'.spacify() -> 'an ugly string' + * 'oh-no_youDid-not'.spacify().capitalize(true) -> 'something else' + * + **/ +export default function spacify(str) { + return normalize(str, ' '); +} diff --git a/src/string/titleize.js b/src/string/titleize.js new file mode 100644 index 000000000..6a6458ef3 --- /dev/null +++ b/src/string/titleize.js @@ -0,0 +1,41 @@ +import normalize from './util/normalize'; +import capitalize from './util/capitalize'; + +// Words that should not be capitalized in titles +const DOWNCASED_WORDS = [ + 'and', 'or', 'nor', 'a', 'an', 'the', 'so', 'but', 'to', 'of', 'at', + 'by', 'from', 'into', 'on', 'onto', 'off', 'out', 'in', 'over', + 'with', 'for' +]; + +const FULL_STOP_REG = /[.:;!]$/; +const WORD_REG = /\w+\S*/g; + +/** + * Capitalizes all the words and replaces some characters in the string + * to create pretty output for use in titles. + * + * @param {string} str - The string to convert. + * + * @example + * + * 'man from the boondocks'.titleize() -> 'Man from the Boondocks' + * 'x-men: apocalypse'.titleize() -> 'X-Men: Apocalypse' + * 'TheManWithoutAPast'.titleize() -> 'The Man Without a Past' + * 'raiders_of_the_lost_ark'.titleize() -> 'Raiders of the Lost Ark' + * + **/ +export default function titleize(str) { + str = normalize(str, ' '); + let lastWasStop = false; + return str.replace(WORD_REG, (word, i) => { + const first = lastWasStop || i === 0; + const last = i + word.length === str.length; + const hasPunctuation = FULL_STOP_REG.test(word); + if (first || last || !DOWNCASED_WORDS.includes(word)) { + word = capitalize(word); + } + lastWasStop = hasPunctuation; + return word; + }); +} diff --git a/src/string/truncate.js b/src/string/truncate.js index c79157507..6a575fb2a 100644 --- a/src/string/truncate.js +++ b/src/string/truncate.js @@ -1,5 +1,5 @@ import { assertInteger } from '../util/assertions'; -import { isString } from '../util/typeChecks'; +import coerce from './util/coerce'; /** * Truncates the string to a specific length. @@ -20,9 +20,7 @@ import { isString } from '../util/typeChecks'; **/ export default function truncate(str, length, from = 'right', ellipsis = '...') { assertInteger(length); - if (!isString(str)) { - str = String(str); - } + str = coerce(str); length = Math.max(0, length); if (str.length <= length) { return str; @@ -31,10 +29,11 @@ export default function truncate(str, length, from = 'right', ellipsis = '...') case 'left': str = str.slice(str.length - length); return ellipsis + str; - case 'middle': + case 'middle': { const str1 = str.slice(0, Math.ceil(length / 2)); const str2 = str.slice(str.length - Math.floor(length / 2)); return str1 + ellipsis + str2; + } default: return str.slice(0, length) + ellipsis; } diff --git a/src/string/truncateOnWord.js b/src/string/truncateOnWord.js index 75f62b109..18e3335f1 100644 --- a/src/string/truncateOnWord.js +++ b/src/string/truncateOnWord.js @@ -1,5 +1,5 @@ import { assertInteger } from '../util/assertions'; -import { isString } from '../util/typeChecks'; +import coerce from './util/coerce'; // Split on whitespace as well as sequences of known punctuation blocks. const SEPARATOR_REG = /[\s\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u00A1-\u00BF\u2000-\u206F\u2E00-\u2E7F\u3000-\u303F]/; @@ -23,9 +23,7 @@ const SEPARATOR_REG = /[\s\u0021-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E\u **/ export default function truncateOnWord(str, length, from = 'right', ellipsis = '...') { assertInteger(length); - if (!isString(str)) { - str = String(str); - } + str = coerce(str); if (str.length <= length) { return str; } diff --git a/src/string/underscore.js b/src/string/underscore.js new file mode 100644 index 000000000..65518eb74 --- /dev/null +++ b/src/string/underscore.js @@ -0,0 +1,16 @@ +import normalize from './util/normalize'; + +/** + * Converts hyphens and camel casing to underscores. + * + * @param {string} str - The string to convert. + * + * @example + * + * 'a-farewell-to-arms'.underscore() -> 'a_farewell_to_arms' + * 'capsLock'.underscore() -> 'caps_lock' + * + **/ +export default function underscore(str) { + return normalize(str, '_'); +} diff --git a/src/string/util/coerce.js b/src/string/util/coerce.js new file mode 100644 index 000000000..d14b4e3b8 --- /dev/null +++ b/src/string/util/coerce.js @@ -0,0 +1,8 @@ +import { isString } from '../../util/typeChecks'; + +export default function coerce(str) { + if (!isString(str)) { + str = String(str); + } + return str; +} diff --git a/src/string/util/normalize.js b/src/string/util/normalize.js new file mode 100644 index 000000000..bb63efc3c --- /dev/null +++ b/src/string/util/normalize.js @@ -0,0 +1,13 @@ +import coerce from './coerce'; + +const DELIMITER_REG = /[_-\s]+/g; +const UPPER_REG = /([A-Z\d]+)([A-Z][a-z])/g +const LOWER_REG = /([a-z\d])([A-Z])/g; + +export default function normalize(str, token) { + return coerce(str) + .replace(DELIMITER_REG, token) + .replace(UPPER_REG, `$1${token}$2`) + .replace(LOWER_REG, `$1${token}$2`) + .toLowerCase(); +} diff --git a/src/util/regexp.js b/src/util/regexp.js new file mode 100644 index 000000000..f04cae611 --- /dev/null +++ b/src/util/regexp.js @@ -0,0 +1,24 @@ +import { isString } from './typeChecks'; + +const ESCAPE_REG = /([\\/'*+?|()[\]{}.^$-])/g; + +/** + * Escapes all RegExp tokens in a string. + * + * @param {string} str - The string to escape. + * + * @example + * + * RegExp.escape('really?') -> 'really\?' + * RegExp.escape('yes.') -> 'yes\.' + * RegExp.escape('(not really)') -> '\(not really\)' + * + * @param {string} str + * + **/ +export function escapeRegExp(str) { + if (!isString(str)) { + str = String(str); + } + return str.replace(ESCAPE_REG,'\\$1'); +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 970435c73..c8a425e65 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -619,65 +619,6 @@ namespace('String', function () { }); - method('camelize', function() { - test('hop-on-pop', 'HopOnPop', 'dashes'); - test('HOP-ON-POP', 'HopOnPop', 'capital dashes'); - test('hop_on_pop', 'HopOnPop', 'underscores'); - test('watch me fail', 'WatchMeFail', 'whitespace'); - test('watch me fail', 'WatchMeFail', 'long whitespace'); - test('watch me fail-sad-face', 'WatchMeFailSadFace', 'whitespace sad face'); - test('waTch me su-cCeed', 'WaTchMeSuCCeed', 'complex whitespace'); - - test('', '', 'blank'); - test('no-fing-way', 'NoFingWay', 'no-fing-way'); - - withArgs([false], function() { - test('hop-on-pop', [false], 'hopOnPop', 'first false | dashes'); - test('HOP-ON-POP', [false], 'hopOnPop', 'first false | capital dashes'); - test('hop_on_pop', [false], 'hopOnPop', 'first false | underscores'); - test('watch me fail', [false], 'watchMeFail', 'first false | whitespace'); - test('watch me fail-sad-face', [false], 'watchMeFailSadFace', 'first false | whitespace sad face'); - test('waTch me su-cCeed', [false], 'waTchMeSuCCeed', 'first false | complex whitespace'); - }); - - withArgs([false], function() { - test('hop-on-pop', [true], 'HopOnPop', 'first true | dashes'); - test('HOP-ON-POP', [true], 'HopOnPop', 'first true | capital dashes'); - test('hop_on_pop', [true], 'HopOnPop', 'first true | underscores'); - }); - - }); - - method('underscore', function() { - - test('hopOnPop', 'hop_on_pop', 'camel-case'); - test('HopOnPop', 'hop_on_pop', 'camel-case capital first'); - test('HOPONPOP', 'hoponpop', 'all caps'); - test('HOP-ON-POP', 'hop_on_pop', 'caps and dashes'); - test('hop-on-pop', 'hop_on_pop', 'lower-case and dashes'); - test('watch me fail', 'watch_me_fail', 'whitespace'); - test('watch me fail', 'watch_me_fail', 'long whitespace'); - test('watch me fail-sad-face', 'watch_me_fail_sad_face', 'whitespace sad face'); - test('waTch me su-cCeed', 'wa_tch_me_su_c_ceed', 'complex whitespace'); - - test('_hop_on_pop_', '_hop_on_pop_', 'underscores are left alone'); - - test('', '', 'blank'); - test('noFingWay', 'no_fing_way', 'noFingWay'); - - }); - - method('spacify', function() { - test('hopOnPop', 'hop on pop', 'camel-case'); - test('HopOnPop', 'hop on pop', 'camel-case capital first'); - test('HOPONPOP', 'hoponpop', 'all caps'); - test('HOP-ON-POP', 'hop on pop', 'caps and dashes'); - test('hop-on-pop', 'hop on pop', 'lower-case and dashes'); - test('watch_me_fail', 'watch me fail', 'whitespace'); - test('watch-meFail-sad-face', 'watch me fail sad face', 'whitespace sad face'); - test('waTch me su-cCeed', 'wa tch me su c ceed', 'complex whitespace'); - }); - method('stripTags', function() { var stripped, html, allStripped, malformed; @@ -1202,124 +1143,4 @@ namespace('String', function () { }); - method('includes', function() { - - test('foo', ['foo'], true, 'string still works'); - test('foo', [/foo/], true, 'simple regex'); - test('foo', [/^foo/], true, 'with lead'); - test('foo', [/foo$/], true, 'with trail'); - test('poo', [/foo/], false, 'simple regex no match'); - test('poo', [/^foo/], false, 'with lead no match'); - test('poo', [/foo$/], false, 'with trail no match'); - - test('foo', [/foo/, 0], true, 'with position 0 | simple regex'); - test('foo', [/^foo/, 0], true, 'with position 0 | with lead'); - test('foo', [/foo$/, 0], true, 'with position 0 | with trail'); - test('poo', [/foo/, 0], false, 'with position 0 | simple regex no match'); - test('poo', [/^foo/, 0], false, 'with position 0 | with lead no match'); - test('poo', [/foo$/, 0], false, 'with position 0 | with trail no match'); - - test('foo', [/foo/, 1], false, 'with position 1 | simple regex'); - test('foo', [/^foo/, 1], false, 'with position 1 | with lead'); - test('foo', [/foo$/, 1], false, 'with position 1 | with trail'); - test('poo', [/foo/, 1], false, 'with position 1 | simple regex no match'); - test('poo', [/^foo/, 1], false, 'with position 1 | with lead no match'); - test('poo', [/foo$/, 1], false, 'with position 1 | with trail no match'); - - test('foo', [/oo/, 1], true, 'with position 1 | match'); - test('foo', [/o/, 2], true, 'with position 2 | match'); - test('foo', [/./, 3], false, 'with position 3 | no match'); - test('foo', [/$/, 3], true, 'with position 3 | match'); - - storeNativeState(); - - Sugar.String.extend('includes'); - equal(String.prototype.includes.length, 1, 'should have argument length of 1'); - - restoreNativeState(); - }); - - method('titleize', function() { - - var MixtureToTitleCase = { - 'active_record' : 'Active Record', - 'ActiveRecord' : 'Active Record', - 'action web service' : 'Action Web Service', - 'Action Web Service' : 'Action Web Service', - 'Action web service' : 'Action Web Service', - 'actionwebservice' : 'Actionwebservice', - 'Actionwebservice' : 'Actionwebservice', - "david's code" : "David's Code", - "David's code" : "David's Code", - "david's Code" : "David's Code", - - // Added test cases for non-titleized words - - 'the day of the jackal' : 'The Day of the Jackal', - 'what color is your parachute?': 'What Color Is Your Parachute?', - 'a tale of two cities' : 'A Tale of Two Cities', - 'where am i going to' : 'Where Am I Going To', - - // From the titleize docs - 'man from the boondocks' : 'Man from the Boondocks', - 'x-men: the last stand' : 'X Men: The Last Stand', - 'i am a sentence. and so am i.': 'I Am a Sentence. And so Am I.', - 'hello! and goodbye!' : 'Hello! And Goodbye!', - 'hello, and goodbye' : 'Hello, and Goodbye', - 'hello; and goodbye' : 'Hello; And Goodbye', - "about 'you' and 'me'" : "About 'You' and 'Me'", - 'TheManWithoutAPast' : 'The Man Without a Past', - 'raiders_of_the_lost_ark' : 'Raiders of the Lost Ark' - } - - testIterateOverObject(MixtureToTitleCase, function(src, expected) { - test(src, expected, 'mixed cases') - }); - }); - - method('parameterize', function() { - - test('Donald E. Knuth', 'donald-e-knuth'); - test('Random text with *(bad)* characters', 'random-text-with-bad-characters'); - test('Allow_Under_Scores', 'allow_under_scores'); - test('Trailing bad characters!@#', 'trailing-bad-characters'); - test('!@#Leading bad characters', 'leading-bad-characters'); - test('Squeeze separators', 'squeeze-separators'); - test('Test with + sign', 'test-with-sign'); - test('Test with malformed utf8 \251', 'test-with-malformed-utf8'); - - withArgs([''], function() { - test('Donald E. Knuth', 'donaldeknuth'); - test('With-some-dashes', 'with-some-dashes'); - test('Random text with *(bad)* characters', 'randomtextwithbadcharacters'); - test('Trailing bad characters!@#', 'trailingbadcharacters'); - test('!@#Leading bad characters', 'leadingbadcharacters'); - test('Squeeze separators', 'squeezeseparators'); - test('Test with + sign', 'testwithsign'); - test('Test with malformed utf8 \251', 'testwithmalformedutf8'); - }); - - withArgs(['_'], function() { - test('Donald E. Knuth', 'donald_e_knuth'); - test('Random text with *(bad)* characters', 'random_text_with_bad_characters'); - test('With-some-dashes', 'with-some-dashes'); - test('Retain_underscore', 'retain_underscore'); - test('Trailing bad characters!@#', 'trailing_bad_characters'); - test('!@#Leading bad characters', 'leading_bad_characters'); - test('Squeeze separators', 'squeeze_separators'); - test('Test with + sign', 'test_with_sign'); - test('Test with malformed utf8 \251', 'test_with_malformed_utf8'); - }); - - if (Sugar.String.toAscii) { - test('Malmö here', 'malmo-here'); - test('Garçons', 'garcons'); - test('Ops\331', 'opsu'); - test('Ærøskøbing', 'aeroskobing'); - test('Aßlar', 'asslar'); - test('Japanese: 日本語', 'japanese') - } - - }); - }); diff --git a/test/tests/string.js b/test/tests/string.js index e9a33363a..7f2f981da 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -171,7 +171,7 @@ namespace('String', function() { describeInstance('pad', function(pad) { - it('should pad even length string to exact length', () => { + it('should pad even length string to exact length', function() { assertEqual(pad('wasabi', 0), 'wasabi'); assertEqual(pad('wasabi', 1), 'wasabi'); assertEqual(pad('wasabi', 2), 'wasabi'); @@ -187,7 +187,7 @@ namespace('String', function() { assertEqual(pad('wasabi', 20), ' wasabi '); }); - it('should pad odd length string to target length + 1', () => { + it('should pad odd length string to target length + 1', function() { assertEqual(pad('hello', 0), 'hello'); assertEqual(pad('hello', 1), 'hello'); assertEqual(pad('hello', 2), 'hello'); @@ -203,7 +203,7 @@ namespace('String', function() { assertEqual(pad('hello', 20), ' hello '); }); - it('should pad with custom string', () => { + it('should pad with custom string', function() { assertEqual(pad('wasabi', 8, '"'), '"wasabi"'); assertEqual(pad('wasabi', 8, ''), 'wasabi'); assertEqual(pad('wasabi', 8, 's'), 'swasabis'); @@ -212,7 +212,7 @@ namespace('String', function() { assertEqual(pad('hello', 12, '-'), '---hello---'); }); - it('should pad with non-standard arguments', () => { + it('should pad with non-standard arguments', function() { assertEqual(pad('wasabi'), 'wasabi'); assertEqual(pad('wasabi', undefined), 'wasabi'); assertEqual(pad('wasabi', null), 'wasabi'); @@ -222,7 +222,7 @@ namespace('String', function() { assertEqual(pad('', true), ''); }); - it('should not throw equivalent errors to padStart/padEnd', () => { + it('should not throw equivalent errors to padStart/padEnd', function() { assertNoError(function(){ pad('wasabi', -1); }); assertNoError(function(){ pad('wasabi', -Infinity); }); assertError(function(){ pad('wasabi', Infinity); }); @@ -233,7 +233,7 @@ namespace('String', function() { describeInstance('truncate', function(truncate) { var str = 'Gotta be an entire sentence.'; - it('should truncate to a specific length', () => { + it('should truncate to a specific length', function() { assertEqual(truncate(str, 29), 'Gotta be an entire sentence.'); assertEqual(truncate(str, 28), 'Gotta be an entire sentence.'); assertEqual(truncate(str, 21), 'Gotta be an entire se...'); @@ -249,7 +249,7 @@ namespace('String', function() { assertEqual(truncate(str, 0), '...'); }); - it('should truncate from the left', () => { + it('should truncate from the left', function() { assertEqual(truncate(str, 21, 'left'), '...e an entire sentence.'); assertEqual(truncate(str, 11, 'left'), '...e sentence.'); assertEqual(truncate(str, 9, 'left'), '...sentence.'); @@ -260,7 +260,7 @@ namespace('String', function() { assertEqual(truncate(str, -100, 'left'), '...'); }); - it('should should truncate from the middle', () => { + it('should should truncate from the middle', function() { assertEqual(truncate(str, 21, 'middle'), 'Gotta be an... sentence.'); assertEqual(truncate(str, 11, 'middle'), 'Gotta ...ence.'); assertEqual(truncate(str, 4, 'middle'), 'Go...e.'); @@ -270,7 +270,7 @@ namespace('String', function() { assertEqual(truncate(str, -100, 'middle'), '...'); }); - it('should allow a custom ellipsis', () => { + it('should allow a custom ellipsis', function() { assertEqual(truncate('string to truncate', 10, 'right', '|'), 'string to |'); assertEqual(truncate('string to truncate', 10, 'right', 0), 'string to 0'); assertEqual(truncate(str, 28, 'left', '>>> '), 'Gotta be an entire sentence.'); @@ -283,7 +283,7 @@ namespace('String', function() { assertEqual(truncate('123456', 2), '12...'); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(truncate(500, 2), '50...'); assertEqual(truncate('short sentence', -1), '...'); assertEqual(truncate('short sentence', 8, 'bad input'), 'short se...'); @@ -299,7 +299,7 @@ namespace('String', function() { describeInstance('truncateOnWord', function(truncateOnWord) { var str = 'Gotta be an entire sentence.'; - it('should truncate to a specific length', () => { + it('should truncate to a specific length', function() { assertEqual(truncateOnWord(str, 100), 'Gotta be an entire sentence.'); assertEqual(truncateOnWord(str, 28), 'Gotta be an entire sentence.'); assertEqual(truncateOnWord(str, 27), 'Gotta be an entire...'); @@ -319,7 +319,7 @@ namespace('String', function() { assertEqual(truncateOnWord(str, 0), '...'); }); - it('should truncate from left', () => { + it('should truncate from left', function() { assertEqual(truncateOnWord(str, 21, 'left'), '...an entire sentence.'); assertEqual(truncateOnWord(str, 20, 'left'), '...an entire sentence.'); assertEqual(truncateOnWord(str, 19, 'left'), '...an entire sentence.'); @@ -338,7 +338,7 @@ namespace('String', function() { assertEqual(truncateOnWord(str, 0, 'left'), '...'); }); - it('should truncate from the middle', () => { + it('should truncate from the middle', function() { assertEqual(truncateOnWord(str, 21, 'middle'), 'Gotta be...sentence.'); assertEqual(truncateOnWord(str, 20, 'middle'), 'Gotta be...sentence.'); assertEqual(truncateOnWord(str, 19, 'middle'), 'Gotta be...sentence.'); @@ -357,7 +357,7 @@ namespace('String', function() { assertEqual(truncateOnWord(str, 0, 'middle'), '...'); }); - it('should should break on non-space punctuation', () => { + it('should should break on non-space punctuation', function() { assertEqual(truncateOnWord('a,short,string', 8), 'a,short...'); assertEqual(truncateOnWord('a|short|string', 8), 'a|short...'); assertEqual(truncateOnWord('a?short?string', 8), 'a?short...'); @@ -365,21 +365,21 @@ namespace('String', function() { assertEqual(truncateOnWord('a¿short¿string', 8), 'a¿short...'); }); - it('should should break on non-standard whitespace', () => { + it('should should break on non-standard whitespace', function() { assertEqual(truncateOnWord('a short string', 8), 'a short...'); }); - it('should handle special cases', () => { + it('should handle special cases', function() { assertEqual(truncateOnWord('GOTTA BE AN ENTIRE SENTENCE.', 21), 'GOTTA BE AN ENTIRE...'); assertEqual(truncateOnWord('gotta. be. an. entire. sentence.', 17), 'gotta. be. an....'); }); - it('should handle non-latin scripts', () => { + it('should handle non-latin scripts', function() { assertEqual(truncateOnWord('한국어 도 이렇게 할 수 있어요?', 9), '한국어 도 이렇게...'); assertEqual(truncateOnWord('文字列 の 全角 スペース', 12), '文字列 の 全角...'); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(truncateOnWord(500, 2), '50...'); assertEqual(truncateOnWord('short sentence', -1), '...'); assertEqual(truncateOnWord('short sentence', 8, 'bad input'), 'short...'); @@ -387,13 +387,183 @@ namespace('String', function() { assertEqual(truncateOnWord('short sentence', 8, 'right', ''), 'short'); assertEqual(truncateOnWord('short sentence', 8, 'right', null), 'shortnull'); assertEqual(truncateOnWord('short sentence', 8, 'right', undefined), 'short...'); - assertError(function(){ truncate('word', '8'); }); + assertError(function(){ truncateOnWord('word', '8'); }); }); - it('should handle issues', () => { + it('should handle issues', function() { // #311 assertEqual(truncateOnWord('Alpha Beta Gamma Delta Epsilon', 20, 'middle', ''), 'Alpha BetaEpsilon'); }); }); + + describeInstance('underscore', function(underscore) { + + it('should handle basic input', function() { + assertEqual(underscore('hopOnPop'), 'hop_on_pop'); + assertEqual(underscore('HopOnPop'), 'hop_on_pop'); + assertEqual(underscore('HOPONPOP'), 'hoponpop'); + assertEqual(underscore('HOP-ON-POP'), 'hop_on_pop'); + assertEqual(underscore('hop-on-pop'), 'hop_on_pop'); + assertEqual(underscore('watch me fail'), 'watch_me_fail'); + assertEqual(underscore('watch me fail'), 'watch_me_fail'); + assertEqual(underscore('watch me fail-sad-face'), 'watch_me_fail_sad_face'); + assertEqual(underscore('waTch me su-cCeed'), 'wa_tch_me_su_c_ceed'); + }); + + it('should not affect existing underscores', function() { + assertEqual(underscore('_hop_on_pop_'), '_hop_on_pop_'); + }); + + it('should handle irregular input', function() { + assertEqual(underscore(''), ''); + assertEqual(underscore(null), 'null'); + assertEqual(underscore(800), '800'); + }); + + }); + + describeInstance('camelize', function(camelize) { + + it('should handle basic input', function() { + assertEqual(camelize('hop-on-pop'), 'HopOnPop'); + assertEqual(camelize('HOP-ON-POP'), 'HopOnPop'); + assertEqual(camelize('hop_on_pop'), 'HopOnPop'); + assertEqual(camelize('watch me fail'), 'WatchMeFail'); + assertEqual(camelize('watch me fail'), 'WatchMeFail'); + assertEqual(camelize('watch me fail-sad-face'), 'WatchMeFailSadFace'); + assertEqual(camelize('waTch me su-cCeed'), 'WaTchMeSuCCeed'); + }); + + it('should downcase first letter', function() { + assertEqual(camelize('hop-on-pop', false), 'hopOnPop'); + assertEqual(camelize('HOP-ON-POP', false), 'hopOnPop'); + assertEqual(camelize('hop_on_pop', false), 'hopOnPop'); + assertEqual(camelize('watch me fail', false), 'watchMeFail'); + assertEqual(camelize('watch me fail-sad-face', false), 'watchMeFailSadFace'); + assertEqual(camelize('waTch me su-cCeed', false), 'waTchMeSuCCeed'); + }); + + it('should handle irregular input', function() { + assertEqual(camelize(''), ''); + assertEqual(camelize(null), 'Null'); + assertEqual(camelize(800), '800'); + }); + + }); + + describeInstance('dasherize', function(dasherize) { + + it('should handle basic input', function() { + assertEqual(dasherize('hop_on_pop'), 'hop-on-pop', 'underscores'); + assertEqual(dasherize('HOP_ON_POP'), 'hop-on-pop', 'capitals and underscores'); + assertEqual(dasherize('hopOnPop'), 'hop-on-pop'); + assertEqual(dasherize('watch me fail'), 'watch-me-fail'); + assertEqual(dasherize('watch me fail_sad_face'), 'watch-me-fail-sad-face'); + assertEqual(dasherize('waTch me su_cCeed'), 'wa-tch-me-su-c-ceed'); + assertEqual(dasherize('aManAPlanACanalPanama'), 'a-man-a-plan-a-canal-panama'); + assertEqual(dasherize('street'), 'street'); + assertEqual(dasherize('street_address'), 'street-address'); + assertEqual(dasherize('person_street_address'), 'person-street-address'); + }); + + it('should handle irregular input', function() { + assertEqual(dasherize(''), ''); + assertEqual(dasherize(null), 'null'); + assertEqual(dasherize(800), '800'); + }); + + }); + + describeInstance('titleize', function(titleize) { + + it('should handle basic input', function() { + assertEqual(titleize('active_record'), 'Active Record'); + assertEqual(titleize('ActiveRecord'), 'Active Record'); + assertEqual(titleize('action web service'), 'Action Web Service'); + assertEqual(titleize('Action Web Service'), 'Action Web Service'); + assertEqual(titleize('Action web service'), 'Action Web Service'); + assertEqual(titleize('actionwebservice'), 'Actionwebservice'); + assertEqual(titleize('Actionwebservice'), 'Actionwebservice'); + assertEqual(titleize("david's code"), "David's Code"); + assertEqual(titleize("David's code"), "David's Code"); + assertEqual(titleize("david's Code"), "David's Code"); + assertEqual(titleize('man from the boondocks'), 'Man from the Boondocks'); + assertEqual(titleize('x-men: the last stand'), 'X Men: The Last Stand'); + assertEqual(titleize('i am a sentence. and so am i.'), 'I Am a Sentence. And so Am I.'); + assertEqual(titleize('hello! and goodbye!'), 'Hello! And Goodbye!'); + assertEqual(titleize('hello, and goodbye'), 'Hello, and Goodbye'); + assertEqual(titleize('hello; and goodbye'), 'Hello; And Goodbye'); + assertEqual(titleize("about 'you' and 'me'"), "About 'You' and 'Me'"); + assertEqual(titleize('TheManWithoutAPast'), 'The Man Without a Past'); + assertEqual(titleize('raiders_of_the_lost_ark'), 'Raiders of the Lost Ark'); + }); + + it('should handle non-titleized words', function() { + assertEqual(titleize('the day of the jackal'), 'The Day of the Jackal'); + assertEqual(titleize('what color is your parachute?'), 'What Color Is Your Parachute?'); + assertEqual(titleize('a tale of two cities'), 'A Tale of Two Cities'); + assertEqual(titleize('where am i going to'), 'Where Am I Going To'); + }); + + it('should handle irregular input', function() { + assertEqual(titleize(''), ''); + assertEqual(titleize(null), 'Null'); + assertEqual(titleize(800), '800'); + }); + + }); + + describeInstance('spacify', function(spacify) { + + it('should should handle basic input', function() { + assertEqual(spacify('hopOnPop'), 'hop on pop'); + assertEqual(spacify('HopOnPop'), 'hop on pop'); + assertEqual(spacify('HOPONPOP'), 'hoponpop'); + assertEqual(spacify('HOP-ON-POP'), 'hop on pop'); + assertEqual(spacify('hop-on-pop'), 'hop on pop'); + assertEqual(spacify('watch_me_fail'), 'watch me fail'); + assertEqual(spacify('watch-meFail-sad-face'), 'watch me fail sad face'); + assertEqual(spacify('waTch me su-cCeed'), 'wa tch me su c ceed'); + }); + + it('should handle irregular input', function() { + assertEqual(spacify(''), ''); + assertEqual(spacify(null), 'null'); + assertEqual(spacify(800), '800'); + }); + }); + + describeInstance('parameterize', function(parameterize) { + + it('should handle basic input', function() { + assertEqual(parameterize('Donald E. Knuth'), 'donald-e-knuth'); + assertEqual(parameterize('Random text with *(bad)* characters'), 'random-text-with-bad-characters'); + assertEqual(parameterize('Allow_Under_Scores'), 'allow_under_scores'); + assertEqual(parameterize('Trailing bad characters!@#'), 'trailing-bad-characters'); + assertEqual(parameterize('!@#Leading bad characters'), 'leading-bad-characters'); + assertEqual(parameterize('Squeeze separators'), 'squeeze-separators'); + assertEqual(parameterize('Test with + sign'), 'test-with-sign'); + }); + + it('should allow a custom separator', function() { + assertEqual(parameterize('Donald E. Knuth', '_'), 'donald_e_knuth'); + assertEqual(parameterize('Random text with *(bad)* characters', '_'), 'random_text_with_bad_characters'); + assertEqual(parameterize('With-some-dashes', '_'), 'with-some-dashes'); + assertEqual(parameterize('Retain_underscore', '_'), 'retain_underscore'); + assertEqual(parameterize('Trailing bad characters!@#', '_'), 'trailing_bad_characters'); + assertEqual(parameterize('!@#Leading bad characters', '_'), 'leading_bad_characters'); + assertEqual(parameterize('Squeeze separators', '_'), 'squeeze_separators'); + assertEqual(parameterize('Test with + sign', '_'), 'test_with_sign'); + }); + + it('should handle irregular input', function() { + assertEqual(parameterize(''), ''); + assertEqual(parameterize(null), 'null'); + assertEqual(parameterize(800), '800'); + assertEqual(parameterize('Foo Bar', 8), 'foo8bar'); + assertEqual(parameterize('Foo \uDFFF Bar'), 'foo-bar'); + }); + }); + }); From 32dab5a0f5a398c4b311f5c4398f66f23eef8ee1 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 20 Jul 2020 21:55:54 +0900 Subject: [PATCH 033/191] Added String#at/first/last/from/to --- src/string/at.js | 30 ++++++ src/string/define.js | 5 + src/string/first.js | 22 ++++ src/string/from.js | 24 +++++ src/string/last.js | 23 ++++ src/string/methods.js | 7 +- src/string/to.js | 24 +++++ src/string/util/getIndex.js | 16 +++ src/util/index.js | 27 +++++ test/OLD/tests/string.js | 137 ----------------------- test/tests/string.js | 209 ++++++++++++++++++++++++++++++++---- 11 files changed, 365 insertions(+), 159 deletions(-) create mode 100644 src/string/at.js create mode 100644 src/string/first.js create mode 100644 src/string/from.js create mode 100644 src/string/last.js create mode 100644 src/string/to.js create mode 100644 src/string/util/getIndex.js create mode 100644 src/util/index.js diff --git a/src/string/at.js b/src/string/at.js new file mode 100644 index 000000000..a0d625dfb --- /dev/null +++ b/src/string/at.js @@ -0,0 +1,30 @@ +import { getEntryAtIndex } from '../util/index'; +import coerce from './util/coerce'; + +/** + * Gets the character(s) at a given index. + * + * @param {string} str - The string to convert. + * @param {number|Array} index - The index to get the character(s) at. + * Will search from the end of the string when negative. An array may also be + * passed which will return an array of entries at all indexes. + * @param {boolean} [loop] - When `true` will loop from the beginning/end of + * the string. When `false` overshooting string bounds will return an empty + * string. Default is `false`. + * + * @example + * + * 'jumpy'.at(0) -> 'j' + * 'jumpy'.at(2) -> 'm' + * 'jumpy'.at(5) -> '' + * 'jumpy'.at(5, true) -> 'j' + * 'jumpy'.at(-1) -> 'y' + * 'lucky charms'.at([2, 4]) -> ['u','k'] + * + * @returns {string|Array} + * + **/ +export default function at(str, index, loop) { + str = coerce(str); + return getEntryAtIndex(str, index, loop); +} diff --git a/src/string/define.js b/src/string/define.js index a63a31951..ef17d856e 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -2,13 +2,18 @@ import { defineStatic, defineInstance } from '../core/string'; import * as methods from './methods'; defineStatic('range', methods.range); +defineInstance('at', methods.at); defineInstance('camelize', methods.camelize); defineInstance('capitalize', methods.capitalize); defineInstance('dasherize', methods.dasherize); +defineInstance('first', methods.first); +defineInstance('from', methods.from); +defineInstance('last', methods.last); defineInstance('pad', methods.pad); defineInstance('parameterize', methods.parameterize); defineInstance('spacify', methods.spacify); defineInstance('titleize', methods.titleize); +defineInstance('to', methods.to); defineInstance('truncate', methods.truncate); defineInstance('truncateOnWord', methods.truncateOnWord); defineInstance('underscore', methods.underscore); diff --git a/src/string/first.js b/src/string/first.js new file mode 100644 index 000000000..d96560fd8 --- /dev/null +++ b/src/string/first.js @@ -0,0 +1,22 @@ +import { assertInteger } from '../util/assertions'; +import coerce from './util/coerce'; + +/** + * Returns the first n characters of the string. + * + * @param {string} str - The string. + * @param {number} [n] - The target string length. Default is `1`. + * + * @example + * + * 'lucky charms'.first() -> 'l' + * 'lucky charms'.first(3) -> 'luc' + * + * @returns {string} + * + **/ +export default function first(str, n = 1) { + assertInteger(n); + str = coerce(str); + return str.substr(0, n); +} diff --git a/src/string/from.js b/src/string/from.js new file mode 100644 index 000000000..f43f7809f --- /dev/null +++ b/src/string/from.js @@ -0,0 +1,24 @@ +import coerce from './util/coerce'; +import getIndex from './util/getIndex'; + +/** + * Returns a substring starting from a specific index. + * + * @param {string} str - The string. + * @param {number|string} [from] - The index to begin the substring. May also + * be a string will be searched on to get the index. + * + * + * @example + * + * 'lucky charms'.from() -> 'lucky charms' + * 'lucky charms'.from(7) -> 'harms' + * 'lucky charms'.from('ch') -> 'charms' + * + * @returns {string} + * + **/ +export default function from(str, from = 0) { + str = coerce(str); + return str.slice(getIndex(str, from, true)); +} diff --git a/src/string/last.js b/src/string/last.js new file mode 100644 index 000000000..fdf6d35d1 --- /dev/null +++ b/src/string/last.js @@ -0,0 +1,23 @@ +import { assertInteger } from '../util/assertions'; +import coerce from './util/coerce'; + +/** + * Returns the last n characters of the string. + * + * @param {string} str - The string. + * @param {number} [n] - The target string length. Default is `1`. + * + * @example + * + * 'lucky charms'.first() -> 'l' + * 'lucky charms'.first(3) -> 'luc' + * + * @returns {string} + * + **/ +export default function first(str, n = 1) { + assertInteger(n); + str = coerce(str); + const start = str.length - n < 0 ? 0 : str.length - n; + return str.substr(start); +} diff --git a/src/string/methods.js b/src/string/methods.js index cd0718877..449d1dfdb 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -1,11 +1,16 @@ -export { default as range } from './range'; +export { default as at } from './at'; export { default as camelize } from './camelize'; export { default as capitalize } from './capitalize'; export { default as dasherize } from './dasherize'; +export { default as first } from './first'; +export { default as from } from './from'; +export { default as last } from './last'; export { default as pad } from './pad'; export { default as parameterize } from './parameterize'; +export { default as range } from './range'; export { default as spacify } from './spacify'; export { default as titleize } from './titleize'; +export { default as to } from './to'; export { default as truncate } from './truncate'; export { default as truncateOnWord } from './truncateOnWord'; export { default as underscore } from './underscore'; diff --git a/src/string/to.js b/src/string/to.js new file mode 100644 index 000000000..95b1dd86e --- /dev/null +++ b/src/string/to.js @@ -0,0 +1,24 @@ +import coerce from './util/coerce'; +import getIndex from './util/getIndex'; + +/** + * Returns a substring ending at a specific index. + * + * @param {string} str - The string. + * @param {number|string} [to] - The index to end the substring. May also + * be a string will be searched on to get the index. + * + * + * @example + * + * 'lucky charms'.to() -> 'lucky charms' + * 'lucky charms'.to(7) -> 'lucky ch' + * 'lucky charms'.to('y') -> 'luck' + * + * @returns {string} + * + **/ +export default function to(str, to = str.length) { + str = coerce(str); + return str.slice(0, getIndex(str, to, false)); +} diff --git a/src/string/util/getIndex.js b/src/string/util/getIndex.js new file mode 100644 index 000000000..81097730a --- /dev/null +++ b/src/string/util/getIndex.js @@ -0,0 +1,16 @@ +import { isString } from '../../util/typeChecks'; + +export default function getIndex(str, index, fromEnd) { + if (isString(index)) { + index = str.indexOf(index); + if (index === -1) { + index = fromEnd ? str.length : 0; + } + return index; + } else if (Number.isInteger(index)) { + return index; + } else { + throw new TypeError('Index must be an integer or string.'); + } +} + diff --git a/src/util/index.js b/src/util/index.js new file mode 100644 index 000000000..fe5e2f3e8 --- /dev/null +++ b/src/util/index.js @@ -0,0 +1,27 @@ +import { isString, isArray } from './typeChecks'; + +export function getEntryAtIndex(obj, index, loop) { + const len = obj.length; + if (isArray(index)) { + return index.map((i) => { + return getEntry(obj, i, len, loop); + }); + } else if (Number.isInteger(index)) { + return getEntry(obj, index, len, loop); + } else { + throw new TypeError('Index must be an integer or array.'); + } +} + +function getEntry(obj, index, len, loop) { + index = getNormalizedIndex(index, len, loop) + return isString(obj) ? obj.charAt(index) : obj[index]; +} + +function getNormalizedIndex(index, len, loop) { + if (index && loop) { + index = index % len; + } + if (index < 0) index = len + index; + return index; +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index c8a425e65..b890490f1 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -482,143 +482,6 @@ namespace('String', function () { }); - method('at', function() { - - test('foop', [0], 'f', 'pos 0'); - test('foop', [1], 'o', 'pos 1'); - test('foop', [2], 'o', 'pos 2'); - test('foop', [3], 'p', 'pos 3'); - test('foop', [4], '', 'pos 4'); - test('foop', [1224], '', 'out of bounds'); - test('foop', [-1], 'p', 'negative | pos -1'); - test('foop', [-2], 'o', 'negative | pos -2'); - test('foop', [-3], 'o', 'negative | pos -3'); - test('foop', [-4], 'f', 'negative | pos -4'); - test('foop', [-5], '', 'negative | pos -5'); - test('foop', [-1224], '', 'negative | out of bounds'); - - test('foop', [0, true], 'f', 'pos 0'); - test('foop', [1, true], 'o', 'pos 1'); - test('foop', [2, true], 'o', 'pos 2'); - test('foop', [3, true], 'p', 'pos 3'); - test('foop', [4, true], 'f', 'pos 4'); - test('foop', [5, true], 'o', 'pos 5'); - test('foop', [1224, true], 'f', 'out of bounds'); - test('foop', [-1, true], 'p', 'negative | pos -1'); - test('foop', [-2, true], 'o', 'negative | pos -2'); - test('foop', [-3, true], 'o', 'negative | pos -3'); - test('foop', [-4, true], 'f', 'negative | pos -4'); - test('foop', [-5, true], 'p', 'negative | pos -5'); - test('foop', [-1224, true], 'f', 'negative | out of bounds'); - - test('wowzers', [[0,2,4,6,18]], ['w','w','e','s',''], 'handles enumerated params'); - test('wowzers', [[0,2,4,6], true], ['w','w','e','s'], 'handles enumerated params'); - test('wowzers', [[0,2,4,6,18], true], ['w','w','e','s','e'], 'handles enumerated params'); - - test('', [3], '', 'blank'); - test('wasabi', [0], 'w', 'wasabi at pos 0'); - - }); - - - method('first', function() { - test('quack', 'q', 'first character'); - test('quack', [2], 'qu', 'first 2 characters'); - test('quack', [3], 'qua', 'first 3 characters'); - test('quack', [4], 'quac', 'first 4 characters'); - test('quack', [20], 'quack', 'first 20 characters'); - test('quack', [0], '', 'first 0 characters'); - test('quack', [-1], '', 'first -1 characters'); - test('quack', [-5], '', 'first -5 characters'); - test('quack', [-10], '', 'first -10 characters'); - test('', '', 'blank'); - test('wasabi', 'w', 'no params'); - }); - - - method('last', function() { - test('quack', 'k', 'last character'); - test('quack', [2], 'ck', 'last 2 characters'); - test('quack', [3], 'ack', 'last 3 characters'); - test('quack', [4], 'uack', 'last 4 characters'); - test('quack', [10], 'quack', 'last 10 characters'); - test('quack', [-1], '', 'last -1 characters'); - test('quack', [-5], '', 'last -5 characters'); - test('quack', [-10], '', 'last -10 characters'); - - test('fa', [3], 'fa', 'last 3 characters'); - test('', '', 'lank'); - test('wasabi', 'i', 'o params'); - }); - - - method('from', function() { - test('quack', 'quack', 'no params'); - test('quack', [0], 'quack', 'from 0'); - test('quack', [2], 'ack', 'from 2'); - test('quack', [4], 'k', 'from 4'); - test('quack', [-1], 'k', 'from -1'); - test('quack', [-3], 'ack', 'from -3'); - test('quack', [-4], 'uack', 'from -4'); - test('quack', ['q'], 'quack', 'strings | q'); - test('quack', ['u'], 'uack', 'strings | u'); - test('quack', ['a'], 'ack', 'strings | a'); - test('quack', ['k'], 'k', 'strings | k'); - test('quack', [''], 'quack', 'strings | empty string'); - test('quack', ['ua'], 'uack', 'strings | 2 characters'); - test('quack', ['uo'], '', 'strings | 2 non-existent characters'); - test('quack', ['quack'], 'quack', 'strings | full string'); - - test('', [0], '', 'lank'); - test('wasabi', [3], 'abi', 'rom pos 3'); - }); - - - method('to', function() { - test('quack', 'quack', 'no params'); - test('quack', [0], '', 'to 0'); - test('quack', [1], 'q', 'to 1'); - test('quack', [2], 'qu', 'to 2'); - test('quack', [4], 'quac', 'to 4'); - test('quack', [-1], 'quac', 'to -1'); - test('quack', [-3], 'qu', 'to -3'); - test('quack', [-4], 'q', 'to -4'); - test('quack', ['q'], '', 'strings | q'); - test('quack', ['u'], 'q', 'strings | u'); - test('quack', ['a'], 'qu', 'strings | a'); - test('quack', ['k'], 'quac', 'strings | k'); - test('quack', [''], '', 'strings | empty string'); - test('quack', ['ua'], 'q', 'strings | 2 characters'); - test('quack', ['uo'], '', 'strings | 2 non-existent characters'); - test('quack', ['quack'], '', 'strings | full string'); - - test('', [0], '', 'nk'); - test('wasabi', [3], 'was', 'pos 3'); - }); - - method('dasherize', function() { - test('hop_on_pop', 'hop-on-pop', 'underscores'); - test('HOP_ON_POP', 'hop-on-pop', 'capitals and underscores'); - test('hopOnPop', 'hop-on-pop', 'camel-case'); - test('watch me fail', 'watch-me-fail', 'whitespace'); - test('watch me fail_sad_face', 'watch-me-fail-sad-face', 'whitespace sad face'); - test('waTch me su_cCeed', 'wa-tch-me-su-c-ceed', 'complex whitespace'); - test('aManAPlanACanalPanama', 'a-man-a-plan-a-canal-panama', 'single characters'); - test('', '', 'blank'); - test('noFingWay', 'no-fing-way', 'noFingWay'); - - test('street', 'street', 'street | basic'); - test('street_address', 'street-address', 'street-address | basic'); - test('person_street_address', 'person-street-address', 'person-street-address | basic'); - - withMethod('underscore', function() { - equal(run(run('street', 'dasherize'), 'underscore'), 'street', 'street | reversed') - equal(run(run('street_address', 'dasherize'), 'underscore'), 'street_address', 'street_address | reversed') - equal(run(run('person_street_address', 'dasherize'), 'underscore'), 'person_street_address', 'street_address | reversed') - }); - - }); - method('stripTags', function() { var stripped, html, allStripped, malformed; diff --git a/test/tests/string.js b/test/tests/string.js index 7f2f981da..a496f94b8 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -455,8 +455,8 @@ namespace('String', function() { describeInstance('dasherize', function(dasherize) { it('should handle basic input', function() { - assertEqual(dasherize('hop_on_pop'), 'hop-on-pop', 'underscores'); - assertEqual(dasherize('HOP_ON_POP'), 'hop-on-pop', 'capitals and underscores'); + assertEqual(dasherize('hop_on_pop'), 'hop-on-pop'); + assertEqual(dasherize('HOP_ON_POP'), 'hop-on-pop'); assertEqual(dasherize('hopOnPop'), 'hop-on-pop'); assertEqual(dasherize('watch me fail'), 'watch-me-fail'); assertEqual(dasherize('watch me fail_sad_face'), 'watch-me-fail-sad-face'); @@ -478,25 +478,25 @@ namespace('String', function() { describeInstance('titleize', function(titleize) { it('should handle basic input', function() { - assertEqual(titleize('active_record'), 'Active Record'); - assertEqual(titleize('ActiveRecord'), 'Active Record'); - assertEqual(titleize('action web service'), 'Action Web Service'); - assertEqual(titleize('Action Web Service'), 'Action Web Service'); - assertEqual(titleize('Action web service'), 'Action Web Service'); - assertEqual(titleize('actionwebservice'), 'Actionwebservice'); - assertEqual(titleize('Actionwebservice'), 'Actionwebservice'); - assertEqual(titleize("david's code"), "David's Code"); - assertEqual(titleize("David's code"), "David's Code"); - assertEqual(titleize("david's Code"), "David's Code"); - assertEqual(titleize('man from the boondocks'), 'Man from the Boondocks'); - assertEqual(titleize('x-men: the last stand'), 'X Men: The Last Stand'); - assertEqual(titleize('i am a sentence. and so am i.'), 'I Am a Sentence. And so Am I.'); - assertEqual(titleize('hello! and goodbye!'), 'Hello! And Goodbye!'); - assertEqual(titleize('hello, and goodbye'), 'Hello, and Goodbye'); - assertEqual(titleize('hello; and goodbye'), 'Hello; And Goodbye'); - assertEqual(titleize("about 'you' and 'me'"), "About 'You' and 'Me'"); - assertEqual(titleize('TheManWithoutAPast'), 'The Man Without a Past'); - assertEqual(titleize('raiders_of_the_lost_ark'), 'Raiders of the Lost Ark'); + assertEqual(titleize('active_record'), 'Active Record'); + assertEqual(titleize('ActiveRecord'), 'Active Record'); + assertEqual(titleize('action web service'), 'Action Web Service'); + assertEqual(titleize('Action Web Service'), 'Action Web Service'); + assertEqual(titleize('Action web service'), 'Action Web Service'); + assertEqual(titleize('actionwebservice'), 'Actionwebservice'); + assertEqual(titleize('Actionwebservice'), 'Actionwebservice'); + assertEqual(titleize("david's code"), "David's Code"); + assertEqual(titleize("David's code"), "David's Code"); + assertEqual(titleize("david's Code"), "David's Code"); + assertEqual(titleize('man from the boondocks'), 'Man from the Boondocks'); + assertEqual(titleize('x-men: the last stand'), 'X Men: The Last Stand'); + assertEqual(titleize('i am a sentence. and so am i.'), 'I Am a Sentence. And so Am I.'); + assertEqual(titleize('hello! and goodbye!'), 'Hello! And Goodbye!'); + assertEqual(titleize('hello, and goodbye'), 'Hello, and Goodbye'); + assertEqual(titleize('hello; and goodbye'), 'Hello; And Goodbye'); + assertEqual(titleize("about 'you' and 'me'"), "About 'You' and 'Me'"); + assertEqual(titleize('TheManWithoutAPast'), 'The Man Without a Past'); + assertEqual(titleize('raiders_of_the_lost_ark'), 'Raiders of the Lost Ark'); }); it('should handle non-titleized words', function() { @@ -566,4 +566,171 @@ namespace('String', function() { }); }); + describeInstance('at', function(at) { + + it('should find basic character at positition', () => { + assertEqual(at('foop', 0), 'f'); + assertEqual(at('foop', 1), 'o'); + assertEqual(at('foop', 2), 'o'); + assertEqual(at('foop', 3), 'p'); + assertEqual(at('foop', 4), ''); + assertEqual(at('foop', 1224), ''); + assertEqual(at('foop', -1), 'p'); + assertEqual(at('foop', -2), 'o'); + assertEqual(at('foop', -3), 'o'); + assertEqual(at('foop', -4), 'f'); + assertEqual(at('foop', -5), ''); + assertEqual(at('foop', -1224), ''); + }); + + it('should allow looping from the start', () => { + assertEqual(at('foop', 0, true), 'f'); + assertEqual(at('foop', 1, true), 'o'); + assertEqual(at('foop', 2, true), 'o'); + assertEqual(at('foop', 3, true), 'p'); + assertEqual(at('foop', 4, true), 'f'); + assertEqual(at('foop', 5, true), 'o'); + assertEqual(at('foop', 1224, true), 'f'); + assertEqual(at('foop', -1, true), 'p'); + assertEqual(at('foop', -2, true), 'o'); + assertEqual(at('foop', -3, true), 'o'); + assertEqual(at('foop', -4, true), 'f'); + assertEqual(at('foop', -5, true), 'p'); + assertEqual(at('foop', -1224, true), 'f'); + }); + + it('should accept an array', () => { + assertArrayEqual(at('wowzers', [0,2,4,6,18]), ['w','w','e','s','']); + assertArrayEqual(at('wowzers', [0,2,4,6], true), ['w','w','e','s']); + assertArrayEqual(at('wowzers', [0,2,4,6,18], true), ['w','w','e','s','e']); + }); + + it('should handle irregular input', () => { + assertEqual(at('', 3), ''); + assertEqual(at(null, 0), 'n'); + assertEqual(at(8, 0), '8'); + assertError(function(){ at('foo', null); }); + assertError(function(){ at('foo', NaN); }); + assertError(function(){ at('foo', Infinity); }); + assertError(function(){ at('foo', 2.2); }); + assertError(function(){ at('foo', '0'); }); + }); + + }); + + describeInstance('first', function(first) { + + it('should handle basic input', () => { + assertEqual(first('quack'), 'q'); + assertEqual(first('quack', 2), 'qu'); + assertEqual(first('quack', 3), 'qua'); + assertEqual(first('quack', 4), 'quac'); + assertEqual(first('quack', 20), 'quack'); + assertEqual(first('quack', 0), ''); + assertEqual(first('quack', -1), ''); + assertEqual(first('quack', -5), ''); + assertEqual(first('quack', -10), ''); + }); + + it('should handle irregular input', () => { + assertEqual(first('', 3), ''); + assertEqual(first(null, 2), 'nu'); + assertEqual(first(800, 2), '80'); + assertError(function(){ first('foo', null); }); + assertError(function(){ first('foo', NaN); }); + assertError(function(){ first('foo', Infinity); }); + assertError(function(){ first('foo', 2.2); }); + assertError(function(){ first('foo', '0'); }); + }); + + }); + + describeInstance('last', function(last) { + + it('should handle basic input', () => { + assertEqual(last('quack'), 'k'); + assertEqual(last('quack', 2), 'ck'); + assertEqual(last('quack', 3), 'ack'); + assertEqual(last('quack', 4), 'uack'); + assertEqual(last('quack', 10), 'quack'); + assertEqual(last('quack', -1), ''); + assertEqual(last('quack', -5), ''); + assertEqual(last('quack', -10), ''); + }); + + it('should handle irregular input', () => { + assertEqual(last('', 3), ''); + assertEqual(last(null, 2), 'll'); + assertEqual(last(800, 2), '00'); + assertError(function(){ last('foo', null); }); + assertError(function(){ last('foo', NaN); }); + assertError(function(){ last('foo', Infinity); }); + assertError(function(){ last('foo', 2.2); }); + assertError(function(){ last('foo', '0'); }); + }); + }); + + describeInstance('from', function(from) { + + it('should handle basic input', () => { + assertEqual(from('quack'), 'quack'); + assertEqual(from('quack', 0), 'quack'); + assertEqual(from('quack', 2), 'ack'); + assertEqual(from('quack', 4), 'k'); + assertEqual(from('quack', -1), 'k'); + assertEqual(from('quack', -3), 'ack'); + assertEqual(from('quack', -4), 'uack'); + assertEqual(from('quack', 'q'), 'quack'); + assertEqual(from('quack', 'u'), 'uack'); + assertEqual(from('quack', 'a'), 'ack'); + assertEqual(from('quack', 'k'), 'k'); + assertEqual(from('quack', ''), 'quack'); + assertEqual(from('quack', 'ua'), 'uack'); + assertEqual(from('quack', 'uo'), ''); + assertEqual(from('quack', 'quack'), 'quack'); + }); + + it('should handle irregular input', () => { + assertEqual(from('', 3), ''); + assertEqual(from(null, 2), 'll'); + assertEqual(from(800, 2), '0'); + assertError(function(){ from('foo', null); }); + assertError(function(){ from('foo', NaN); }); + assertError(function(){ from('foo', Infinity); }); + assertError(function(){ from('foo', 2.2); }); + }); + }); + + describeInstance('to', function(to) { + + it('should handle basic input', () => { + assertEqual(to('quack'), 'quack'); + assertEqual(to('quack', 0), ''); + assertEqual(to('quack', 1), 'q'); + assertEqual(to('quack', 2), 'qu'); + assertEqual(to('quack', 4), 'quac'); + assertEqual(to('quack', -1), 'quac'); + assertEqual(to('quack', -3), 'qu'); + assertEqual(to('quack', -4), 'q'); + assertEqual(to('quack', 'q'), ''); + assertEqual(to('quack', 'u'), 'q'); + assertEqual(to('quack', 'a'), 'qu'); + assertEqual(to('quack', 'k'), 'quac'); + assertEqual(to('quack', ''), ''); + assertEqual(to('quack', 'ua'), 'q'); + assertEqual(to('quack', 'uo'), ''); + assertEqual(to('quack', 'quack'), ''); + }); + + it('should handle irregular input', () => { + assertEqual(to('', 3), ''); + assertEqual(to(null, 2), 'nu'); + assertEqual(to(800, 2), '80'); + assertError(function(){ to('foo', null); }); + assertError(function(){ to('foo', NaN); }); + assertError(function(){ to('foo', Infinity); }); + assertError(function(){ to('foo', 2.2); }); + }); + }); + }); From 33135be67389323ccca8e155aef0049b25d7552c Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 20 Jul 2020 21:56:27 +0900 Subject: [PATCH 034/191] Added String#isBlank/isEmpty --- src/string/define.js | 2 ++ src/string/isBlank.js | 20 ++++++++++++++++++++ src/string/isEmpty.js | 20 ++++++++++++++++++++ src/string/methods.js | 2 ++ test/OLD/tests/string.js | 20 -------------------- test/tests/string.js | 39 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 src/string/isBlank.js create mode 100644 src/string/isEmpty.js diff --git a/src/string/define.js b/src/string/define.js index ef17d856e..ab97254f5 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -8,6 +8,8 @@ defineInstance('capitalize', methods.capitalize); defineInstance('dasherize', methods.dasherize); defineInstance('first', methods.first); defineInstance('from', methods.from); +defineInstance('isBlank', methods.isBlank); +defineInstance('isEmpty', methods.isEmpty); defineInstance('last', methods.last); defineInstance('pad', methods.pad); defineInstance('parameterize', methods.parameterize); diff --git a/src/string/isBlank.js b/src/string/isBlank.js new file mode 100644 index 000000000..0e5cb0750 --- /dev/null +++ b/src/string/isBlank.js @@ -0,0 +1,20 @@ +import coerce from './util/coerce'; + +/** + * Returns true if the string has length 0 or contains only whitespace. + * + * @param {string} str - The string. + * + * @example + * + * ''.isBlank() -> true + * ' '.isBlank() -> true + * 'foo'.isBlank() -> false + * + * @returns {boolean} + * + **/ +export default function isBlank(str) { + str = coerce(str); + return str.trim().length === 0; +} diff --git a/src/string/isEmpty.js b/src/string/isEmpty.js new file mode 100644 index 000000000..bc3998a3b --- /dev/null +++ b/src/string/isEmpty.js @@ -0,0 +1,20 @@ +import coerce from './util/coerce'; + +/** + * Returns true if the string has length 0. + * + * @param {string} str - The string. + * + * @example + * + * ''.isEmpty() -> true + * 'a'.isEmpty() -> false + * ' '.isEmpty() -> false + * + * @returns {boolean} + * + **/ +export default function isBlank(str) { + str = coerce(str); + return str.length === 0; +} diff --git a/src/string/methods.js b/src/string/methods.js index 449d1dfdb..35e738975 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -4,6 +4,8 @@ export { default as capitalize } from './capitalize'; export { default as dasherize } from './dasherize'; export { default as first } from './first'; export { default as from } from './from'; +export { default as isBlank } from './isBlank'; +export { default as isEmpty } from './isEmpty'; export { default as last } from './last'; export { default as pad } from './pad'; export { default as parameterize } from './parameterize'; diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index b890490f1..502283a00 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -323,26 +323,6 @@ namespace('String', function () { test('', [], 'empty string'); }); - method('isEmpty', function() { - test('', true); - test('0', false); - test(' ', false); - test(' ', false); - test('\t', false); - test('\n', false); - }); - - method('isBlank', function() { - - test('', true, 'blank string'); - test('0', false, '0'); - test(' ', true, 'successive blanks'); - test('\n', true, 'new line'); - test('\t\t\t\t', true, 'tabs'); - test('日本語では 「マス」 というの知ってた?', false, 'japanese'); - test('mayonnaise', false, 'mayonnaise'); - }); - method('insert', function() { test('schfifty', [' five'], 'schfifty five', 'schfifty five'); test('dopamine', ['e', 3], 'dopeamine', 'dopeamine'); diff --git a/test/tests/string.js b/test/tests/string.js index a496f94b8..25794ba4d 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -733,4 +733,43 @@ namespace('String', function() { }); }); + describeInstance('isEmpty', function(isEmpty) { + + it('should handle basic input', () => { + assertEqual(isEmpty(''), true); + assertEqual(isEmpty('0'), false); + assertEqual(isEmpty(' '), false); + assertEqual(isEmpty(' '), false); + assertEqual(isEmpty('\t'), false); + assertEqual(isEmpty('\n'), false); + }); + + it('should handle irregular input', () => { + assertEqual(isEmpty(null), false); + assertEqual(isEmpty(undefined), false); + assertEqual(isEmpty(8), false); + }); + + }); + + describeInstance('isBlank', function(isBlank) { + + it('should handle basic input', () => { + assertEqual(isBlank(''), true); + assertEqual(isBlank('0'), false); + assertEqual(isBlank(' '), true); + assertEqual(isBlank('\n'), true); + assertEqual(isBlank('\t\t\t\t'), true); + assertEqual(isBlank('日本語では 「マス」'), false); + assertEqual(isBlank('mayonnaise'), false); + }); + + it('should handle irregular input', () => { + assertEqual(isBlank(null), false); + assertEqual(isBlank(undefined), false); + assertEqual(isBlank(8), false); + }); + + }); + }); From df15d7b7c402ba646d4b38b0eec1acf1b6900435 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 20 Jul 2020 22:18:42 +0900 Subject: [PATCH 035/191] Added String#compact --- src/string/compact.js | 24 +++++++++++++++++ src/string/define.js | 1 + src/string/methods.js | 1 + test/OLD/tests/string.js | 18 ------------- test/tests/string.js | 56 ++++++++++++++++++++++++++++------------ 5 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 src/string/compact.js diff --git a/src/string/compact.js b/src/string/compact.js new file mode 100644 index 000000000..ba8b94b5e --- /dev/null +++ b/src/string/compact.js @@ -0,0 +1,24 @@ +import coerce from './util/coerce'; + +const WHITESPACE_REG = /\s+/g; +const NON_SPACE_REG = /[^\u0020\u3000]/; + +/** + * Compacts whitespace in the string to a single space and trims the ends. + * + * @param {string} str - The string. + * + * @example + * + * 'too \n much \n space'.compact() -> 'too much space' + * 'enough \n '.compact() -> 'enough' + * + * @returns {strin} + * + **/ +export default function compact(str) { + str = coerce(str); + return str.trim().replace(WHITESPACE_REG, (whitespace) => { + return whitespace.replace(NON_SPACE_REG, '').charAt(0) || ' '; + }); +} diff --git a/src/string/define.js b/src/string/define.js index ab97254f5..f55d582eb 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -5,6 +5,7 @@ defineStatic('range', methods.range); defineInstance('at', methods.at); defineInstance('camelize', methods.camelize); defineInstance('capitalize', methods.capitalize); +defineInstance('compact', methods.compact); defineInstance('dasherize', methods.dasherize); defineInstance('first', methods.first); defineInstance('from', methods.from); diff --git a/src/string/methods.js b/src/string/methods.js index 35e738975..2377326e5 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -1,6 +1,7 @@ export { default as at } from './at'; export { default as camelize } from './camelize'; export { default as capitalize } from './capitalize'; +export { default as compact } from './compact'; export { default as dasherize } from './dasherize'; export { default as first } from './first'; export { default as from } from './from'; diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 502283a00..abad5cb96 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -444,24 +444,6 @@ namespace('String', function () { }); - method('compact', function() { - var largeJapaneseSpaces = '   日本語     の     スペース     も  '; - var compactedWithoutJapaneseSpaces = '日本語 の スペース も'; - var compactedWithTrailingJapaneseSpaces = ' 日本語 の スペース も '; - - test('the rain in spain falls mainly on the plain', 'the rain in spain falls mainly on the plain', 'basic'); - test('\n\n\nthe \n\n\nrain in spain falls mainly on the plain\n\n', 'the rain in spain falls mainly on the plain', 'with newlines'); - test('\n\n\n\n \t\t\t\t \n\n \t', '', 'with newlines and tabs'); - - test('moo\tmoo', 'moo moo', 'moo moo tab'); - test('moo \tmoo', 'moo moo', 'moo moo space tab'); - test('moo \t moo', 'moo moo', 'moo moo space tab space'); - - test('', '', 'blank'); - test('run tell dat', 'run tell dat', 'with extra whitespace'); - }); - - method('stripTags', function() { var stripped, html, allStripped, malformed; diff --git a/test/tests/string.js b/test/tests/string.js index 25794ba4d..bc5c0bf4d 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -568,7 +568,7 @@ namespace('String', function() { describeInstance('at', function(at) { - it('should find basic character at positition', () => { + it('should find basic character at positition', function() { assertEqual(at('foop', 0), 'f'); assertEqual(at('foop', 1), 'o'); assertEqual(at('foop', 2), 'o'); @@ -583,7 +583,7 @@ namespace('String', function() { assertEqual(at('foop', -1224), ''); }); - it('should allow looping from the start', () => { + it('should allow looping from the start', function() { assertEqual(at('foop', 0, true), 'f'); assertEqual(at('foop', 1, true), 'o'); assertEqual(at('foop', 2, true), 'o'); @@ -599,13 +599,13 @@ namespace('String', function() { assertEqual(at('foop', -1224, true), 'f'); }); - it('should accept an array', () => { + it('should accept an array', function() { assertArrayEqual(at('wowzers', [0,2,4,6,18]), ['w','w','e','s','']); assertArrayEqual(at('wowzers', [0,2,4,6], true), ['w','w','e','s']); assertArrayEqual(at('wowzers', [0,2,4,6,18], true), ['w','w','e','s','e']); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(at('', 3), ''); assertEqual(at(null, 0), 'n'); assertEqual(at(8, 0), '8'); @@ -620,7 +620,7 @@ namespace('String', function() { describeInstance('first', function(first) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(first('quack'), 'q'); assertEqual(first('quack', 2), 'qu'); assertEqual(first('quack', 3), 'qua'); @@ -632,7 +632,7 @@ namespace('String', function() { assertEqual(first('quack', -10), ''); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(first('', 3), ''); assertEqual(first(null, 2), 'nu'); assertEqual(first(800, 2), '80'); @@ -647,7 +647,7 @@ namespace('String', function() { describeInstance('last', function(last) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(last('quack'), 'k'); assertEqual(last('quack', 2), 'ck'); assertEqual(last('quack', 3), 'ack'); @@ -658,7 +658,7 @@ namespace('String', function() { assertEqual(last('quack', -10), ''); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(last('', 3), ''); assertEqual(last(null, 2), 'll'); assertEqual(last(800, 2), '00'); @@ -672,7 +672,7 @@ namespace('String', function() { describeInstance('from', function(from) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(from('quack'), 'quack'); assertEqual(from('quack', 0), 'quack'); assertEqual(from('quack', 2), 'ack'); @@ -690,7 +690,7 @@ namespace('String', function() { assertEqual(from('quack', 'quack'), 'quack'); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(from('', 3), ''); assertEqual(from(null, 2), 'll'); assertEqual(from(800, 2), '0'); @@ -703,7 +703,7 @@ namespace('String', function() { describeInstance('to', function(to) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(to('quack'), 'quack'); assertEqual(to('quack', 0), ''); assertEqual(to('quack', 1), 'q'); @@ -722,7 +722,7 @@ namespace('String', function() { assertEqual(to('quack', 'quack'), ''); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(to('', 3), ''); assertEqual(to(null, 2), 'nu'); assertEqual(to(800, 2), '80'); @@ -735,7 +735,7 @@ namespace('String', function() { describeInstance('isEmpty', function(isEmpty) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(isEmpty(''), true); assertEqual(isEmpty('0'), false); assertEqual(isEmpty(' '), false); @@ -744,7 +744,7 @@ namespace('String', function() { assertEqual(isEmpty('\n'), false); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(isEmpty(null), false); assertEqual(isEmpty(undefined), false); assertEqual(isEmpty(8), false); @@ -754,7 +754,7 @@ namespace('String', function() { describeInstance('isBlank', function(isBlank) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(isBlank(''), true); assertEqual(isBlank('0'), false); assertEqual(isBlank(' '), true); @@ -764,7 +764,7 @@ namespace('String', function() { assertEqual(isBlank('mayonnaise'), false); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(isBlank(null), false); assertEqual(isBlank(undefined), false); assertEqual(isBlank(8), false); @@ -772,4 +772,28 @@ namespace('String', function() { }); + describeInstance('compact', function(compact) { + + it('should handle basic input', function() { + assertEqual(compact('the rain in spain falls mainly on the plain'), 'the rain in spain falls mainly on the plain'); + assertEqual(compact('\n\n\nthe \n\n\nrain in spain falls mainly on the plain\n\n'), 'the rain in spain falls mainly on the plain'); + assertEqual(compact('\n\n\n\n \t\t\t\t \n\n \t'), ''); + assertEqual(compact('moo\tmoo'), 'moo moo', 'moo moo tab'); + assertEqual(compact('moo \tmoo'), 'moo moo', 'moo moo space tab'); + assertEqual(compact('moo \t moo'), 'moo moo', 'moo moo space tab space'); + }); + + it('should handle full-width spaces', function() { + assertEqual(compact('   全角   スペース    も '), '全角 スペース も'); + assertEqual(compact('全角 スペース も'), '全角 スペース も'); + assertEqual(compact(' 全角 スペース も '), '全角 スペース も'); + }); + + it('should handle irregular input', function() { + assertEqual(compact(null), 'null'); + assertEqual(compact(undefined), 'undefined'); + assertEqual(compact(800), '800'); + }); + }); + }); From 9532dc1c3a50363c5b9a2d4f76748e33ca0fb9d1 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 21 Jul 2020 03:03:27 +0900 Subject: [PATCH 036/191] Removed String#format --- CHANGELOG.md | 1 + test/OLD/tests/string.js | 103 --------------------------------------- 2 files changed, 1 insertion(+), 103 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e20f2cc77..1531f2113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ v3.0.0 `Number#round/floor/ceil/abs/sqrt/pow` aliases are retained. - Added `Number#trunc` Math alias. - Removed Inflections modules. Affected methods `String#camelize/underscore/spacify/titleize`. +- Removed `String#format` in favor of ES6 template literals. TODO: diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index abad5cb96..b7de1a66e 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -865,107 +865,4 @@ namespace('String', function () { }); - method('format', function() { - - var obj1 = { firstName: 'Harry' }; - var obj2 = { lastName: 'Potter' }; - var obj3 = { firstName: 'program', age: 21, points: 345 }; - - test('Welcome, {0}.', ['program'], 'Welcome, program.', 'array index'); - test('Welcome, {firstName}.', [obj1], 'Welcome, Harry.', 'keyword'); - test('Welcome, {firstName}. You are {age} years old and have {points} points left.', [obj3], 'Welcome, program. You are 21 years old and have 345 points left.', '3 arguments by keyword'); - test('Welcome, {0}. You are {1} years old and have {2} points left.', ['program', 21, 345], 'Welcome, program. You are 21 years old and have 345 points left.', '3 arguments by index'); - test('Welcome, {0}.', [obj1], 'Welcome, undefined.', 'numeric key does not exist in object'); - test('hello {0.firstName}', [obj1], 'hello undefined', 'does not allow dot expressions'); - test('hello {firstName} {lastName}', [obj1, obj2], 'hello undefined undefined', 'objects will not be merged'); - test('hello {0.firstName} {1.lastName}', [obj1, obj2], 'hello Harry Potter', 'arrays are accessible through indexes'); - test('hello {0.firstName} {1.lastName}', [[obj1, obj2]], 'hello Harry Potter', 'passing an array as the only argument will get unwrapped'); - - test('hello {0} {1.firstName}', ['Dirty', obj1], 'hello Dirty Harry', 'string and object'); - test('hello {0} {1}', ['Dirty', obj1.firstName], 'hello Dirty Harry', 'string and object property'); - test('hello {0.firstName} {1}', [obj1, 'Dirty'], 'hello Harry Dirty', 'object and string'); - - test(obj1.firstName, 'Harry', 'obj1 retains its properties'); - equal(obj1.lastName, undefined, 'obj1 is untampered'); - - test(obj2.lastName, 'Potter', 'obj2 retains its properties'); - equal(obj2.firstName, undefined, 'obj2 is untampered'); - - test('Hello, {0}.', [''], 'Hello, .', 'empty string has no index'); - test('Hello, {empty}.', [{ empty: '' }], 'Hello, .', 'empty string matches'); - test('Hello, {0}.', [], 'Hello, undefined.', 'no argument with index'); - test('Hello, {name}.', [], 'Hello, undefined.', 'no argument with keyword'); - - test('{}', ['foo'], '{}', 'single curly braces does not match'); - test('{{}}', ['foo'], '{}', 'double curly braces escapes'); - test('}}{{', ['foo'], '}{', 'reverse double curly braces'); - test('{{{0} {1}}}', ['foo', 'bar'], '{foo bar}', 'properly nested braces'); - test('{{0 {1}', ['foo', 'bar'], '{0 bar', 'escaped open with non-escaped'); - - test('{{0}}', ['foo'], '{0}', 'single nested'); - test('{{{0}}}', ['foo'], '{foo}', 'double nested'); - test('{{{{0}}}}', ['foo'], '{{0}}', '3 nested'); - test('{{{{{0}}}}}', ['foo'], '{{foo}}', '4 nested'); - test('{{{{{{0}}}}}}', ['foo'], '{{{0}}}', '5 nested'); - - test('%', [], '%', '%'); - test('%%', [], '%%', '%%'); - test('%f', [], '%f', '%f'); - - raisesError(function() { run('0}', 'format', ['foo']); }, 'unmatched }'); - raisesError(function() { run('{0', 'format', ['foo']); }, 'unmatched {'); - raisesError(function() { run('}{', 'format', ['foo']); }, 'reversed curly braces'); - raisesError(function() { run('{{foo}', 'format', ['foo']); }, 'escaped open with unmatched close'); - raisesError(function() { run('{{0} {1}}', 'format', ['foo', 'bar']); }, 'improperly nested braces'); - raisesError(function() { run('{0}}', 'format', ['foo']); }, 'two trailing braces'); - raisesError(function() { run('{0}}}}', 'format', ['foo']); }, 'four trailing braces'); - - test('{0}}}', ['foo'], 'foo}', 'three trailing braces'); - test('{0}}}}}', ['foo'], 'foo}}', 'five trailing braces'); - - test('Welcome, {0}.', [Object('user')], 'Welcome, user.', 'string object should be coerced'); - test('Welcome, {0}.', [Object(3)], 'Welcome, 3.', 'number should be coerced'); - test('Welcome, {0}.', [Object(true)], 'Welcome, true.', 'boolean should be coerced'); - test('Welcome, {0}.', [null], 'Welcome, null.', 'passing null'); - test('Welcome, {0}.', [undefined], 'Welcome, undefined.', 'passing undefined'); - - var obj1 = {a:{b:{c:'foo'}}}; - var obj2 = {a:{b:{c:'bar'}}}; - test('{0.a.b.c}{1.a.b.c}', [obj1, obj2], 'foobar', 'deep objects'); - - // Taken from Python format docs. - test('First, thou shalt count to {0}', ['foo'], 'First, thou shalt count to foo', ''); - test('Bring me a {}', ['foo'], 'Bring me a {}', 'requires a key to be passed'); - test('From {} to {}', ['foo', 'bar'], 'From {} to {}', 'requires keys to be passed'); - test('My quest is {name}', [{name:'partying'}], 'My quest is partying', 'allows keyword arguments as objects'); - test('Weight in tons {0.weight}', ['foo'], 'Weight in tons undefined', 'does not allow operators as part of format'); - test('Units destroyed: {players[0]}', [{players: ['huey', 'duey']}], 'Units destroyed: huey', 'allows bracket syntax'); - - test('{0}, {1}, {2}', ['a', 'b', 'c'], 'a, b, c', 'simple enumeration'); - test('{}, {}, {}', ['a', 'b', 'c'], '{}, {}, {}', 'empty tokens'); - test('{2}, {1}, {0}', ['a', 'b', 'c'], 'c, b, a', 'reversed'); - test('{0}{1}{0}', ['abra', 'cad'], 'abracadabra', 'indices can be repeated'); - - test('Coordinates: {latitude}, {longitude}', [{latitude: '37.24N', longitude: '-115.81W'}], 'Coordinates: 37.24N, -115.81W', 'coordinates separate'); - - var coord = {'latitude': '37.24N', 'longitude': '-115.81W'}; - test('Coordinates: {latitude}, {longitude}', [coord], 'Coordinates: 37.24N, -115.81W', 'coords as object'); - - // Sugar departs somewhat from Python here as it is not greedy in matching - // nested braces. This is largely for the sake of simplicity; not requiring - // a recursive and/or tokenized system lets a single regex cover 99% of use - // cases, and is highly optimized by the browser. Although "one {0} {1} two" - // could in theory be an object key in Javascript, a key such as "{one}" is - // impossible to access (see test below), so it also makes things cleaner - // to simply not allow nested braces from the start, and instead require the - // properties to be enumerated or mapped to a new object. - raisesError(function() { run('{one {0} {1} two}', 'format', []); }, 'nested without escaping'); - - // There is currently no way to access properties that have braces in the keynames. - // They will have to be enumerated as arguments or mapped to different property names. - // This is not possible in Python as kwargs names cannot have special characters. - test('{{{name}}}', [{'{name}': 'John'}], '{undefined}', 'cannot access properties with braces'); - - }); - }); From f1532d946615516a183001839587d81a6b473aba Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 21 Jul 2020 04:29:12 +0900 Subject: [PATCH 037/191] Added String#toNumber --- src/string/define.js | 1 + src/string/methods.js | 1 + src/string/toNumber.js | 52 +++++++++++++++++++++++++++++++++ src/util/fullWidth.js | 8 +++++ test/tests/string.js | 66 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 src/string/toNumber.js create mode 100644 src/util/fullWidth.js diff --git a/src/string/define.js b/src/string/define.js index f55d582eb..f32b6750b 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -17,6 +17,7 @@ defineInstance('parameterize', methods.parameterize); defineInstance('spacify', methods.spacify); defineInstance('titleize', methods.titleize); defineInstance('to', methods.to); +defineInstance('toNumber', methods.toNumber); defineInstance('truncate', methods.truncate); defineInstance('truncateOnWord', methods.truncateOnWord); defineInstance('underscore', methods.underscore); diff --git a/src/string/methods.js b/src/string/methods.js index 2377326e5..4b5fbf5c7 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -14,6 +14,7 @@ export { default as range } from './range'; export { default as spacify } from './spacify'; export { default as titleize } from './titleize'; export { default as to } from './to'; +export { default as toNumber } from './toNumber'; export { default as truncate } from './truncate'; export { default as truncateOnWord } from './truncateOnWord'; export { default as underscore } from './underscore'; diff --git a/src/string/toNumber.js b/src/string/toNumber.js new file mode 100644 index 000000000..83d5a00b5 --- /dev/null +++ b/src/string/toNumber.js @@ -0,0 +1,52 @@ +import coerce from './util/coerce'; +import { normalizeFullWidth } from '../util/fullWidth'; + +/** + * Converts the string into a number. + * + * @extra This method exists primarily to smooth over edge cases when parsing + * numbers. It will attempt to quickly parse the number up front and fall back + * to a more robust algorithm. Its (slightly) slower form has built-in behavior + * of handling trailing characters, hex notation (0xFF), and scientific notation + * (1e10), and can additionally handle numbers with thousands separators as well + * as full-width numbers. + * + * @param {string} str - The string. + * @param {number} [base] - An integer between 2 and 36 that represents the base + * (radix) of the string. + * + * @example + * + * '153'.toNumber() -> 153 + * '12,000'.toNumber() -> 12000 + * '10px'.toNumber() -> 10 + * '0xFF'.toNumber(16) -> 255 + * 'ff'.toNumber(16) -> 255 + * + **/ +export default function toNumber(str, base) { + let n; + if (!base || base === 10) { + // Try to return up front quickly. + n = +str; + } + if (!n) { + // If parsing fails then try a more thorough + // check. Note that number coercion can also + // fail with a result of 0, so ensure that + // is checked as well. + n = toNumberSlower(str, base); + } + return n; +} + +function toNumberSlower(str, base) { + str = coerce(str); + str = str.replace(/,/g, ''); + str = normalizeFullWidth(str); + if (base) { + return parseInt(str, base); + } else { + return parseFloat(str); + } +} diff --git a/src/util/fullWidth.js b/src/util/fullWidth.js new file mode 100644 index 000000000..7a81bc90d --- /dev/null +++ b/src/util/fullWidth.js @@ -0,0 +1,8 @@ +const FULL_WIDTH_REG = /[\uFF01-\uFF5E]/g; +const SHIFT_BY = 65248; + +export function normalizeFullWidth(str) { + return str.replace(FULL_WIDTH_REG, (char) => { + return String.fromCharCode(char.charCodeAt(0) - SHIFT_BY); + }); +} diff --git a/test/tests/string.js b/test/tests/string.js index bc5c0bf4d..e28c72c23 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -796,4 +796,70 @@ namespace('String', function() { }); }); + describeInstance('toNumber', function(toNumber) { + + it('should handle integers', function() { + assertEqual(toNumber('10'), 10); + assertEqual(toNumber('10,000'), 10000); + assertEqual(toNumber('5,322,144,444'), 5322144444); + assertEqual(toNumber('22.5'), 22.5); + }); + + it('should handle decimals', () => { + assertEqual(toNumber('10.532'), 10.532); + assertEqual(toNumber('10.848'), 10.848); + assertEqual(toNumber('95.25%'), 95.25); + assertEqual(toNumber('77.3'), 77.3); + assertEqual(toNumber('1.45kg'), 1.45); + assertEqual(toNumber('.3'), 0.3); + }); + + it('should handle trailing characters', () => { + assertEqual(toNumber('4em'), 4); + assertEqual(toNumber('10px'), 10); + assertEqual(toNumber('1234blue'), 1234); + }); + + it('should not convert octals', () => { + assertEqual(toNumber('010'), 10); + assertEqual(toNumber('0908'), 908); + assertEqual(toNumber('077.3'), 77.3); + }); + + it('should throw away redundant decimals', () => { + assertEqual(toNumber('22.34.5'), 22.34); + }); + + it('should handle hex strings', () => { + assertEqual(toNumber('0xFF'), 255); + }); + + it('should handle a different base', () => { + assertEqual(toNumber('FF', 16), 255); + }); + + it('should handle scientific notation', () => { + assertEqual(toNumber('1e6'), 1000000); + assertEqual(toNumber('0.1e6'), 100000); + }); + + it('should handle full-width characters', function() { + assertEqual(toNumber('200'), 200); + assertEqual(toNumber('5.2345'), 5.2345); + }); + + it('should handle irregular input', function() { + assertEqual(toNumber(8), 8); + assertNaN(toNumber(null)); + assertNaN(toNumber(NaN)); + assertNaN(toNumber('')); + assertNaN(toNumber(' \r\n\t')); + assertEqual(toNumber('0xA'), 10); + assertEqual(toNumber('0x77.3'), 0); + assertNaN(toNumber('blue'), true); + assertNaN(toNumber('........'), true); + }); + + }); + }); From 66f14189f38bb61fe510d0f9cb1cd545e09d7901 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 21 Jul 2020 04:33:12 +0900 Subject: [PATCH 038/191] changelog update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1531f2113..9daf82a7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ v3.0.0 ====== +- All polyfill support now dropped. - Added defineAlias to core. - Cannot instantiate chainable without new keyword anymore (ES6). - `Sugar()` alias is no longer supported. Use `Sugar.extend()` instead. From 12ef31e83ccdc8a2d119c5420dbd3379b90dc82f Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 21 Jul 2020 15:50:31 +0900 Subject: [PATCH 039/191] added String#reverse --- src/string/define.js | 1 + src/string/methods.js | 1 + src/string/reverse.js | 15 ++++++++++++ test/OLD/tests/string.js | 52 ---------------------------------------- test/tests/string.js | 11 +++++++++ 5 files changed, 28 insertions(+), 52 deletions(-) create mode 100644 src/string/reverse.js diff --git a/src/string/define.js b/src/string/define.js index f32b6750b..576070d86 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -14,6 +14,7 @@ defineInstance('isEmpty', methods.isEmpty); defineInstance('last', methods.last); defineInstance('pad', methods.pad); defineInstance('parameterize', methods.parameterize); +defineInstance('reverse', methods.reverse); defineInstance('spacify', methods.spacify); defineInstance('titleize', methods.titleize); defineInstance('to', methods.to); diff --git a/src/string/methods.js b/src/string/methods.js index 4b5fbf5c7..1c0ea6856 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -11,6 +11,7 @@ export { default as last } from './last'; export { default as pad } from './pad'; export { default as parameterize } from './parameterize'; export { default as range } from './range'; +export { default as reverse } from './reverse'; export { default as spacify } from './spacify'; export { default as titleize } from './titleize'; export { default as to } from './to'; diff --git a/src/string/reverse.js b/src/string/reverse.js new file mode 100644 index 000000000..da2239c2e --- /dev/null +++ b/src/string/reverse.js @@ -0,0 +1,15 @@ +/** + * Reverses the string. + * + * @param {string} str - The string. + * + * @example + * + * 'jumpy'.reverse() -> 'ypmuj' + * 'lucky charms'.reverse() -> 'smrahc ykcul' + * + ***/ +export default function reverse(str) { + return str.split('').reverse().join(''); +} + diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index b7de1a66e..fc85fb285 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -391,58 +391,6 @@ namespace('String', function () { test('abc', [], 'abc', 'no args'); }); - method('toNumber', function() { - - test('4em', 4, '4em'); - test('10px', 10, '10px'); - test('10,000', 10000, '10,000'); - test('5,322,144,444', 5322144444, '5,322,144,444'); - test('10.532', 10.532, '10.532'); - test('10', 10, '10'); - test('95.25%', 95.25, '95.25%'); - test('10.848', 10.848, '10.848'); - - test('1234blue', 1234, '1234blue'); - test('22.5', 22.5, '22.5'); - - test('010', 10, '"010" should be 10'); - test('0908', 908, '"0908" should be 908'); - test('22.34.5', 22.34, '"22.34.5" should be 22.34'); - - test('1.45kg', 1.45, '"1.45kg"'); - test('77.3', 77.3, '77.3'); - test('077.3', 77.3, '"077.3" should be 77.3'); - test('.3', 0.3, '".3" should be 0.3'); - test('0.1e6', 100000, '"0.1e6" should be 100000'); - - test('200', 200, 'full-width | should work on full-width integers'); - test('5.2345', 5.2345, 'full-width | should work on full-width decimals'); - - equal(isNaN(run('0xA')), false, '"0xA" should not be NaN'); - equal(isNaN(run('blue')), true, '"blue" should not be NaN'); - equal(isNaN(run('........')), true, '"......." should be NaN'); - equal(isNaN(run('0x77.3')), false, '"0x77.3" is not NaN'); - - }); - - // Hexadecimal - method('toNumber', function() { - test('ff', [16], 255, 'ff'); - test('00', [16], 0, '00'); - test('33', [16], 51, '33'); - test('66', [16], 102, '66'); - test('99', [16], 153, '99'); - test('bb', [16], 187, 'bb'); - }); - - - method('reverse', function() { - test('spoon', 'noops', 'spoon'); - test('amanaplanacanalpanama', 'amanaplanacanalpanama', 'amanaplanacanalpanama'); - test('', '', 'blank'); - test('wasabi', 'ibasaw', 'wasabi'); - }); - method('stripTags', function() { var stripped, html, allStripped, malformed; diff --git a/test/tests/string.js b/test/tests/string.js index e28c72c23..64b3618a0 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -862,4 +862,15 @@ namespace('String', function() { }); + describeInstance('reverse', function(reverse) { + + it('should handle basic input', () => { + assertEqual(reverse('spoon'), 'noops'); + assertEqual(reverse('amanaplanacanalpanama'), 'amanaplanacanalpanama'); + assertEqual(reverse(''), ''); + assertEqual(reverse('wasabi'), 'ibasaw'); + }); + + }); + }); From 06027810e28d8e66eb39e6b4547f378879b7d09d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 21 Jul 2020 17:59:21 +0900 Subject: [PATCH 040/191] Added String#encodeBase64/decodeBase64 --- src/string/decodeBase64.js | 59 ++++++++++++++++++++++++++++ src/string/define.js | 2 + src/string/encodeBase64.js | 40 +++++++++++++++++++ src/string/methods.js | 2 + src/string/reverse.js | 3 ++ src/util/assertions.js | 8 +++- test/.eslintrc | 1 + test/OLD/tests/string.js | 36 ------------------ test/index.js | 1 + test/tests/string.js | 78 ++++++++++++++++++++++++++++++++++---- 10 files changed, 185 insertions(+), 45 deletions(-) create mode 100644 src/string/decodeBase64.js create mode 100644 src/string/encodeBase64.js diff --git a/src/string/decodeBase64.js b/src/string/decodeBase64.js new file mode 100644 index 000000000..7155f4de7 --- /dev/null +++ b/src/string/decodeBase64.js @@ -0,0 +1,59 @@ +import { assertString } from '../util/assertions'; + +const HAS_GLOBAL = typeof atob !== 'undefined'; +const HAS_BUFFER = typeof Buffer !== 'undefined'; + +const VALIDATION_REG = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/; + +/** + * Decodes the string from base64 encoding. + * + * @extra This method wraps built-in methods. It also smooths over issues + * with decoding Unicode strings including UTF-8 input. + * + * @param {string} str - The string. + * + * @example + * + * 'aHR0cDovL3R3aXR0ZXIuY29tLw=='.decodeBase64() -> 'http://twitter.com/' + * 'anVzdCBnb3QgZGVjb2RlZA=='.decodeBase64() -> 'just got decoded!' + * + **/ +export default function encodeBase64(str) { + if (HAS_GLOBAL || HAS_BUFFER) { + try { + assertString(str); + validateBase64(str); + if (HAS_GLOBAL) { + return decodeBase64Global(str); + } else if (HAS_BUFFER) { + return decodeBase64Buffer(str); + } + } catch(err) { + throw new Error('Cannot base64 decode string (malformed input).'); + } + } else { + throw new Error('Cannot base64 decode string (not supported).'); + } +} + +function validateBase64(str) { + if (!VALIDATION_REG.test(str)) { + throw new Error(); + } +} + +// Handling UTF-8 +// https://stackoverflow.com/questions/30106476/using-javascripts-atob-to-decode-base64-doesnt-properly-decode-utf-8-strings +function decodeBase64Global(str) { + str = atob(str); + str = str.split('').map((char) => { + return '%' + ('00' + char.charCodeAt(0).toString(16)).slice(-2); + }).join('') + str = decodeURIComponent(str); + return str; +} + +function decodeBase64Buffer(str) { + return Buffer.from(str, 'base64').toString('utf8') +} diff --git a/src/string/define.js b/src/string/define.js index 576070d86..5bf37ca21 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -7,6 +7,8 @@ defineInstance('camelize', methods.camelize); defineInstance('capitalize', methods.capitalize); defineInstance('compact', methods.compact); defineInstance('dasherize', methods.dasherize); +defineInstance('decodeBase64', methods.decodeBase64); +defineInstance('encodeBase64', methods.encodeBase64); defineInstance('first', methods.first); defineInstance('from', methods.from); defineInstance('isBlank', methods.isBlank); diff --git a/src/string/encodeBase64.js b/src/string/encodeBase64.js new file mode 100644 index 000000000..a31fe46fd --- /dev/null +++ b/src/string/encodeBase64.js @@ -0,0 +1,40 @@ +import coerce from './util/coerce'; + +const HAS_GLOBAL = typeof btoa !== 'undefined'; +const HAS_BUFFER = typeof Buffer !== 'undefined'; + +const BYTE_REG = /%([0-9A-F]{2})/g; + +/** + * Encodes the string into base64 encoding. + * + * @extra This method wraps built-in methods. It also smooths over issues + * with encoding Unicode strings. + * + * @param {string} str - The string. + * + * @example + * + * 'gonna get encoded!'.encodeBase64() -> 'Z29ubmEgZ2V0IGVuY29kZWQh' + * 'http://twitter.com/'.encodeBase64() -> 'aHR0cDovL3R3aXR0ZXIuY29tLw==' + * + **/ +export default function encodeBase64(str) { + str = coerce(str); + if (HAS_GLOBAL) { + return unicodeBase64Encode(str); + } else if (HAS_BUFFER) { + return Buffer.from(str, 'utf8').toString('base64'); + } else { + throw new Error('Cannot base64 encode string (not supported).'); + } +} + +function unicodeBase64Encode(str) { + str = encodeURIComponent(str); + str = str.replace(BYTE_REG, (match, code) => { + return String.fromCharCode('0x' + code); + }); + str = btoa(str); + return str; +} diff --git a/src/string/methods.js b/src/string/methods.js index 1c0ea6856..9874c7aed 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -3,6 +3,8 @@ export { default as camelize } from './camelize'; export { default as capitalize } from './capitalize'; export { default as compact } from './compact'; export { default as dasherize } from './dasherize'; +export { default as decodeBase64 } from './decodeBase64'; +export { default as encodeBase64 } from './encodeBase64'; export { default as first } from './first'; export { default as from } from './from'; export { default as isBlank } from './isBlank'; diff --git a/src/string/reverse.js b/src/string/reverse.js index da2239c2e..cc5b71568 100644 --- a/src/string/reverse.js +++ b/src/string/reverse.js @@ -1,3 +1,5 @@ +import coerce from './util/coerce'; + /** * Reverses the string. * @@ -10,6 +12,7 @@ * ***/ export default function reverse(str) { + str = coerce(str); return str.split('').reverse().join(''); } diff --git a/src/util/assertions.js b/src/util/assertions.js index ba835dafd..14f54010e 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -1,4 +1,4 @@ -import { isArray, isFunction, isPrimitive } from './typeChecks'; +import { isArray, isString, isFunction, isPrimitive } from './typeChecks'; const MIN = 1e-6; const MAX = 1e21; @@ -11,6 +11,12 @@ function usesScientificNotation(n) { return abs >= MAX || abs <= MIN; } +export function assertString(str) { + if (!isString(str)) { + throw new TypeError(str + ' is not a string'); + } +} + export function assertNumber(n) { if (!n && n !== 0) { throw new TypeError(n + ' is not a valid number'); diff --git a/test/.eslintrc b/test/.eslintrc index d455b2b62..61752ef1c 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -10,6 +10,7 @@ "globals": { it: true, fit: true, + xit: true, add: true, mult: true, noop: true, diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index fc85fb285..e1ed45204 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -80,42 +80,6 @@ namespace('String', function () { }); - method('encodeBase64', function() { - - test('This webpage is not available', 'VGhpcyB3ZWJwYWdlIGlzIG5vdCBhdmFpbGFibGU=', 'webpage'); - test('I grow, I prosper; Now, gods, stand up for bastards!', 'SSBncm93LCBJIHByb3NwZXI7IE5vdywgZ29kcywgc3RhbmQgdXAgZm9yIGJhc3RhcmRzIQ==', 'gods'); - test('räksmörgås', 'csOka3Ntw7ZyZ8Olcw==', 'shrimp sandwich'); - test('räksmörgÃ¥s', 'csODwqRrc23Dg8K2cmfDg8Klcw==', 'shrimp sandwich encoded'); - - test('АБВ', '0JDQkdCS', 'Russian'); - test('日本語', '5pel5pys6Kqe', 'Japanese'); - test('にほんご', '44Gr44G744KT44GU', 'Hiragana'); - test('한국어', '7ZWc6rWt7Ja0', 'Korean'); - - // Ensure that btoa and atob don't leak in node - if(environment == 'node') { - equal(typeof btoa, 'undefined', 'btoa global does not exist in node'); - equal(typeof atob, 'undefined', 'atob global does not exist in node'); - } - - }); - - method('decodeBase64', function() { - - test(run('АБВ', 'encodeBase64'), 'АБВ', 'inverse | Russian'); - test(run('日本語', 'encodeBase64'), '日本語', 'inverse | Japanese'); - test(run('にほんご', 'encodeBase64'), 'にほんご', 'inverse | Hiragana'); - test(run('한국어', 'encodeBase64'), '한국어', 'inverse | Korean'); - - test('L2hvd2FyZHNmaXJld29ya3MvYXBpL29yZGVyLzc1TU0lMjBNSVg=', '/howardsfireworks/api/order/75MM%20MIX', '%20') - - test('VGhpcyB3ZWJwYWdlIGlzIG5vdCBhdmFpbGFibGU=', 'This webpage is not available', 'webpage'); - test('SSBncm93LCBJIHByb3NwZXI7IE5vdywgZ29kcywgc3RhbmQgdXAgZm9yIGJhc3RhcmRzIQ==', 'I grow, I prosper; Now, gods, stand up for bastards!', 'gods'); - - test('@#$^#$^#@$^', '', 'non-base64 characters should produce a blank string'); - - }); - method('trimLeft', function() { test(' wasabi ', 'wasabi ', 'should trim left whitespace only'); test('', '', 'blank'); diff --git a/test/index.js b/test/index.js index fcbe5243f..df36809ea 100644 --- a/test/index.js +++ b/test/index.js @@ -21,6 +21,7 @@ import './helpers/intl'; import './tests/core'; import './tests/chainable'; import './tests/extended'; +import './tests/array'; import './tests/number'; import './tests/string'; import './tests/regexp'; diff --git a/test/tests/string.js b/test/tests/string.js index 64b3618a0..e95c5e4f2 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -805,7 +805,7 @@ namespace('String', function() { assertEqual(toNumber('22.5'), 22.5); }); - it('should handle decimals', () => { + it('should handle decimals', function() { assertEqual(toNumber('10.532'), 10.532); assertEqual(toNumber('10.848'), 10.848); assertEqual(toNumber('95.25%'), 95.25); @@ -814,31 +814,31 @@ namespace('String', function() { assertEqual(toNumber('.3'), 0.3); }); - it('should handle trailing characters', () => { + it('should handle trailing characters', function() { assertEqual(toNumber('4em'), 4); assertEqual(toNumber('10px'), 10); assertEqual(toNumber('1234blue'), 1234); }); - it('should not convert octals', () => { + it('should not convert octals', function() { assertEqual(toNumber('010'), 10); assertEqual(toNumber('0908'), 908); assertEqual(toNumber('077.3'), 77.3); }); - it('should throw away redundant decimals', () => { + it('should throw away redundant decimals', function() { assertEqual(toNumber('22.34.5'), 22.34); }); - it('should handle hex strings', () => { + it('should handle hex strings', function() { assertEqual(toNumber('0xFF'), 255); }); - it('should handle a different base', () => { + it('should handle a different base', function() { assertEqual(toNumber('FF', 16), 255); }); - it('should handle scientific notation', () => { + it('should handle scientific notation', function() { assertEqual(toNumber('1e6'), 1000000); assertEqual(toNumber('0.1e6'), 100000); }); @@ -864,13 +864,75 @@ namespace('String', function() { describeInstance('reverse', function(reverse) { - it('should handle basic input', () => { + it('should handle basic input', function() { assertEqual(reverse('spoon'), 'noops'); assertEqual(reverse('amanaplanacanalpanama'), 'amanaplanacanalpanama'); assertEqual(reverse(''), ''); assertEqual(reverse('wasabi'), 'ibasaw'); }); + it('should handle irregular input', function() { + assertEqual(reverse(null), 'llun'); + assertEqual(reverse(undefined), 'denifednu'); + assertEqual(reverse(NaN), 'NaN'); + assertEqual(reverse(800), '008'); + }); + + }); + + describeInstance('encodeBase64', function(encodeBase64) { + + it('should handle ascii input', function() { + assertEqual(encodeBase64(''), ''); + assertEqual(encodeBase64('foo'), 'Zm9v'); + assertEqual(encodeBase64('This webpage is not available'), 'VGhpcyB3ZWJwYWdlIGlzIG5vdCBhdmFpbGFibGU='); + }); + + it('should handle non-ascii input', function() { + assertEqual(encodeBase64('✓ à la mode'), '4pyTIMOgIGxhIG1vZGU='); + assertEqual(encodeBase64('räksmörgås'), 'csOka3Ntw7ZyZ8Olcw=='); + assertEqual(encodeBase64('räksmörgÃ¥s'), 'csODwqRrc23Dg8K2cmfDg8Klcw=='); + assertEqual(encodeBase64('АБВ'), '0JDQkdCS'); + assertEqual(encodeBase64('日本語'), '5pel5pys6Kqe'); + assertEqual(encodeBase64('にほんご'), '44Gr44G744KT44GU'); + assertEqual(encodeBase64('한국어'), '7ZWc6rWt7Ja0'); + }); + + it('should handle irregular input', function() { + assertEqual(encodeBase64('\n'), 'Cg=='); + assertEqual(encodeBase64(null), 'bnVsbA=='); + assertEqual(encodeBase64(NaN), 'TmFO'); + assertEqual(encodeBase64(8), 'OA=='); + }); + + }); + + describeInstance('decodeBase64', function(decodeBase64) { + + it('should handle ascii input', function() { + assertEqual(decodeBase64(''), ''); + assertEqual(decodeBase64('Zm9v'), 'foo'); + assertEqual(decodeBase64('VGhpcyB3ZWJwYWdlIGlzIG5vdCBhdmFpbGFibGU='), 'This webpage is not available'); + assertEqual(decodeBase64('L2hvd2FyZHNmaXJld29ya3MvYXBpL29yZGVyLzc1TU0lMjBNSVg='), '/howardsfireworks/api/order/75MM%20MIX') + }); + + it('should handle non-ascii input', function() { + assertEqual(decodeBase64('4pyTIMOgIGxhIG1vZGU='), '✓ à la mode'); + assertEqual(decodeBase64('csOka3Ntw7ZyZ8Olcw=='), 'räksmörgås'); + assertEqual(decodeBase64('csODwqRrc23Dg8K2cmfDg8Klcw=='), 'räksmörgÃ¥s'); + assertEqual(decodeBase64('0JDQkdCS'), 'АБВ'); + assertEqual(decodeBase64('5pel5pys6Kqe'), '日本語'); + assertEqual(decodeBase64('44Gr44G744KT44GU'), 'にほんご'); + assertEqual(decodeBase64('7ZWc6rWt7Ja0'), '한국어'); + }); + + it('should handle irregular input', function() { + assertError(function(){ decodeBase64(null); }); + assertError(function(){ decodeBase64(NaN); }); + assertError(function(){ decodeBase64(8); }); + assertError(function(){ decodeBase64('@#$^#$^#@$^'); }); + }); + }); }); From ae06bcd40d88da33ce7691885b4454b4d3558134 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 24 Jul 2020 16:20:12 +0900 Subject: [PATCH 041/191] added String#stripTags --- .prettierrc | 6 + CHANGELOG.md | 5 +- src/string/define.js | 1 + src/string/methods.js | 1 + src/string/stripTags.js | 65 ++++++ test/OLD/tests/string.js | 422 --------------------------------------- test/tests/string.js | 180 ++++++++++++++++- 7 files changed, 253 insertions(+), 427 deletions(-) create mode 100644 .prettierrc create mode 100644 src/string/stripTags.js diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..8ecb70374 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "arrowParens": "always", + "trailingComma": "es5", + "printWidth": 80 +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 9daf82a7a..eb8ee72ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,10 @@ v3.0.0 - Added `Number#trunc` Math alias. - Removed Inflections modules. Affected methods `String#camelize/underscore/spacify/titleize`. - Removed `String#format` in favor of ES6 template literals. - +- Removed `String#removeTags`. This will no longer be supported going forward. +- Removed `tag` argument from `String#stripTags`. Use the `replace` param instead + to target specific tags. +- Changed argument order of replacement function in `String#stripTags`. TODO: diff --git a/src/string/define.js b/src/string/define.js index 5bf37ca21..4815fed30 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -18,6 +18,7 @@ defineInstance('pad', methods.pad); defineInstance('parameterize', methods.parameterize); defineInstance('reverse', methods.reverse); defineInstance('spacify', methods.spacify); +defineInstance('stripTags', methods.stripTags); defineInstance('titleize', methods.titleize); defineInstance('to', methods.to); defineInstance('toNumber', methods.toNumber); diff --git a/src/string/methods.js b/src/string/methods.js index 9874c7aed..10e32c010 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -15,6 +15,7 @@ export { default as parameterize } from './parameterize'; export { default as range } from './range'; export { default as reverse } from './reverse'; export { default as spacify } from './spacify'; +export { default as stripTags } from './stripTags'; export { default as titleize } from './titleize'; export { default as to } from './to'; export { default as toNumber } from './toNumber'; diff --git a/src/string/stripTags.js b/src/string/stripTags.js new file mode 100644 index 000000000..712c3f276 --- /dev/null +++ b/src/string/stripTags.js @@ -0,0 +1,65 @@ +import coerce from './util/coerce'; +import { isString } from '../util/typeChecks'; + +const REG = /<(\/)?\s*([^\s/>]*)\s*([^<>]*?)?\s*(\/)?>/gi; + +const EMPTY_TAGS = [ + 'area', + 'base', + 'br', + 'col', + 'embed', + 'hr', + 'img', + 'input', + 'link', + 'meta', + 'param', + 'source', + 'track', + 'wbr', +]; + +/** + * Strips HTML tags from the string. + * + * @param {string} str - The string. + * @param {string|replaceFn} replace - Determines what the stripped tags will + * be replaced with. Passing a function here will allow custom behavior such + * as replacing specific tags or custom content based on tag properties. + * Default is an empty string. + * + * @callback replaceFn + * @param {string} tag - The tag name. + * @param {string} html - The full html of the stripped tag including brackets. + * @param {string} type - The tag type. One of "open", "close", or "empty". + * @param {string} attr - The attributes of the tag as a string. + * @returns {string} - The return value will replace the stripped tag. + * + * @example + * + * '

just some text

'.stripTags() -> 'just some text' + * 'bold'.stripTags(() => '*') -> '*bold*' + * '

text

'.stripTags((tag, html) => { + * return tag === 'b' ? '' : html; + * }); -> '

text

' + * + **/ +export default function stripTags(str, replace = '') { + str = coerce(str); + const replaceFn = isString(replace) ? () => replace : replace; + return str.replace(REG, (html, firstSlash, tag = '', attr = '', lastSlash) => { + const type = getType(tag, firstSlash, lastSlash); + return replaceFn(tag, html, type, attr); + }); +} + +function getType(tag, firstSlash, lastSlash) { + if (firstSlash) { + return 'close'; + } else if (lastSlash || EMPTY_TAGS.includes(tag)) { + return 'empty'; + } else { + return 'open'; + } +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index e1ed45204..3aa29b2a2 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -355,426 +355,4 @@ namespace('String', function () { test('abc', [], 'abc', 'no args'); }); - - method('stripTags', function() { - var stripped, html, allStripped, malformed; - - html = - '
' + - '

text with links, "entities" and bold tags

' + - '
'; - allStripped = 'text with links, "entities" and bold tags'; - malformed = '

paragraph'; - stripped = - '

' + - '

text with links, "entities" and bold tags

' + - '
'; - - test(html, ['a'], stripped, 'stripped a tags'); - equal(run(html, 'stripTags', ['a']) == html, false, 'stripped tags was changed'); - - - stripped = - '
' + - '

text with links, "entities" and bold tags

' + - '
'; - test(html, [['a', 'b']], stripped, 'array | stripped
and tags'); - - - stripped = - '
' + - 'text with links, "entities" and bold tags' + - '
'; - test(html, [['p', 'a']], stripped, 'array | stripped

and tags'); - - - stripped = '

text with links, "entities" and bold tags

'; - test(html, ['div'], stripped, 'stripped
tags'); - - - stripped = 'text with links, "entities" and bold tags'; - test(html, stripped, 'all tags stripped'); - - - stripped = '

paragraph'; - test(malformed, ['div'], stripped, 'malformed | div tag stripped'); - - stripped = '

paragraph'; - test(malformed, ['p'], stripped, 'malformed | p tags stripped'); - - stripped = 'paragraph'; - test(malformed, stripped, 'malformed | all tags stripped'); - - test('', ' b', 'a > b', 'does not strip greater than'); - test('>', '>', 'strips closing tags with white space'); - - - // Stipping self-closing tags - test('', '', 'full input stripped'); - test('bold and italic and link', [['b','i']], 'bold and italic and link', 'handles multi args'); - - html = - '
' + - '

' + - '' + - '' + - '' + - '

' + - '
'; - - test(html, 'label for text:', 'form | all tags removed'); - test(html, ['input'], '

', 'form | input tags stripped'); - test(html, [['input', 'p', 'form']], '', 'form | input, p, and form tags stripped'); - - // Stripping namespaced tags - test('foobar', [], 'foobar', 'strips tags with xml namespaces'); - test('foobar', ['xsl:template'], 'foobar', 'strips xsl:template'); - test('foobar', ['xsl/template'], 'foobar', 'strips xsl/template'); - - // No errors on RegExp - - test('foobar', ['xsl(template'], 'foobar', 'no regexp errors on tokens'); - test('ella', ['?'], 'ella', '? token'); - - test('', '', 'String#stripTags | blank'); - test('chilled monkey brains', 'chilled monkey brains', 'chilled monkey brains'); - - - // Self-closing - - test('', '', 'can strip image tags'); - test('', '', 'can strip image tags with no space'); - test('', '', 'can strip image tags with trailing space'); - test('', '', 'can strip void tag'); - - test('', '', 'caps | can strip image tags'); - test('', '', 'caps | can strip image tags with no space'); - test('', '', 'caps | can strip image tags with trailing space'); - test('', '', 'caps | can strip void tag'); - - test('', ['IMG'], '', 'can strip when tag name capitalized'); - - - // Other - test('some text then closing

', 'some text then closing', 'can handle final malformed closer'); - test('foo

bar

', 'foo bar ', 'two unmatched closing tags'); - - - // Issue #410 - replacing stripped tags - - test('foo', ['all', '|'], '|foo|', 'can strip with just a string'); - - var fn = function() { return 'bar'; }; - test('foo', ['all', fn], 'barfoobar', 'replaces content with result of callback'); - - var fn = function() { return ''; }; - test('foo', ['all', fn], 'foo', 'replaces content with empty string'); - - var fn = function() {}; - test('foo', ['all', fn], 'foo', 'returning undefined removes as normal'); - - var fn = function() { return 'wow'; }; - test('', ['all', fn], 'wow', 'can replace self-closing tags'); - - var fn = function() { return 'wow'; }; - test(' noway', ['all', fn], 'wow noway', 'can replace void tag'); - - var fn = function() { return 'wow'; }; - test(' noway', ['all', fn], 'wow noway', 'can replace void tag with caps'); - - var fn = function(a,b,c) { return c; }; - test('', ['all', fn], '', 'attributes should be blank'); - - var fn = function(a,b,c) { return c; }; - test('foo', ['all', fn], 'class="orange"fooclass="orange"', 'attributes should not be blank'); - - - var str = 'which way to go'; - var fn = function(tag, content, attributes, s) { - equal(tag, 'b', 'first argument should be the tag name'); - equal(content, 'way', 'second argument should be the tag content'); - equal(attributes, '', 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - return '|'; - } - test(str, ['all', fn], 'which |way| to go', 'stripped tag should be replaced'); - - var str = 'verynestedspansarewe'; - var expectedContent = [ - 'verynestedspansarewe', - 'nestedspansarewe', - 'spansarewe', - 'arewe', - 'we' - ]; - var count = 0; - var fn = function(tag, content, attributes, s) { - equal(tag, 'span', 'first argument should be the tag'); - equal(content, expectedContent[count++], 'second argument should be the content'); - equal(attributes, '', 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - return '|'; - } - test(str, ['all', fn], '|very|nested|spans|are|we|||||', 'stripped tag should be replaced'); - equal(count, 5, 'should have run 5 times'); - - var str = 'very'; - var fn = function(tag, content, attributes, s) { - return content; - } - test(str, ['all', fn], 'veryveryvery', 'replacing with content will not endlessly recurse'); - - var str = 'very'; - var fn = function(tag, content, attributes, s) { - return content; - } - test(str, ['all', fn], 'veryveryvery', 'malformed content will not infinitely recurse with replacements'); - - var str = '

paragraph with some bold text and an image cool gif, bro and thats all

'; - var expected = [ - { - tag: 'p', - content: 'paragraph with some bold text and an image cool gif, bro and thats all', - attributes: '' - }, - { - tag: 'b', - content: 'some bold text', - attributes: '' - }, - { - tag: 'img', - content: '', - attributes: 'src="http://foobar.com/a/b/c/d.gif" alt="cool gif, bro"' - } - ]; - var count = 0; - var fn = function(tag, content, attributes, s) { - var obj = expected[count++]; - equal(tag, obj.tag, 'first argument should be the tag name'); - equal(content, obj.content, 'second argument should be the tag content'); - equal(attributes, obj.attributes, 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - } - test(str, ['all', fn], 'paragraph with some bold text and an image and thats all', 'complex: all tags should be stripped'); - equal(count, 3, 'complex: should have run 3 times'); - - var str = '

paragraph with some bold text and an image cool gif, bro and thats all

'; - var fn = function(tag, content, attributes, s) { - equal(tag, 'img', 'first argument is img'); - equal(content, '', 'second argument is empty'); - equal(attributes, 'src="http://foobar.com/a/b/c/d.gif" alt="cool gif, bro"', 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - return 'not!'; - } - test(str, ['img', fn], '

paragraph with some bold text and an image not! and thats all

', 'img tag should have been replaced'); - - var str = 'one
two'; - test(str, ['div'], 'one two', 'very spaced out div tag'); - - - // Issue #467 - test('', ['i'], '', 'will not replace for '); - - }); - - - method('removeTags', function() { - var html, malformed, removed; - malformed = '

paragraph'; - - html = - '

' + - '

text with links, "entities" and bold tags

' + - '
'; - - removed = - '
' + - '

text with , "entities" and bold tags

' + - '
'; - test(html, ['a'], removed, ' tag removed'); - equal(run(html, 'removeTags', ['a']) == html, false, 'html was changed'); - - removed = - '
' + - '

text with , "entities" and tags

' + - '
'; - test(html, [['a', 'b']], removed, 'array |
and tags removed'); - - - removed = - '
'; - test(html, [['p', 'a']], removed, 'array |

and tags removed'); - - - test(html, ['div'], '', '

tags removed'); - test(html, '', 'removing all tags'); - - test(malformed, ['div'], '', 'malformed |
tags removed'); - test(malformed, ['p'], '
', 'malformed |

tags removed'); - test(malformed, '', 'malformed | all tags removed'); - - test('', ' b', 'a > b', 'greater than unaffected'); - test('>', '>', 'malformed closing tag removed'); - - // Stipping self-closing tags - test('', '', 'self-closing'); - - html = - '

' + - '

' + - '' + - '' + - '' + - '

' + - ''; - - test(html, '', 'form | removing all tags'); - test(html, ['input'], '

', 'form | removing input tags'); - test(html, [['input', 'p', 'form']], '', 'form | removing input, p, and form tags'); - - // Stripping namespaced tags - test('foobar', '', 'form | xml namespaced tags removed'); - test('foobar', ['xsl:template'], '', 'form | xsl:template removed'); - test('foobar', ['xsl/template'], '', 'form | xsl/template removed'); - test('foobar', ['xsl(template'], '', 'form | xsl(template removed'); - - test('bold and italic and
link', [['b','i']], ' and and link', 'handles multi args'); - test('', '', 'blank'); - test('chilled monkey brains', 'chilled brains', 'chilled monkey brains'); - - // No errors on regex. - test('howdyella', 'howdy', 'handles regex tokens'); - - // Self-closing - - test('', '', 'can strip image tags'); - test('', '', 'can strip image tags with no space'); - test('', '', 'can strip image tags with trailing space'); - test('', '', 'can strip void tag'); - - test('', '', 'caps | can strip image tags'); - test('', '', 'caps | can strip image tags with no space'); - test('', '', 'caps | can strip image tags with trailing space'); - test('', '', 'caps | can strip void tag'); - - test('', ['IMG'], '', 'can strip when tag name capitalized'); - - - // Other - test('some text then closing

', ' then closing', 'can handle final malformed closer'); - test('foo

bar

', 'foo bar ', 'two unmatched closing tags'); - - - // Issue #410 - replacing stripped tags - - test('foo', ['all', 'bar'], 'bar', 'can replace with just a string'); - - var fn = function() { return 'bar'; }; - test('foo', ['all', fn], 'bar', 'replaces content with result of callback'); - - var fn = function() { return ''; }; - test('foo', ['all', fn], '', 'replaces content with empty string'); - - var fn = function() {}; - test('foo', ['all', fn], '', 'returning undefined strips as normal'); - - var fn = function() { return 'wow'; }; - test('', ['all', fn], 'wow', 'can replace self-closing tags'); - - var fn = function() { return 'wow'; }; - test(' noway', ['all', fn], 'wow noway', 'can replace void tag'); - - var fn = function() { return 'wow'; }; - test(' noway', ['all', fn], 'wow noway', 'can replace void tag with caps'); - - var fn = function(a,b,c) { return c; }; - test('', ['all', fn], '', 'attributes should be blank'); - - var str = 'which way to go'; - var fn = function(tag, content, attributes, s) { - equal(tag, 'b', 'first argument should be the tag name'); - equal(content, 'way', 'second argument should be the tag content'); - equal(attributes, '', 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - } - test(str, ['all', fn], 'which to go', 'stripped tag should be replaced'); - - var str = '
fun and

run

together

'; - var fn = function(tag, content, s) { - if(tag === 'p') { - return ' ' + content; - } - } - test(str, ['p', fn], '
fun and
run together', 'can space out run-together tags'); - - var str = 'verynestedspansarewe'; - var expectedContent = [ - 'verynestedspansarewe', - 'nestedspansarewe', - 'spansarewe', - 'arewe', - 'we' - ]; - var count = 0; - var fn = function(tag, content, attributes, s) { - equal(tag, 'span', 'first argument should be the tag'); - equal(content, expectedContent[count++], 'second argument should be the content'); - equal(attributes, '', 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - return content; - } - test(str, ['all', fn], 'verynestedspansarewe', 'stripped tag should be replaced'); - equal(count, 5, 'should have run 5 times'); - - var str = 'this is a

paragraph with some bold text and an image cool gif, bro and thats all

'; - var expected = [ - { - tag: 'p', - content: 'paragraph with some bold text and an image cool gif, bro and thats all', - attributes: '' - }, - { - tag: 'b', - content: 'some bold text', - attributes: '' - }, - { - tag: 'img', - content: '', - attributes: 'src="http://foobar.com/a/b/c/d.gif" alt="cool gif, bro"' - } - ]; - var count = 0; - var fn = function(tag, content, attributes, s) { - var obj = expected[count++]; - equal(tag, obj.tag, 'first argument should be the tag name'); - equal(content, obj.content, 'second argument should be the tag content'); - equal(attributes, obj.attributes, 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - } - test(str, ['all', fn], 'this is a ', 'complex: outermost tag should be removed'); - equal(count, 1, 'complex: should have run 1 time'); - - var str = '

paragraph with some bold text and an image cool gif, bro and thats all

'; - var fn = function(tag, content, attributes, s) { - equal(tag, 'img', 'first argument is img'); - equal(content, '', 'second argument is empty'); - equal(attributes, 'src="http://foobar.com/a/b/c/d.gif" alt="cool gif, bro"', 'third argument should be the attributes'); - equal(s, str, 'fourth argument should be the string'); - return 'not!'; - } - test(str, ['img', fn], '

paragraph with some bold text and an image not! and thats all

', 'img tag should have been replaced'); - - - // Issue #467 - test('', ['i'], '', 'will not replace for '); - - }); - - }); diff --git a/test/tests/string.js b/test/tests/string.js index e95c5e4f2..1bab0977e 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -260,7 +260,7 @@ namespace('String', function() { assertEqual(truncate(str, -100, 'left'), '...'); }); - it('should should truncate from the middle', function() { + it('should truncate from the middle', function() { assertEqual(truncate(str, 21, 'middle'), 'Gotta be an... sentence.'); assertEqual(truncate(str, 11, 'middle'), 'Gotta ...ence.'); assertEqual(truncate(str, 4, 'middle'), 'Go...e.'); @@ -357,7 +357,7 @@ namespace('String', function() { assertEqual(truncateOnWord(str, 0, 'middle'), '...'); }); - it('should should break on non-space punctuation', function() { + it('should break on non-space punctuation', function() { assertEqual(truncateOnWord('a,short,string', 8), 'a,short...'); assertEqual(truncateOnWord('a|short|string', 8), 'a|short...'); assertEqual(truncateOnWord('a?short?string', 8), 'a?short...'); @@ -365,7 +365,7 @@ namespace('String', function() { assertEqual(truncateOnWord('a¿short¿string', 8), 'a¿short...'); }); - it('should should break on non-standard whitespace', function() { + it('should break on non-standard whitespace', function() { assertEqual(truncateOnWord('a short string', 8), 'a short...'); }); @@ -516,7 +516,7 @@ namespace('String', function() { describeInstance('spacify', function(spacify) { - it('should should handle basic input', function() { + it('should handle basic input', function() { assertEqual(spacify('hopOnPop'), 'hop on pop'); assertEqual(spacify('HopOnPop'), 'hop on pop'); assertEqual(spacify('HOPONPOP'), 'hoponpop'); @@ -935,4 +935,176 @@ namespace('String', function() { }); + describeInstance('stripTags', function(stripTags) { + + it('should work on basic tags', function() { + assertEqual(stripTags('

text

'), 'text'); + assertEqual(stripTags('text'), 'text'); + assertEqual(stripTags(''), 'text'); + }); + + it('should preserve empty space', function() { + assertEqual(stripTags('

text

'), ' text '); + assertEqual(stripTags('

text

'), ' text '); + assertEqual(stripTags('\n

\ntext\n

\n'), '\n\ntext\n\n'); + }); + + it('should handle self-closing tags', function() { + assertEqual(stripTags(''), ''); + assertEqual(stripTags('foobar'), 'foobar'); + }); + + it('should handle emtpy tags', function() { + assertEqual(stripTags(''), ''); + assertEqual(stripTags('foobar'), 'foobar'); + assertEqual(stripTags(''), ''); + }); + + it('should handle attributes', function() { + assertEqual(stripTags('

'), ''); + assertEqual(stripTags('foo

bar'), 'foobar'); + assertEqual(stripTags(''), ''); + }); + + it('should not work on malformed html without brackets', function() { + assertEqual(stripTags('

'), 'p id="id" foobar>'); + }); + + it('should work on malformed html with brackets', function() { + assertEqual(stripTags('< p>'), ''); + assertEqual(stripTags('

'), ''); + assertEqual(stripTags('< / p / >'), ''); + assertEqual(stripTags(''), ''); + assertEqual(stripTags(''), '>'), '>'); + }); + + it('should ignore entities', function() { + assertEqual(stripTags('"'), '"'); + assertEqual(stripTags('

"

'), '"'); + }); + + it('should handle namespaced xml tags', function() { + assertEqual(stripTags('text'), 'text'); + assertEqual(stripTags('text'), 'text'); + }); + + it('should handle nested html', function() { + assertEqual(stripTags('

text

'), 'text'); + assertEqual(stripTags('

one two three

'), 'one two three'); + assertEqual(stripTags('
1

2

3

4'), '1 2 3 4'); + }); + + it('should handle slashes in attributes', function() { + assertEqual(stripTags('links'), 'links'); + assertEqual(stripTags(''), ''); + }); + + it('should handle upper case', function() { + assertEqual(stripTags('

text

'), 'text'); + assertEqual(stripTags('text'), 'text'); + }); + + it('should replace with string argument', function() { + assertEqual(stripTags('

text

', '|'), '|text|'); + assertEqual(stripTags('

text

', '|'), ' |text| '); + assertEqual(stripTags('

text

', '|'), '||text||'); + assertEqual(stripTags('', 'hi'), 'hi'); + assertEqual(stripTags('', 'hi'), 'hi'); + }); + + it('should replace with function argument', function() { + assertEqual(stripTags('

text

', (tag) => tag.toUpperCase()), 'PtextP'); + assertEqual(stripTags('

text

', (tag) => { + return tag === 'span' ? '*' : '\n'; + }), '\n*text*\n'); + }); + + it('should have correct arguments in replace function', function() { + stripTags('

', (tag, html, type, attr) => { + assertEqual(tag, 'p'); + assertEqual(html, '

'); + assertEqual(type, 'open'); + assertEqual(attr, 'id="id" class="class"'); + }); + stripTags('

', (tag, html, type, attr) => { + assertEqual(tag, 'p'); + assertEqual(html, '

'); + assertEqual(type, 'close'); + assertEqual(attr, ''); + }); + stripTags('', (tag, html, type, attr) => { + assertEqual(tag, 'img'); + assertEqual(html, ''); + assertEqual(type, 'empty'); + assertEqual(attr, 'src="src"'); + }); + stripTags('', (tag, html, type, attr) => { + assertEqual(tag, 'meta'); + assertEqual(html, ''); + assertEqual(type, 'empty'); + assertEqual(attr, 'charset="utf-8"'); + }); + stripTags('', (tag, html, type, attr) => { + assertEqual(tag, 'xsl:template'); + assertEqual(html, ''); + assertEqual(type, 'open'); + assertEqual(attr, ''); + }); + stripTags('', (tag, html, type, attr) => { + assertEqual(tag, ''); + assertEqual(html, ''); + assertEqual(type, 'close'); + assertEqual(attr, ''); + }); + }); + + it('should handle complicated nested html', function() { + const html = [ + '
', + '

', + ' ', + ' ', + ' ', + ' ', + '

', + '
', + ].join('\n'); + const expected = [ + '', + ' ', + ' label:', + ' ', + ' ', + ' Submit', + ' ', + '', + ].join('\n'); + assertEqual(stripTags(html), expected); + }); + + + it('should work on irregular input', function() { + assertEqual(stripTags(), 'undefined'); + assertEqual(stripTags(''), ''); + assertEqual(stripTags(null), 'null'); + assertEqual(stripTags(8), '8'); + }); + + it('should handle raised issues', function() { + + // Issue #410 - replacing stripped tags + assertEqual(stripTags('text', function() { + return ' '; + }), ' text '); + + // Issue #467 - targeting i vs img + assertEqual(stripTags('', function(tag, html) { + return tag === 'i' ? '' : html; + }), ''); + }); + + }); + }); From 3f67f931420795354c1a5740bfe42c984267ee4e Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 24 Jul 2020 16:35:00 +0900 Subject: [PATCH 042/191] Added String#remove --- CHANGELOG.md | 1 + src/string/define.js | 1 + src/string/methods.js | 1 + src/string/remove.js | 23 +++++++++++++++++++++++ test/OLD/tests/string.js | 26 -------------------------- test/tests/string.js | 28 ++++++++++++++++++++++++++++ 6 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 src/string/remove.js diff --git a/CHANGELOG.md b/CHANGELOG.md index eb8ee72ae..d33e62b2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ v3.0.0 - Removed `tag` argument from `String#stripTags`. Use the `replace` param instead to target specific tags. - Changed argument order of replacement function in `String#stripTags`. +- Removed `String#removeAll`. Simply use a global regex here instead. TODO: diff --git a/src/string/define.js b/src/string/define.js index 4815fed30..d4b76bf52 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -16,6 +16,7 @@ defineInstance('isEmpty', methods.isEmpty); defineInstance('last', methods.last); defineInstance('pad', methods.pad); defineInstance('parameterize', methods.parameterize); +defineInstance('remove', methods.remove); defineInstance('reverse', methods.reverse); defineInstance('spacify', methods.spacify); defineInstance('stripTags', methods.stripTags); diff --git a/src/string/methods.js b/src/string/methods.js index 10e32c010..74caa97b9 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -13,6 +13,7 @@ export { default as last } from './last'; export { default as pad } from './pad'; export { default as parameterize } from './parameterize'; export { default as range } from './range'; +export { default as remove } from './remove'; export { default as reverse } from './reverse'; export { default as spacify } from './spacify'; export { default as stripTags } from './stripTags'; diff --git a/src/string/remove.js b/src/string/remove.js new file mode 100644 index 000000000..f933bcb3e --- /dev/null +++ b/src/string/remove.js @@ -0,0 +1,23 @@ +import coerce from './util/coerce'; + +/** + * Removes a substring from the string. + * + * @extra This method is simply an alias for `str.replace(find, '')` to better + * communicate intent. + * + * @param {string} str - The string. + * @param {string|RegExp} find - A substring or regex to target the substring + * to be removed. When this is a string or non-global regex only the first + * occurrence will be removed. + * + * @example + * + * 'foobar'.remove('o') -> 'fobar' + * 'foobar'.remove(/[a-f]/g) -> 'foor' + * + **/ +export default function remove(str, find) { + str = coerce(str); + return str.replace(find, ''); +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 3aa29b2a2..6745295e0 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -307,32 +307,6 @@ namespace('String', function () { test('b', ['-', 1], 'b-', 'b inserted at 1'); }); - method('remove', function() { - test('schfifty five', ['fi'], 'schfty five', 'should remove first fi only'); - test('schfifty five', ['five'], 'schfifty ', 'should remove five'); - test('schfifty five', [/five/], 'schfifty ', 'basic regex'); - test('schfifty five', [/f/], 'schifty five', 'single char regex'); - test('schfifty five', [/f/g], 'schity ive', 'respects global flag'); - test('schfifty five', [/[a-f]/g], 'shity iv', 'character class'); - test('?', ['?'], '', 'strings have tokens escaped'); - test('?(', ['?('], '', 'strings have all tokens escaped'); - test('schfifty five', ['F'], 'schfifty five', 'should be case sensitive'); - test('schfifty five', [], 'schfifty five', 'no args'); - }); - - method('removeAll', function() { - test('schfifty five', ['fi'], 'schfty ve', 'should remove all fi'); - test('schfifty five', ['five'], 'schfifty ', 'should remove five'); - test('schfifty five', [/five/], 'schfifty ', 'basic regex'); - test('schfifty five', [/f/], 'schity ive', 'single char regex replaces all'); - test('schfifty five', [/f/g], 'schity ive', 'global regex replaces all'); - test('schfifty five', [/[a-f]/g], 'shity iv', 'character class'); - test('?', ['?'], '', 'strings have tokens escaped'); - test('?(', ['?('], '', 'strings have all tokens escaped'); - test('schfifty five', ['F'], 'schfifty five', 'should be case sensitive'); - test('schfifty five', [], 'schfifty five', 'no args'); - }); - method('replaceAll', function() { test('-x -y -z', ['-', 1, 2, 3], '1x 2y 3z', 'basic'); test('-x -y -z', ['-'], 'x y z', 'no args'); diff --git a/test/tests/string.js b/test/tests/string.js index 1bab0977e..85e898fd4 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -1107,4 +1107,32 @@ namespace('String', function() { }); + describeInstance('remove', function(remove) { + + it('should remove with a string', () => { + assertEqual(remove('schfifty five', 'fi'), 'schfty five'); + assertEqual(remove('schfifty five', 'five'), 'schfifty '); + assertEqual(remove('?', '?'), ''); + assertEqual(remove('?(', '?('), ''); + }); + + it('should remove with a regex', () => { + assertEqual(remove('schfifty five', /five/), 'schfifty '); + assertEqual(remove('schfifty five', /f/), 'schifty five'); + assertEqual(remove('schfifty five', /f/g), 'schity ive'); + assertEqual(remove('schfifty five', /[a-f]/g), 'shity iv'); + }); + + it('should be case sensitive', () => { + assertEqual(remove('schfifty five', 'F'), 'schfifty five'); + }); + + it('should handle irregular input', () => { + assertEqual(remove('schfifty five'), 'schfifty five'); + assertEqual(remove('schfifty five', null), 'schfifty five'); + assertEqual(remove('schfifty five', 800), 'schfifty five'); + }); + + }); + }); From d7d4fc1f93249f61b4e55d6dc5ed3f5dad0b2e76 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 24 Jul 2020 17:01:23 +0900 Subject: [PATCH 043/191] Added String#replaceWith --- CHANGELOG.md | 37 +++++++++++++++++--------- src/string/define.js | 1 + src/string/methods.js | 1 + src/string/replaceWith.js | 33 +++++++++++++++++++++++ test/OLD/tests/string.js | 22 --------------- test/tests/string.js | 56 ++++++++++++++++++++++++++++++++++++--- 6 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 src/string/replaceWith.js diff --git a/CHANGELOG.md b/CHANGELOG.md index d33e62b2f..9fb1af6a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,16 @@ v3.0.0 - Removed `String#includes` with RegExp support. - Removed ability to extend Object.prototype - Removed support for bower. -- Removed `String#padLeft` and `String#padRight` in favor of native `String#padStart` and `String#padEnd`. -- Removed `String#trimLeft` and `String#trimRight` in favor of native `String#trimStart` and `String#trimEnd`. -- `String#pad` will now place equal padding on either side, reducing the target length by 1 for odd lengths. -- `String#pad` now internally uses `String#padStart` and `String#padEnd`, and will throw the same input errors. -- Added `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and `Number#isSafeInteger`. +- Removed `String#padLeft` and `String#padRight` in favor of native + `String#padStart` and `String#padEnd`. +- Removed `String#trimLeft` and `String#trimRight` in favor of native + `String#trimStart` and `String#trimEnd`. +- `String#pad` will now place equal padding on either side, reducing the target + length by 1 for odd lengths. +- `String#pad` now internally uses `String#padStart` and `String#padEnd`, and + will throw the same input errors. +- Added `Number#isNaN`, `Number#isFinite`, `Number#isInteger`, and + `Number#isSafeInteger`. - Renamed `Number#chr` to `Number#toChar`. - Renamed `Number#ordinalize` to `Number#toOrdinal`. - Removed `Number#toNumber`. @@ -25,20 +30,27 @@ v3.0.0 - Changed `Number#upto` to always iterate from min to max. - Changed `Number#downto` to always iterate from max to min. - Changed `Number#times` to collects all return values including undefined. -- Changed `Number#times` to error on any input that is not a positive finite integer. -- Changed `Number#format` to no longer support thousands or decimal separtors. Use Intl for this. -- Removed `RegExp#getFlags`, `RegExp#setFlags`, `RegExp#addFlags` and `RegExp#removeFlags`. +- Changed `Number#times` to error on any input that is not a positive finite + integer. +- Changed `Number#format` to no longer support thousands or decimal separtors. + Use Intl for this. +- Removed `RegExp#getFlags`, `RegExp#setFlags`, `RegExp#addFlags` and + `RegExp#removeFlags`. - Removed `Function#memoize` ability to deeply serialize all arguments. -- Removed Math aliases `Number#sin/asin/cos/acos/tan/atan/exp` in favor of directly using `Math`. +- Removed Math aliases `Number#sin/asin/cos/acos/tan/atan/exp` in favor of + directly using `Math`. `Number#round/floor/ceil/abs/sqrt/pow` aliases are retained. - Added `Number#trunc` Math alias. -- Removed Inflections modules. Affected methods `String#camelize/underscore/spacify/titleize`. +- Removed Inflections modules. Affected methods: + `String#camelize/underscore/spacify/titleize`. - Removed `String#format` in favor of ES6 template literals. - Removed `String#removeTags`. This will no longer be supported going forward. -- Removed `tag` argument from `String#stripTags`. Use the `replace` param instead - to target specific tags. +- Removed `tag` argument from `String#stripTags`. Use the `replace` param + instead to target specific tags. - Changed argument order of replacement function in `String#stripTags`. - Removed `String#removeAll`. Simply use a global regex here instead. +- Renamed `String#replaceAll` to `String#replaceWith` to avoid naming conflict. + Also no longer coerces non-global regexes to be global. TODO: @@ -47,7 +59,6 @@ TODO: - Array#flat/Array#flatMap - String#matchAll - does it do what Sugar methods already do? - Object.is implications? -- String#replaceAll? - Math.random with seed? v2.0.5 diff --git a/src/string/define.js b/src/string/define.js index d4b76bf52..78cc5b493 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -17,6 +17,7 @@ defineInstance('last', methods.last); defineInstance('pad', methods.pad); defineInstance('parameterize', methods.parameterize); defineInstance('remove', methods.remove); +defineInstance('replaceWith', methods.replaceWith); defineInstance('reverse', methods.reverse); defineInstance('spacify', methods.spacify); defineInstance('stripTags', methods.stripTags); diff --git a/src/string/methods.js b/src/string/methods.js index 74caa97b9..86b711d5a 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -14,6 +14,7 @@ export { default as pad } from './pad'; export { default as parameterize } from './parameterize'; export { default as range } from './range'; export { default as remove } from './remove'; +export { default as replaceWith } from './replaceWith'; export { default as reverse } from './reverse'; export { default as spacify } from './spacify'; export { default as stripTags } from './stripTags'; diff --git a/src/string/replaceWith.js b/src/string/replaceWith.js new file mode 100644 index 000000000..cc1f750a8 --- /dev/null +++ b/src/string/replaceWith.js @@ -0,0 +1,33 @@ +import coerce from './util/coerce'; +import { isRegExp } from '../util/typeChecks'; +import { escapeRegExp } from '../util/regexp'; + +/** + * Replaces multiple occurrences of a substring with fixed arguments. + * + * @param {string} str - The string. + * @param {string|RegExp} find - A substring or regex to target the substring + * to be replaced. When this is a string all occurences of the substring will + * be replaced. This notably differs from `String#replace` behavior. If a + * regex is passed here it should be global. + * @param {...string} - Remaining string arguments will be used as positional + * replacements. If there are more occurrences of the substring than there + * are arguments, the last argument passed will be used. + * + * @example + * + * '-x -y -z'.replaceWith('-', 1, 2, 3) -> '1x 2y 3z' + * '-x -y -z'.replaceWith('-', 1, 2) -> '1x 2y 2z' + * 'one and two'.replaceWith(/one|two/g, '1st', '2nd') -> '1st and 2nd' + * + **/ +export default function replaceWith(str, find, ...args) { + str = coerce(str); + if (!isRegExp(find)) { + find = RegExp(escapeRegExp(find), 'g'); + } + let count = 0; + return str.replace(find, () => { + return args[Math.min(count++, args.length - 1)] ?? ''; + }); +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 6745295e0..d7f480d9b 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -307,26 +307,4 @@ namespace('String', function () { test('b', ['-', 1], 'b-', 'b inserted at 1'); }); - method('replaceAll', function() { - test('-x -y -z', ['-', 1, 2, 3], '1x 2y 3z', 'basic'); - test('-x -y -z', ['-'], 'x y z', 'no args'); - test('-x -y -z', ['-', 1, 2], '1x 2y z', 'not enough args'); - test('-x -y -z', ['-', 1, 2, 3, 4], '1x 2y 3z', 'too many args'); - test('-x -y -z', ['-', 1, 0, 3], '1x 0y 3z', 'arg can be 0'); - test('-x -y -z', ['-', 1, null, 3], '1x y 3z', 'null arg will be blank'); - test('-x -y -z', ['-', 1, undefined, 3], '1x y 3z', 'undefined will be blank'); - test('-x -y -z', ['-', 1, NaN, 3], '1x NaNy 3z', 'NaN is stringifiable'); - - test('a', [/a/, 'hi'], 'hi', 'basic regex'); - test('aaa', [/a/g,'b','c','d'], 'bcd', 'global regex'); - test('aaa', [/a/,'b','c','d'], 'bcd', 'non-global regex still matches all'); - test('a1 b2', [/a|b/, 'x', 'y'], 'x1 y2', 'alternator'); - - test('a', ['A', 'b'], 'a', 'should be case sensitive'); - test('?', ['?', 'a'], 'a', 'strings have tokens escaped'); - test('?(', ['?(', 'b'], 'b', 'strings have all tokens escaped'); - - test('abc', [], 'abc', 'no args'); - }); - }); diff --git a/test/tests/string.js b/test/tests/string.js index 85e898fd4..9006721c6 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -1109,25 +1109,25 @@ namespace('String', function() { describeInstance('remove', function(remove) { - it('should remove with a string', () => { + it('should remove with a string', function() { assertEqual(remove('schfifty five', 'fi'), 'schfty five'); assertEqual(remove('schfifty five', 'five'), 'schfifty '); assertEqual(remove('?', '?'), ''); assertEqual(remove('?(', '?('), ''); }); - it('should remove with a regex', () => { + it('should remove with a regex', function() { assertEqual(remove('schfifty five', /five/), 'schfifty '); assertEqual(remove('schfifty five', /f/), 'schifty five'); assertEqual(remove('schfifty five', /f/g), 'schity ive'); assertEqual(remove('schfifty five', /[a-f]/g), 'shity iv'); }); - it('should be case sensitive', () => { + it('should be case sensitive', function() { assertEqual(remove('schfifty five', 'F'), 'schfifty five'); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(remove('schfifty five'), 'schfifty five'); assertEqual(remove('schfifty five', null), 'schfifty five'); assertEqual(remove('schfifty five', 800), 'schfifty five'); @@ -1135,4 +1135,52 @@ namespace('String', function() { }); + describeInstance('replaceWith', function(replaceWith) { + + it('should handle basic input', function() { + assertEqual(replaceWith('-x -y -z', '-', 1, 2, 3), '1x 2y 3z'); + assertEqual(replaceWith('-x -y -z', '-', 1, 0, 3), '1x 0y 3z'); + assertEqual(replaceWith('-x -y -z', '-', 'a', 'b', 'c'), 'ax by cz'); + }); + + it('should handle regex input', function() { + assertEqual(replaceWith('a', /a/, 'hi'), 'hi'); + assertEqual(replaceWith('aaa', /a/g, 'b', 'c', 'd'), 'bcd'); + assertEqual(replaceWith('a1 b2', /a|b/g, 'x', 'y'), 'x1 y2'); + }); + + it('should not replace regexp with global flag', function() { + assertEqual(replaceWith('aaa', /a/, 'b', 'c', 'd'), 'baa'); + }); + + it('should use last argument when not enough', function() { + assertEqual(replaceWith('-x -y -z', '-', 1), '1x 1y 1z'); + assertEqual(replaceWith('-x -y -z', '-', 1, 2), '1x 2y 2z'); + }); + + it('should not use arguments when too many', function() { + assertEqual(replaceWith('-x -y -z', '-', 1, 2, 3, 4), '1x 2y 3z'); + }); + + it('should allow regex tokens', function() { + assertEqual(replaceWith('?x ?y ?z', '?', 1), '1x 1y 1z'); + assertEqual(replaceWith('-x -y -z', '-', '?'), '?x ?y ?z'); + }); + + it('should be case sensitive', function() { + assertEqual(replaceWith('a', 'A', 'b'), 'a'); + }); + + it('should handle irregular input', function() { + assertEqual(replaceWith('-x -y -z'), '-x -y -z'); + assertEqual(replaceWith('-x -y -z', null), '-x -y -z'); + assertEqual(replaceWith('-x -y -z', 8), '-x -y -z'); + assertEqual(replaceWith('-x -y -z', '-'), 'x y z'); + assertEqual(replaceWith('-x -y -z', '-', 1, null, 3), '1x y 3z'); + assertEqual(replaceWith('-x -y -z', '-', 1, undefined, 3), '1x y 3z'); + assertEqual(replaceWith('-x -y -z', '-', 1, NaN, 3), '1x NaNy 3z'); + }); + + }); + }); From dc01851eb22cf7efb2da8c7c7d4cab04a5959e1a Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 24 Jul 2020 17:02:09 +0900 Subject: [PATCH 044/191] removed trimLeft/Right tests --- test/OLD/tests/string.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index d7f480d9b..a18039640 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -79,23 +79,6 @@ namespace('String', function () { test(' ', ' ', 'non-breaking space'); }); - - method('trimLeft', function() { - test(' wasabi ', 'wasabi ', 'should trim left whitespace only'); - test('', '', 'blank'); - test(' wasabi ', 'wasabi ', 'wasabi with whitespace'); - test(whiteSpace, '', 'should trim all WhiteSpace characters defined in 7.2 and Unicode "space, separator"'); - test(lineTerminators, '', 'should trim all LineTerminator characters defined in 7.3'); - }); - - method('trimRight', function() { - test(' wasabi ', ' wasabi', 'should trim right whitespace only'); - test('', '', 'blank'); - test(' wasabi ', ' wasabi', 'wasabi with whitespace'); - test(whiteSpace, '', 'should trim all WhiteSpace characters defined in 7.2 and Unicode "space, separator"'); - test(lineTerminators, '', 'should trim all LineTerminator characters defined in 7.3'); - }); - method('shift', function() { test('ク', [1], 'グ', 'should shift 1 code up'); From 0d03d5106325fc3fe3a47ff3406902146f817268 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 24 Jul 2020 17:48:59 +0900 Subject: [PATCH 045/191] Added String#insert --- src/string/define.js | 1 + src/string/insert.js | 23 +++++++++++++++++++++ src/string/methods.js | 1 + src/string/replaceWith.js | 3 ++- src/util/lang.js | 8 ++++++++ test/OLD/tests/string.js | 20 ------------------ test/tests/string.js | 43 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 78 insertions(+), 21 deletions(-) create mode 100644 src/string/insert.js create mode 100644 src/util/lang.js diff --git a/src/string/define.js b/src/string/define.js index 78cc5b493..14cc57080 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -11,6 +11,7 @@ defineInstance('decodeBase64', methods.decodeBase64); defineInstance('encodeBase64', methods.encodeBase64); defineInstance('first', methods.first); defineInstance('from', methods.from); +defineInstance('insert', methods.insert); defineInstance('isBlank', methods.isBlank); defineInstance('isEmpty', methods.isEmpty); defineInstance('last', methods.last); diff --git a/src/string/insert.js b/src/string/insert.js new file mode 100644 index 000000000..33cd99bcb --- /dev/null +++ b/src/string/insert.js @@ -0,0 +1,23 @@ +import coerce from './util/coerce'; +import { coalesceNull } from '../util/lang'; + +/** + * Inserts a substring within a string. + * + * @param {string} str - The string. + * @param {string} substr - The substring to be inserted. + * @param {number} [index] - The index to insert the string at. When negative + * will insert from the end of the string. When omitted will concat to the + * end of the string. + * + * @example + * + * 'dopamine'.insert('e', 3) -> dopeamine + * 'spelling eror'.insert('r', -3) -> spelling error + * + **/ +export default function insert(str, substr = '', index) { + str = coerce(str); + index = coalesceNull(index, str.length); + return str.slice(0, index) + substr + str.slice(index); +} diff --git a/src/string/methods.js b/src/string/methods.js index 86b711d5a..708ce64dc 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -7,6 +7,7 @@ export { default as decodeBase64 } from './decodeBase64'; export { default as encodeBase64 } from './encodeBase64'; export { default as first } from './first'; export { default as from } from './from'; +export { default as insert } from './insert'; export { default as isBlank } from './isBlank'; export { default as isEmpty } from './isEmpty'; export { default as last } from './last'; diff --git a/src/string/replaceWith.js b/src/string/replaceWith.js index cc1f750a8..f8f49f22c 100644 --- a/src/string/replaceWith.js +++ b/src/string/replaceWith.js @@ -1,6 +1,7 @@ import coerce from './util/coerce'; import { isRegExp } from '../util/typeChecks'; import { escapeRegExp } from '../util/regexp'; +import { coalesceNull } from '../util/lang'; /** * Replaces multiple occurrences of a substring with fixed arguments. @@ -28,6 +29,6 @@ export default function replaceWith(str, find, ...args) { } let count = 0; return str.replace(find, () => { - return args[Math.min(count++, args.length - 1)] ?? ''; + return coalesceNull(args[Math.min(count++, args.length - 1)], ''); }); } diff --git a/src/util/lang.js b/src/util/lang.js new file mode 100644 index 000000000..4f6982fa3 --- /dev/null +++ b/src/util/lang.js @@ -0,0 +1,8 @@ +// The null coalescing operator breaks node tests +// due to an issue with esm so exporting a util +// here until we can use it: +// +// https://github.com/standard-things/esm/issues/866 +export function coalesceNull(val, fallback) { + return val != null ? val : fallback; +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index a18039640..f621cf41f 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -270,24 +270,4 @@ namespace('String', function () { test('', [], 'empty string'); }); - method('insert', function() { - test('schfifty', [' five'], 'schfifty five', 'schfifty five'); - test('dopamine', ['e', 3], 'dopeamine', 'dopeamine'); - test('spelling eror', ['r', -3], 'spelling error', 'inserts from the end'); - test('flack', ['a', 0], 'aflack', 'inserts at 0'); - test('five', ['schfifty', 20], 'fiveschfifty', 'adds out of positive range'); - test('five', ['schfifty', -20], 'schfiftyfive', 'adds out of negative range'); - test('five', ['schfifty', 4], 'fiveschfifty', 'inserts at position 4'); - test('five', ['schfifty', 5], 'fiveschfifty', 'inserts at position 5'); - test('abcd', ['X', 2], 'abXcd', 'X | 2'); - test('abcd', ['X', 1], 'aXbcd', 'X | 1'); - test('abcd', ['X', 0], 'Xabcd', 'X | 0'); - test('abcd', ['X', -1], 'abcXd', 'X | -1'); - test('abcd', ['X', -2], 'abXcd', 'X | -2'); - - test('', ['-', 0], '-', '- inserted at 0'); - test('b', ['-', 0], '-b', 'b inserted at 0'); - test('b', ['-', 1], 'b-', 'b inserted at 1'); - }); - }); diff --git a/test/tests/string.js b/test/tests/string.js index 9006721c6..87086b66f 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -1183,4 +1183,47 @@ namespace('String', function() { }); + describeInstance('insert', function(insert) { + + it('should handle basic input', function() { + assertEqual(insert('schfifty', ' five'), 'schfifty five'); + assertEqual(insert('dopamine', 'e', 3), 'dopeamine'); + assertEqual(insert('five', 'schfifty', 4), 'fiveschfifty'); + assertEqual(insert('five', 'schfifty', 5), 'fiveschfifty'); + assertEqual(insert('abcd', 'X', 2), 'abXcd'); + assertEqual(insert('abcd', 'X', 1), 'aXbcd'); + assertEqual(insert('abcd', 'X', -1), 'abcXd'); + assertEqual(insert('abcd', 'X', -2), 'abXcd'); + }); + + it('should handle negative indexes', function() { + assertEqual(insert('spelling eror', 'r', -3), 'spelling error'); + }); + + it('should handle 0 and -0', function() { + assertEqual(insert('abcd', 'X', 0), 'Xabcd'); + assertEqual(insert('abcd', 'X', -0), 'Xabcd'); + }); + + it('should not go past string edges', function() { + assertEqual(insert('five', 'schfifty', 20), 'fiveschfifty'); + assertEqual(insert('five', 'schfifty', -20), 'schfiftyfive'); + }); + + it('should handle empty and short strings', function() { + assertEqual(insert('', '-', 0), '-'); + assertEqual(insert('b', '--', 0), '--b'); + assertEqual(insert('b', '--', 1), 'b--'); + }); + + it('should handle irregular input', function() { + assertEqual(insert(null, '-'), 'null-'); + assertEqual(insert(NaN, '-'), 'NaN-'); + assertEqual(insert(8, '-'), '8-'); + assertEqual(insert('', null), 'null'); + assertEqual(insert('', 'a', null), 'a'); + }); + + }); + }); From 62475b9bc9271e8034134dcbe6501ed75b448f9b Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 25 Jul 2020 06:50:51 +0900 Subject: [PATCH 046/191] Added String#escapeHtml and String#unescapeHtml. --- CHANGELOG.md | 6 ++- src/string/define.js | 2 + src/string/escapeHtml.js | 27 ++++++++++++ src/string/methods.js | 2 + src/string/unescapeHtml.js | 30 +++++++++++++ test/OLD/tests/string.js | 28 ------------ test/tests/string.js | 89 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 154 insertions(+), 30 deletions(-) create mode 100644 src/string/escapeHtml.js create mode 100644 src/string/unescapeHtml.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fb1af6a3..5dbef09e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,15 +51,17 @@ v3.0.0 - Removed `String#removeAll`. Simply use a global regex here instead. - Renamed `String#replaceAll` to `String#replaceWith` to avoid naming conflict. Also no longer coerces non-global regexes to be global. +- Renamed `String#escapeHTML` to `String#escapeHtml`. +- Renamed `String#unescapeHTML` to `String#unescapeHtml`. TODO: -- DOCUMENT CHANGES TO EXTEND API +- Consider asserting types instead of coercion?? - Object.values / Object.entries? - Array#flat/Array#flatMap -- String#matchAll - does it do what Sugar methods already do? - Object.is implications? - Math.random with seed? +- DOCUMENT CHANGES TO EXTEND API v2.0.5 ====== diff --git a/src/string/define.js b/src/string/define.js index 14cc57080..b057b3685 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -9,6 +9,7 @@ defineInstance('compact', methods.compact); defineInstance('dasherize', methods.dasherize); defineInstance('decodeBase64', methods.decodeBase64); defineInstance('encodeBase64', methods.encodeBase64); +defineInstance('escapeHtml', methods.escapeHtml); defineInstance('first', methods.first); defineInstance('from', methods.from); defineInstance('insert', methods.insert); @@ -28,3 +29,4 @@ defineInstance('toNumber', methods.toNumber); defineInstance('truncate', methods.truncate); defineInstance('truncateOnWord', methods.truncateOnWord); defineInstance('underscore', methods.underscore); +defineInstance('unescapeHtml', methods.unescapeHtml); diff --git a/src/string/escapeHtml.js b/src/string/escapeHtml.js new file mode 100644 index 000000000..fc25b838c --- /dev/null +++ b/src/string/escapeHtml.js @@ -0,0 +1,27 @@ +import coerce from './util/coerce'; + +const REG = /[&<>]/g; + +const MAP = { + '<': 'lt', + '>': 'gt', + '&': 'amp', +}; + +/** + * Converts HTML tags and ampersands to entities. + * + * @param {string} str - The string. + * + * @example + * + * '

some text

'.escapeHTML() -> '<p>some text</p>' + * 'one & two'.escapeHTML() -> 'one & two' + * + **/ +export default function escapeHtml(str = '') { + str = coerce(str); + return str.replace(REG, function(chr) { + return `&${MAP[chr]};`; + }); +} diff --git a/src/string/methods.js b/src/string/methods.js index 708ce64dc..cea6a1523 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -5,6 +5,7 @@ export { default as compact } from './compact'; export { default as dasherize } from './dasherize'; export { default as decodeBase64 } from './decodeBase64'; export { default as encodeBase64 } from './encodeBase64'; +export { default as escapeHtml } from './escapeHtml'; export { default as first } from './first'; export { default as from } from './from'; export { default as insert } from './insert'; @@ -25,3 +26,4 @@ export { default as toNumber } from './toNumber'; export { default as truncate } from './truncate'; export { default as truncateOnWord } from './truncateOnWord'; export { default as underscore } from './underscore'; +export { default as unescapeHtml } from './unescapeHtml'; diff --git a/src/string/unescapeHtml.js b/src/string/unescapeHtml.js new file mode 100644 index 000000000..56d295667 --- /dev/null +++ b/src/string/unescapeHtml.js @@ -0,0 +1,30 @@ +import coerce from './util/coerce'; + +const REG = /&#?(x)?([\w\d]{0,5});/gi; + +const MAP = { + 'lt': '<', + 'gt': '>', + 'amp': '&', + 'nbsp': ' ', + 'quot': '"', + 'apos': "'" +}; + +/** + * Restores escaped HTML characters. + * + * @param {string} str - The string. + * + * @example + * + * '<p>some text</p>'.unescapeHTML() -> '

some text

' + * 'one & two'.unescapeHTML() -> 'one & two' + * + **/ +export default function unescapeHTML(str = '') { + str = coerce(str); + return str.replace(REG, function(full, hex, code) { + return MAP[code] || String.fromCharCode(hex ? parseInt(code, 16) : +code); + }); +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index f621cf41f..c253c6b02 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -51,34 +51,6 @@ namespace('String', function () { raisesError(function() { run('% 23'); }, 'should raise an error for malformed urls'); }); - method('escapeHTML', function() { - test('

some text

', '<p>some text</p>', '

some text

'); - test('war & peace & food', 'war & peace & food', 'war & peace'); - test('&', '&amp;', 'double escapes &'); - test('<span>already escaped, yo</span>', '&lt;span&gt;already escaped, yo&lt;/span&gt;', 'already escaped will be double-escaped'); - }); - - method('unescapeHTML', function() { - test('<p>some text</p>', '

some text

', '

some text

'); - test('war & peace & food', 'war & peace & food', 'war & peace'); - test('already unescaped, yo', 'already unescaped, yo', 'already unescaped will stay unescaped'); - test('hell's', "hell's", "works on '"); - test('I know that "feel" bro', 'I know that "feel" bro', 'works on "'); - test('feel the /', 'feel the /', 'works on /'); - test('&lt;', '<', 'unescapes a single level of HTML escaping'); - test(run('>', 'escapeHTML'), '>', 'is the inverse of escapeHTML'); - test(' ', ' ', 'html code | space'); - test('!', '!', 'html code | !'); - test('À', 'À', 'html code | À'); - test('fi', 'fi', 'html code | upper latin'); - test('あ', 'あ', 'html code | hiragana a'); - test('À', 'À', 'hex code | À'); - test('+', '+', 'hex code | +'); - test('+', '+', 'hex code | uppercase | +'); - test('あ', 'あ', 'hex code | hiragana a'); - test(' ', ' ', 'non-breaking space'); - }); - method('shift', function() { test('ク', [1], 'グ', 'should shift 1 code up'); diff --git a/test/tests/string.js b/test/tests/string.js index 87086b66f..9383d71ed 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -1226,4 +1226,93 @@ namespace('String', function() { }); + describeInstance('escapeHtml', function(escapeHtml) { + + it('should escape basic input', () => { + assertEqual(escapeHtml('1 > 2'), '1 > 2'); + assertEqual(escapeHtml(''), '<foo>'); + assertEqual(escapeHtml('

some text

'), '<p>some text</p>'); + assertEqual(escapeHtml(''), '<img src="src" />'); + }); + + it('should escape entities', () => { + assertEqual(escapeHtml('war & peace & food'), 'war & peace & food'); + }); + + it('should not escape apostrophes or quotes', () => { + assertEqual(escapeHtml('"foo"'), '"foo"'); + assertEqual(escapeHtml("'foo'"), "'foo'"); + }); + + it('should have expected results when already escaped', () => { + assertEqual(escapeHtml('&'), '&amp;'); + assertEqual(escapeHtml('<span>escaped</span>'), '&lt;span&gt;escaped&lt;/span&gt;'); + }); + + it('should handle irregular input', () => { + assertEqual(escapeHtml(null), 'null'); + assertEqual(escapeHtml(NaN), 'NaN'); + assertEqual(escapeHtml(8), '8'); + assertEqual(escapeHtml(), ''); + }); + + }); + + describeInstance('unescapeHtml', function(unescapeHtml) { + + it('should unescape basic input', () => { + assertEqual(unescapeHtml('1 > 2'), '1 > 2'); + assertEqual(unescapeHtml('<foo>'), ''); + assertEqual(unescapeHtml('<p>some text</p>'), '

some text

'); + assertEqual(unescapeHtml('<img src="src" />'), ''); + }); + + it('should unescape special entities', () => { + assertEqual(unescapeHtml('war & peace'), 'war & peace'); + assertEqual(unescapeHtml('it's'), "it's"); + assertEqual(unescapeHtml('"foo"'), '"foo"'); + assertEqual(unescapeHtml(' '), ' '); + }); + + it('should unescape ascii decimal entities', () => { + assertEqual(unescapeHtml(' '), ' '); + assertEqual(unescapeHtml('!'), '!'); + }); + + it('should unescape ascii hex entities', () => { + assertEqual(unescapeHtml(' '), ' '); + assertEqual(unescapeHtml('!'), '!'); + assertEqual(unescapeHtml('/'), '/'); + }); + + it('should unescape non-ascii decimal entities', () => { + assertEqual(unescapeHtml('À'), 'À'); + assertEqual(unescapeHtml('fi'), 'fi'); + assertEqual(unescapeHtml('あ'), 'あ'); + }); + + it('should unescape non-ascii hex entities', () => { + assertEqual(unescapeHtml('À'), 'À'); + assertEqual(unescapeHtml('+'), '+'); + assertEqual(unescapeHtml('+'), '+'); + assertEqual(unescapeHtml('あ'), 'あ'); + }); + + it('should only escape once', () => { + assertEqual(unescapeHtml('&lt;'), '<'); + }); + + it('should do nothing to plain html', () => { + assertEqual(unescapeHtml('escaped'), 'escaped'); + }); + + it('should handle irregular input', () => { + assertEqual(unescapeHtml(null), 'null'); + assertEqual(unescapeHtml(NaN), 'NaN'); + assertEqual(unescapeHtml(8), '8'); + assertEqual(unescapeHtml(), ''); + }); + + }); + }); From 76f588f4a351c63e557a964da71ddd4c439b4925 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 01:01:51 +0900 Subject: [PATCH 047/191] Removed String#shift --- CHANGELOG.md | 1 + test/OLD/tests/string.js | 13 ------------- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dbef09e1..af37f85a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ v3.0.0 Also no longer coerces non-global regexes to be global. - Renamed `String#escapeHTML` to `String#escapeHtml`. - Renamed `String#unescapeHTML` to `String#unescapeHtml`. +- Removed `String#shift`. TODO: diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index c253c6b02..4bee9ebd8 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -51,19 +51,6 @@ namespace('String', function () { raisesError(function() { run('% 23'); }, 'should raise an error for malformed urls'); }); - method('shift', function() { - - test('ク', [1], 'グ', 'should shift 1 code up'); - test('グ', [-1], 'ク', 'should shift 1 code down'); - test('ヘ', [2], 'ペ', 'should shift 2 codes'); - test('ペ', [-2], 'ヘ', 'should shift -2 codes'); - test('ク', [0], 'ク', 'should shift 0 codes'); - test('ク', 'ク', 'no params simply returns the string'); - test('カキクケコ', [1], 'ガギグゲゴ', 'multiple characters up one'); - test('ガギグゲゴ', [-1], 'カキクケコ', 'multiple characters down one'); - - }); - method('forEach', function() { var callbackTest, result; From afdb1c1976ce08d3dc21f7a2da7f8ce53039df4e Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 02:36:19 +0900 Subject: [PATCH 048/191] Added String#toCodes --- CHANGELOG.md | 5 ++ package.json | 2 +- src/string/define.js | 1 + src/string/methods.js | 1 + src/string/toCodes.js | 32 +++++++++++++ test/OLD/tests/string.js | 100 --------------------------------------- test/tests/string.js | 62 ++++++++++++++++++------ yarn.lock | 8 ++-- 8 files changed, 92 insertions(+), 119 deletions(-) create mode 100644 src/string/toCodes.js diff --git a/CHANGELOG.md b/CHANGELOG.md index af37f85a5..a16f0cef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,11 @@ v3.0.0 - Renamed `String#escapeHTML` to `String#escapeHtml`. - Renamed `String#unescapeHTML` to `String#unescapeHtml`. - Removed `String#shift`. +- Removed `String#words`. This method is highly use-case dependent and similar + functionality can be achieved using just `String#match`. +- Removed `String#lines`. Splitting on a new line should be used instead. +- Removed `String#chars`. Splitting on an empty string should be used instead. +- Renamed `String#codes` to `String#toCodes`. Added multi-byte support. TODO: diff --git a/package.json b/package.json index 82b400268..45ac830db 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.29", + "ready-test": "^1.0.31", "sinon": "^7.5.0", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/string/define.js b/src/string/define.js index b057b3685..190a3715a 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -25,6 +25,7 @@ defineInstance('spacify', methods.spacify); defineInstance('stripTags', methods.stripTags); defineInstance('titleize', methods.titleize); defineInstance('to', methods.to); +defineInstance('toCodes', methods.toCodes); defineInstance('toNumber', methods.toNumber); defineInstance('truncate', methods.truncate); defineInstance('truncateOnWord', methods.truncateOnWord); diff --git a/src/string/methods.js b/src/string/methods.js index cea6a1523..4ba0fe853 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -22,6 +22,7 @@ export { default as spacify } from './spacify'; export { default as stripTags } from './stripTags'; export { default as titleize } from './titleize'; export { default as to } from './to'; +export { default as toCodes } from './toCodes'; export { default as toNumber } from './toNumber'; export { default as truncate } from './truncate'; export { default as truncateOnWord } from './truncateOnWord'; diff --git a/src/string/toCodes.js b/src/string/toCodes.js new file mode 100644 index 000000000..14a390b5f --- /dev/null +++ b/src/string/toCodes.js @@ -0,0 +1,32 @@ +import coerce from './util/coerce'; + +const PLANE_MAX = Math.pow(2, 16); + +/** + * Converts the string to an array of character codes. Handles multi-byte + * unicode sequences. + * + * @extra Note that this method requires `String#toCodePoint`, + * which may require a polyfill in some environments. + * + * @param {string} str - The string. + * + * @example + * + * 'foo'.toCodes() -> [102, 111, 111] + * '🍺'.toCodes() -> [127866] + * + **/ +export default function toCodes(str) { + str = coerce(str); + const codes = []; + for (let i = 0, len = str.length; i < len; i++) { + const code = str.codePointAt(i); + codes.push(code); + if (code >= PLANE_MAX) { + // Increment the index again if the character is multi-byte. + i += 1; + } + } + return codes; +} diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 4bee9ebd8..6cc8bf252 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -129,104 +129,4 @@ namespace('String', function () { }); - method('chars', function() { - - test('wasabi', ['w','a','s','a','b','i'], 'splits string into constituent chars'); - test(' wasabi \n', [' ','w','a','s','a','b','i',' ','\n'], 'should not trim whitespace'); - - var counter = 0; - var chars = ['g','i','n','g','e','r']; - var indexes = [0,1,2,3,4,5]; - var callback = function(chr, i, a) { - equal(chr, chars[i], 'First argument should be the code.'); - equal(i, indexes[i], 'Second argument should be the index.'); - equal(a, chars, 'Third argument the array of characters.'); - counter++; - }; - - var result = run('ginger', 'chars', [callback]); - equal(counter, 6, 'should have run 6 times'); - equal(result, ['g','i','n','g','e','r'], 'result should be an array'); - - // test each char collects when properly returned - counter = 0; - callback = function(str, i) { - counter++; - return str.toUpperCase(); - } - var result = run('ginger', 'chars', [callback]); - equal(result, ['G','I','N','G','E','R'], 'can be mapped'); - - test('', [], 'empty string'); - }); - - method('words', function() { - - var counter = 0, result, callback; - var sentence = 'these pretzels are \n\n making me thirsty!\n\n'; - var words = ['these', 'pretzels', 'are', 'making', 'me', 'thirsty!']; - var indexes = [0,1,2,3,4,5]; - var callback = function(word, i, a) { - equal(word, words[i], 'First argument should be the word.'); - equal(i, indexes[i], 'Second argument should be the index.'); - equal(a, words, 'Third argument the array of words.'); - counter++; - }; - - result = run(sentence, 'words', [callback]); - equal(counter, 6, 'should have run 6 times'); - equal(result, words, 'result should be an array of matches'); - - test('', [], 'empty string'); - - }); - - method('lines', function() { - - var counter = 0, result, callback; - var paragraph = 'these\npretzels\nare\n\nmaking\nme\n thirsty!\n\n\n\n'; - var lines = ['these', 'pretzels', 'are', '', 'making', 'me', ' thirsty!']; - var indexes = [0,1,2,3,4,5,6]; - var callback = function(line, i, a) { - equal(line, lines[i], 'First argument should be the line.'); - equal(i, indexes[i], 'Second argument should be the index.'); - equal(a, lines, 'Third argument the array of lines.'); - counter++; - }; - - result = run(paragraph, 'lines', [callback]); - equal(counter, 7, 'should have run 7 times'); - equal(result, lines, 'result should be an array of matches'); - - callback = function(str, i) { - return run(str, 'capitalize'); - } - result = run('one\ntwo', 'lines', [callback]); - equal(['One','Two'], result, 'lines can be modified'); - - test('', [''], 'empty string'); - - }); - - method('codes', function() { - - test('jumpy', [106,117,109,112,121], 'jumpy'); - - var counter = 0, result; - var arr = [103,105,110,103,101,114]; - var indexes = [0,1,2,3,4,5]; - var callback = function(code, i, s) { - equal(code, arr[i], 'First argument should be the code.'); - equal(i, indexes[i], 'Second argument should be the index.'); - equal(s, 'ginger', 'Third argument should be the string.'); - counter++; - } - - result = run('ginger', 'codes', [callback]); - equal(counter, 6, 'should have ran 6 times'); - equal(result, arr, 'result should be an array'); - - test('', [], 'empty string'); - }); - }); diff --git a/test/tests/string.js b/test/tests/string.js index 9383d71ed..d19e33470 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -1228,28 +1228,28 @@ namespace('String', function() { describeInstance('escapeHtml', function(escapeHtml) { - it('should escape basic input', () => { + it('should escape basic input', function() { assertEqual(escapeHtml('1 > 2'), '1 > 2'); assertEqual(escapeHtml(''), '<foo>'); assertEqual(escapeHtml('

some text

'), '<p>some text</p>'); assertEqual(escapeHtml(''), '<img src="src" />'); }); - it('should escape entities', () => { + it('should escape entities', function() { assertEqual(escapeHtml('war & peace & food'), 'war & peace & food'); }); - it('should not escape apostrophes or quotes', () => { + it('should not escape apostrophes or quotes', function() { assertEqual(escapeHtml('"foo"'), '"foo"'); assertEqual(escapeHtml("'foo'"), "'foo'"); }); - it('should have expected results when already escaped', () => { + it('should have expected results when already escaped', function() { assertEqual(escapeHtml('&'), '&amp;'); assertEqual(escapeHtml('<span>escaped</span>'), '&lt;span&gt;escaped&lt;/span&gt;'); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(escapeHtml(null), 'null'); assertEqual(escapeHtml(NaN), 'NaN'); assertEqual(escapeHtml(8), '8'); @@ -1260,53 +1260,53 @@ namespace('String', function() { describeInstance('unescapeHtml', function(unescapeHtml) { - it('should unescape basic input', () => { + it('should unescape basic input', function() { assertEqual(unescapeHtml('1 > 2'), '1 > 2'); assertEqual(unescapeHtml('<foo>'), ''); assertEqual(unescapeHtml('<p>some text</p>'), '

some text

'); assertEqual(unescapeHtml('<img src="src" />'), ''); }); - it('should unescape special entities', () => { + it('should unescape special entities', function() { assertEqual(unescapeHtml('war & peace'), 'war & peace'); assertEqual(unescapeHtml('it's'), "it's"); assertEqual(unescapeHtml('"foo"'), '"foo"'); assertEqual(unescapeHtml(' '), ' '); }); - it('should unescape ascii decimal entities', () => { + it('should unescape ascii decimal entities', function() { assertEqual(unescapeHtml(' '), ' '); assertEqual(unescapeHtml('!'), '!'); }); - it('should unescape ascii hex entities', () => { + it('should unescape ascii hex entities', function() { assertEqual(unescapeHtml(' '), ' '); assertEqual(unescapeHtml('!'), '!'); assertEqual(unescapeHtml('/'), '/'); }); - it('should unescape non-ascii decimal entities', () => { + it('should unescape non-ascii decimal entities', function() { assertEqual(unescapeHtml('À'), 'À'); assertEqual(unescapeHtml('fi'), 'fi'); assertEqual(unescapeHtml('あ'), 'あ'); }); - it('should unescape non-ascii hex entities', () => { + it('should unescape non-ascii hex entities', function() { assertEqual(unescapeHtml('À'), 'À'); assertEqual(unescapeHtml('+'), '+'); assertEqual(unescapeHtml('+'), '+'); assertEqual(unescapeHtml('あ'), 'あ'); }); - it('should only escape once', () => { + it('should only escape once', function() { assertEqual(unescapeHtml('&lt;'), '<'); }); - it('should do nothing to plain html', () => { + it('should do nothing to plain html', function() { assertEqual(unescapeHtml('escaped'), 'escaped'); }); - it('should handle irregular input', () => { + it('should handle irregular input', function() { assertEqual(unescapeHtml(null), 'null'); assertEqual(unescapeHtml(NaN), 'NaN'); assertEqual(unescapeHtml(8), '8'); @@ -1315,4 +1315,38 @@ namespace('String', function() { }); + describeInstance('toCodes', function(toCodes) { + + it('should handle basic input', function() { + assertArrayEqual(toCodes(''), []); + assertArrayEqual(toCodes('foo'), [102, 111, 111]); + assertArrayEqual(toCodes('foo bar'), [102, 111, 111, 32, 98, 97, 114]); + assertArrayEqual(toCodes('foo\nbar'), [102, 111, 111, 10, 98, 97, 114]); + }); + + it('should handle non-ascii input', function() { + assertArrayEqual(toCodes('今日'), [20170, 26085]); + assertArrayEqual(toCodes('오늘'), [50724, 45720]); + }); + + it('should handle multi-byte', function() { + assertArrayEqual(toCodes('🍺'), [127866]); + assertArrayEqual(toCodes('🍺🍺'), [127866, 127866]); + assertArrayEqual(toCodes('ab🍺🍺cd'), [97, 98, 127866, 127866, 99, 100]); + assertArrayEqual(toCodes( + String.fromCodePoint(0x10FFFF) + String.fromCodePoint(0x10FFFF) + ), [0x10FFFF, 0x10FFFF]); + }); + + it('should handle irregular input', function() { + assertArrayEqual(toCodes(null), [110, 117, 108, 108]); + assertArrayEqual(toCodes(NaN), [78, 97, 78]); + assertArrayEqual(toCodes(8), [56]); + + // "undefined" + assertArrayEqual(toCodes(), [117, 110, 100, 101, 102, 105, 110, 101, 100]); + }); + + }); + }); diff --git a/yarn.lock b/yarn.lock index 884a2c1f7..f31027f6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3496,10 +3496,10 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -ready-test@^1.0.29: - version "1.0.29" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.29.tgz#943764c6dea38c1f57e245de1892fc1bdc214f9b" - integrity sha512-ISLxp5PvoUpi+NTVf1mzQvh1gzOK25+J5rxiOdLdgwmB41J8knj8ak6jJY1RmFvoLHqPzMjqc7WRcRlTC4cm5w== +ready-test@^1.0.31: + version "1.0.31" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.31.tgz#5860ab3b61eb4f1bebc442e90d3adf051e3724a2" + integrity sha512-2mXxmVAIVzPdqhjJiJAkMvMt6Q/+LXST1TKmoI+4tM//6cBekDxdgCmuwAek5CFUuTDA4/QFjj/el7X1W4T10g== dependencies: argv "^0.0.2" chalk "^2.4.2" From c76c7958add19a71a279e209585a7fafa2c5ef38 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 02:37:54 +0900 Subject: [PATCH 049/191] Removed String#forEach --- CHANGELOG.md | 1 + test/OLD/tests/string.js | 78 ---------------------------------------- 2 files changed, 1 insertion(+), 78 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a16f0cef7..dd04d4523 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ v3.0.0 - Removed `String#lines`. Splitting on a new line should be used instead. - Removed `String#chars`. Splitting on an empty string should be used instead. - Renamed `String#codes` to `String#toCodes`. Added multi-byte support. +- Removed `String#forEach`. Use `String#match` instead. TODO: diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js index 6cc8bf252..c994f3891 100644 --- a/test/OLD/tests/string.js +++ b/test/OLD/tests/string.js @@ -51,82 +51,4 @@ namespace('String', function () { raisesError(function() { run('% 23'); }, 'should raise an error for malformed urls'); }); - method('forEach', function() { - - var callbackTest, result; - - // "each" will return an array of everything that was matched, defaulting to individual characters - test('g', ['g'], 'each should return an array of each char'); - - - callbackTest = function(str, i) { - equal(str, 'g', 'char should be passed as the first argument'); - } - - // Each without a first parameter assumes "each character" - result = run('g', 'forEach', [callbackTest]); - equal(result, ['g'], "['g'] should be the resulting value"); - - - var counter = 0, result, callback; - callback = function(str, i) { - equal(str, 'ginger'.charAt(counter), 'char should be passed as the first argument'); - equal(i, counter, 'index should be passed as the second argument'); - counter++; - } - result = run('ginger', 'forEach', [callback]); - equal(counter, 6, 'should have ran 6 times'); - equal(result, ['g','i','n','g','e','r'], 'resulting array should contain all the characters'); - - - var counter = 0, result, callback; - - callback = function(str, i) { - equal(str, 'g', 'string argument | match should be passed as the first argument to the block'); - counter++; - } - - result = run('ginger', 'forEach', ['g', callback]); - equal(counter, 2, 'string argument | should have ran 2 times'); - equal(result, ['g','g'], "string argument | resulting array should be ['g','g']"); - - - var counter = 0, result, callback, arr; - arr = ['g','i','g','e']; - - callback = function(str, i) { - equal(str, arr[i], 'regexp argument | match should be passed as the first argument to the block'); - counter++; - } - - result = run('ginger', 'forEach', [/[a-i]/g, callback]); - equal(counter, 4, 'regexp argument | should have ran 4 times'); - equal(result, ['g','i','g','e'], "regexp argument | resulting array should have been ['g','i','g','e']"); - - - // .each should do the same thing as String#scan in ruby except that .each doesn't respect capturing groups - var testString = 'cruel world'; - - test(testString, [/\w+/g], ['cruel', 'world'], 'complex regexp | /\\w+/g'); - test(testString, [/.../g], ['cru', 'el ', 'wor'], 'complex regexp | /.../g'); - test(testString, [/(..)(..)/g], ['crue', 'l wo'], 'complex regexp | /(..)(..)/g'); - test(testString, [/\w+/], ['cruel', 'world'], 'non-global regexes should still be global'); - - test('', ['f'], [], 'empty string | each f'); - test('', [/foo/], [], 'empty string | each /foo/'); - test('', [function() {}], [], 'empty string | passing a block'); - - - var letters = [], result, fn; - fn = function(l) { - letters.push(l); - return false; - } - result = run('foo', 'forEach', [fn]) - - equal(result, ['f'], 'returning false should break the loop - result'); - equal(letters, ['f'], 'returning false should break the loop - pushed'); - - }); - }); From 7ab0a96fe51d0a75574a8ae4cd8a7f040152e27a Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 03:08:09 +0900 Subject: [PATCH 050/191] Added String#encodeUrl/encodeUrlParam/decodeUrl/decodeUrlParam --- CHANGELOG.md | 2 + src/string/decodeUrl.js | 16 ++++++++ src/string/decodeUrlParam.js | 16 ++++++++ src/string/define.js | 4 ++ src/string/encodeUrl.js | 16 ++++++++ src/string/encodeUrlParam.js | 16 ++++++++ src/string/methods.js | 4 ++ src/string/toCodes.js | 2 +- test/OLD/tests/string.js | 54 ------------------------- test/tests/string.js | 78 +++++++++++++++++++++++++++++++++++- 10 files changed, 151 insertions(+), 57 deletions(-) create mode 100644 src/string/decodeUrl.js create mode 100644 src/string/decodeUrlParam.js create mode 100644 src/string/encodeUrl.js create mode 100644 src/string/encodeUrlParam.js delete mode 100644 test/OLD/tests/string.js diff --git a/CHANGELOG.md b/CHANGELOG.md index dd04d4523..888f7cfbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,8 @@ v3.0.0 - Removed `String#chars`. Splitting on an empty string should be used instead. - Renamed `String#codes` to `String#toCodes`. Added multi-byte support. - Removed `String#forEach`. Use `String#match` instead. +- Renamed `String#escapeURL` to `String#encodeUrl` and `String#encodeUrlParam`. +- Renamed `String#unesacpeURL` to `String#decodeUrl` and `String#decodeUrlParam`. TODO: diff --git a/src/string/decodeUrl.js b/src/string/decodeUrl.js new file mode 100644 index 000000000..4159fbfee --- /dev/null +++ b/src/string/decodeUrl.js @@ -0,0 +1,16 @@ +import coerce from './util/coerce'; + +/** + * Shortcut for decodeURI global method to allow chaining. + * + * @param {string} str - The string. + * + * @example + * + * 'a%20b%20c'.decodeUrl() -> 'a b c' + * + **/ +export default function decodeUrl(str = '') { + str = coerce(str); + return decodeURI(str); +} diff --git a/src/string/decodeUrlParam.js b/src/string/decodeUrlParam.js new file mode 100644 index 000000000..9b6d5b7b4 --- /dev/null +++ b/src/string/decodeUrlParam.js @@ -0,0 +1,16 @@ +import coerce from './util/coerce'; + +/** + * Shortcut for decodeURIComponent global method to allow chaining. + * + * @param {string} str - The string. + * + * @example + * + * 'q%3Dfoo%20bar'.decodeUrlParam() -> 'q=foo bar' + * + **/ +export default function decodeUrlParam(str = '') { + str = coerce(str); + return decodeURIComponent(str); +} diff --git a/src/string/define.js b/src/string/define.js index 190a3715a..e08c7e330 100644 --- a/src/string/define.js +++ b/src/string/define.js @@ -8,7 +8,11 @@ defineInstance('capitalize', methods.capitalize); defineInstance('compact', methods.compact); defineInstance('dasherize', methods.dasherize); defineInstance('decodeBase64', methods.decodeBase64); +defineInstance('decodeUrl', methods.decodeUrl); +defineInstance('decodeUrlParam', methods.decodeUrlParam); defineInstance('encodeBase64', methods.encodeBase64); +defineInstance('encodeUrl', methods.encodeUrl); +defineInstance('encodeUrlParam', methods.encodeUrlParam); defineInstance('escapeHtml', methods.escapeHtml); defineInstance('first', methods.first); defineInstance('from', methods.from); diff --git a/src/string/encodeUrl.js b/src/string/encodeUrl.js new file mode 100644 index 000000000..e42324942 --- /dev/null +++ b/src/string/encodeUrl.js @@ -0,0 +1,16 @@ +import coerce from './util/coerce'; + +/** + * Shortcut for encodeURI global method to allow chaining. + * + * @param {string} str - The string. + * + * @example + * + * 'a b c'.encodeUrl() -> 'a%20b%20c' + * + **/ +export default function encodeUrl(str = '') { + str = coerce(str); + return encodeURI(str); +} diff --git a/src/string/encodeUrlParam.js b/src/string/encodeUrlParam.js new file mode 100644 index 000000000..199b544b0 --- /dev/null +++ b/src/string/encodeUrlParam.js @@ -0,0 +1,16 @@ +import coerce from './util/coerce'; + +/** + * Shortcut for encodeURIComponent global method to allow chaining. + * + * @param {string} str - The string. + * + * @example + * + * 'q=foo bar'.encodeUrlParam() -> 'q%3Dfoo%20bar' + * + **/ +export default function encodeUrlParam(str = '') { + str = coerce(str); + return encodeURIComponent(str); +} diff --git a/src/string/methods.js b/src/string/methods.js index 4ba0fe853..e8951419a 100644 --- a/src/string/methods.js +++ b/src/string/methods.js @@ -4,7 +4,11 @@ export { default as capitalize } from './capitalize'; export { default as compact } from './compact'; export { default as dasherize } from './dasherize'; export { default as decodeBase64 } from './decodeBase64'; +export { default as decodeUrl } from './decodeUrl'; +export { default as decodeUrlParam } from './decodeUrlParam'; export { default as encodeBase64 } from './encodeBase64'; +export { default as encodeUrl } from './encodeUrl'; +export { default as encodeUrlParam } from './encodeUrlParam'; export { default as escapeHtml } from './escapeHtml'; export { default as first } from './first'; export { default as from } from './from'; diff --git a/src/string/toCodes.js b/src/string/toCodes.js index 14a390b5f..fe2064059 100644 --- a/src/string/toCodes.js +++ b/src/string/toCodes.js @@ -17,7 +17,7 @@ const PLANE_MAX = Math.pow(2, 16); * '🍺'.toCodes() -> [127866] * **/ -export default function toCodes(str) { +export default function toCodes(str = '') { str = coerce(str); const codes = []; for (let i = 0, len = str.length; i < len; i++) { diff --git a/test/OLD/tests/string.js b/test/OLD/tests/string.js deleted file mode 100644 index c994f3891..000000000 --- a/test/OLD/tests/string.js +++ /dev/null @@ -1,54 +0,0 @@ -namespace('String', function () { - - // Skipping strict mode here as testing - // malformed utf-8 is part of these tests. - - var whiteSpace = '\u0009\u000B\u000C\u0020\u00A0\uFEFF\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000'; - var lineTerminators = '\u000A\u000D\u2028\u2029'; - - method('escapeURL', function() { - - test('what a day...', 'what%20a%20day...', '...'); - test('/?:@&=+$#', '/?:@&=+$#', 'url chars'); - test('!%^*()[]{}\\:', '!%25%5E*()%5B%5D%7B%7D%5C:', 'non url special chars'); - - test('http://www.amazon.com/Kindle-Special-Offers-Wireless-Reader/dp/B004HFS6Z0/ref=amb_link_356652042_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=1RKN5V41WJ23AXKFSQ56&pf_rd_t=101&pf_rd_p=1306249942&pf_rd_i=507846', 'http://www.amazon.com/Kindle-Special-Offers-Wireless-Reader/dp/B004HFS6Z0/ref=amb_link_356652042_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=1RKN5V41WJ23AXKFSQ56&pf_rd_t=101&pf_rd_p=1306249942&pf_rd_i=507846', 'amazon link'); - test('http://twitter.com/#!/nov/status/85613699410296833', 'http://twitter.com/#!/nov/status/85613699410296833', 'twitter link'); - test('http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo=SIC&itu=UCI%2BIA%2BUA%2BFICS%2 fBUFI%2BDDSIC&otn=10&pmod=260625794431%2B370476659389&po=LVI&ps=63&clkid=962675460977455716#ht_3216wt_1141', 'http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo=SIC&itu=UCI%252BIA%252BUA%252BFICS%252%20fBUFI%252BDDSIC&otn=10&pmod=260625794431%252B370476659389&po=LVI&ps=63&clkid=962675460977455716#ht_3216wt_1141', 'ebay link'); - - }); - - method('escapeURL', function() { - test('what a day...', [true], 'what%20a%20day...', '...'); - test('/?:@&=+$#', [true], '%2F%3F%3A%40%26%3D%2B%24%23', 'url chars'); - test('!%^*()[]{}\\:', [true], '!%25%5E*()%5B%5D%7B%7D%5C%3A', 'non url special chars'); - test('http://www.amazon.com/Kindle-Special-Offers-Wireless-Reader/dp/B004HFS6Z0/ref=amb_link_356652042_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=1RKN5V41WJ23AXKFSQ56&pf_rd_t=101&pf_rd_p=1306249942&pf_rd_i=507846', [true], 'http%3A%2F%2Fwww.amazon.com%2FKindle-Special-Offers-Wireless-Reader%2Fdp%2FB004HFS6Z0%2Fref%3Damb_link_356652042_2%3Fpf_rd_m%3DATVPDKIKX0DER%26pf_rd_s%3Dcenter-1%26pf_rd_r%3D1RKN5V41WJ23AXKFSQ56%26pf_rd_t%3D101%26pf_rd_p%3D1306249942%26pf_rd_i%3D507846', 'amazon link'); - test('http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo=SIC&itu=UCI%2BIA%2BUA%2BFICS%2 fBUFI%2BDDSIC&otn=10&pmod=260625794431%2B370476659389&po=LVI&ps=63&clkid=962675460977455716#ht_3216wt_1141', [true], 'http%3A%2F%2Fcgi.ebay.com%2FT-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-%2F350233503515%3F_trksid%3Dp5197.m263%26_trkparms%3Dalgo%3DSIC%26itu%3DUCI%252BIA%252BUA%252BFICS%252%20fBUFI%252BDDSIC%26otn%3D10%26pmod%3D260625794431%252B370476659389%26po%3DLVI%26ps%3D63%26clkid%3D962675460977455716%23ht_3216wt_1141', 'ebay link'); - - }); - - method('unescapeURL', function() { - - test('what%20a%20day...', 'what a day...', '...'); - test('%2F%3F%3A%40%26%3D%2B%24%23', '/?:@&=+$#', 'url chars'); - test('!%25%5E*()%5B%5D%7B%7D%5C%3A', '!%^*()[]{}\\:', 'non url special chars'); - test('http%3A%2F%2Fsomedomain.com%3Fparam%3D%22this%3A%20isn\'t%20an%20easy%20URL%20to%20escape%22', 'http://somedomain.com?param="this: isn\'t an easy URL to escape"', 'fake url') - test('http%3A%2F%2Fwww.amazon.com%2FKindle-Special-Offers-Wireless-Reader%2Fdp%2FB004HFS6Z0%2Fref%3Damb_link_356652042_2%3Fpf_rd_m%3DATVPDKIKX0DER%26pf_rd_s%3Dcenter-1%26pf_rd_r%3D1RKN5V41WJ23AXKFSQ56%26pf_rd_t%3D101%26pf_rd_p%3D1306249942%26pf_rd_i%3D507846', 'http://www.amazon.com/Kindle-Special-Offers-Wireless-Reader/dp/B004HFS6Z0/ref=amb_link_356652042_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=1RKN5V41WJ23AXKFSQ56&pf_rd_t=101&pf_rd_p=1306249942&pf_rd_i=507846', 'amazon link'); - test('http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo%3DSIC%26itu%3DUCI%252BIA%252BUA%252BFICS%252BUFI%252BDDSIC%26otn%3D10%26pmod%3D260625794431%252B370476659389%26po%3DLVI%26ps%3D63%26clkid%3D962675460977455716', 'http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo=SIC&itu=UCI%2BIA%2BUA%2BFICS%2BUFI%2BDDSIC&otn=10&pmod=260625794431%2B370476659389&po=LVI&ps=63&clkid=962675460977455716', 'ebay link'); - - raisesError(function() { run('% 23'); }, 'should raise an error for malformed urls'); - }); - - method('unescapeURL', function() { - test('what%20a%20day...', [true], 'what a day...', '...'); - test('%2F%3F%3A%40%26%3D%2B%24%23', [true], '%2F%3F%3A%40%26%3D%2B%24%23', 'url chars'); - test('!%25%5E*()%5B%5D%7B%7D%5C:', [true], '!%^*()[]{}\\:', 'non url special chars'); - test('http%3A%2F%2Fsomedomain.com%3Fparam%3D%22this%3A%20isn\'t%20an%20easy%20URL%20to%20escape%22', [true], 'http%3A%2F%2Fsomedomain.com%3Fparam%3D"this%3A isn\'t an easy URL to escape"', 'fake url') - test('http%3A%2F%2Fwww.amazon.com%2FKindle-Special-Offers-Wireless-Reader%2Fdp%2FB004HFS6Z0%2Fref%3Damb_link_356652042_2%3Fpf_rd_m%3DATVPDKIKX0DER%26pf_rd_s%3Dcenter-1%26pf_rd_r%3D1RKN5V41WJ23AXKFSQ56%26pf_rd_t%3D101%26pf_rd_p%3D1306249942%26pf_rd_i%3D507846', [true], 'http%3A%2F%2Fwww.amazon.com%2FKindle-Special-Offers-Wireless-Reader%2Fdp%2FB004HFS6Z0%2Fref%3Damb_link_356652042_2%3Fpf_rd_m%3DATVPDKIKX0DER%26pf_rd_s%3Dcenter-1%26pf_rd_r%3D1RKN5V41WJ23AXKFSQ56%26pf_rd_t%3D101%26pf_rd_p%3D1306249942%26pf_rd_i%3D507846', 'amazon link'); - test('http://twitter.com/#!/nov/status/85613699410296833', [true], 'http://twitter.com/#!/nov/status/85613699410296833', 'twitter link'); - test('http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo=SIC&itu=UCI%2BIA%2BUA%2BFICS%2fBUFI%2BDDSIC&otn=10&pmod=260625794431%2B370476659389&po=LVI&ps=63&clkid=962675460977455716#ht_3216wt_1141', [true], 'http://cgi.ebay.com/T-Shirt-Tee-NEW-Naruto-Shippuuden-Kakashi-Adult-Men-XL-/350233503515?_trksid=p5197.m263&_trkparms=algo=SIC&itu=UCI%2BIA%2BUA%2BFICS%2fBUFI%2BDDSIC&otn=10&pmod=260625794431%2B370476659389&po=LVI&ps=63&clkid=962675460977455716#ht_3216wt_1141', 'ebay link'); - - raisesError(function() { run('% 23'); }, 'should raise an error for malformed urls'); - }); - -}); diff --git a/test/tests/string.js b/test/tests/string.js index d19e33470..a1c8223cf 100644 --- a/test/tests/string.js +++ b/test/tests/string.js @@ -1339,12 +1339,86 @@ namespace('String', function() { }); it('should handle irregular input', function() { + assertArrayEqual(toCodes(), []); assertArrayEqual(toCodes(null), [110, 117, 108, 108]); assertArrayEqual(toCodes(NaN), [78, 97, 78]); assertArrayEqual(toCodes(8), [56]); + }); + + }); + + describeInstance('encodeUrl', function(encodeUrl) { + + it('should handle basic input', function() { + assertEqual(encodeUrl(';,/?:@&=+$#'), ';,/?:@&=+$#'); + assertEqual(encodeUrl("-_.!~*'()"), "-_.!~*'()"); + assertEqual(encodeUrl('ABC abc 123'), 'ABC%20abc%20123'); + }); + + it('should handle irregular input', function() { + assertEqual(encodeUrl(), ''); + assertEqual(encodeUrl(null), 'null'); + assertEqual(encodeUrl(NaN), 'NaN'); + assertEqual(encodeUrl(8), '8'); + }); - // "undefined" - assertArrayEqual(toCodes(), [117, 110, 100, 101, 102, 105, 110, 101, 100]); + }); + + describeInstance('encodeUrlParam', function(encodeUrlParam) { + + it('should handle basic input', function() { + assertEqual(encodeUrlParam(';,/?:@&=+$#'), '%3B%2C%2F%3F%3A%40%26%3D%2B%24%23'); + assertEqual(encodeUrlParam("-_.!~*'()"), "-_.!~*'()"); + assertEqual(encodeUrlParam('ABC abc 123'), 'ABC%20abc%20123'); + }); + + it('should handle irregular input', function() { + assertEqual(encodeUrlParam(), ''); + assertEqual(encodeUrlParam(null), 'null'); + assertEqual(encodeUrlParam(NaN), 'NaN'); + assertEqual(encodeUrlParam(8), '8'); + }); + + }); + + describeInstance('decodeUrl', function(decodeUrl) { + + it('should handle basic input', function() { + assertEqual(decodeUrl(';,/?:@&=+$#'), ';,/?:@&=+$#'); + assertEqual(decodeUrl( "-_.!~*'()"), "-_.!~*'()"); + assertEqual(decodeUrl( 'ABC%20abc%20123'), 'ABC abc 123'); + }); + + it('should error on malformed urls', function() { + assertError(function () { decodeUrl('% 23'); }); + }); + + it('should handle irregular input', function() { + assertEqual(decodeUrl(), ''); + assertEqual(decodeUrl(null), 'null'); + assertEqual(decodeUrl(NaN), 'NaN'); + assertEqual(decodeUrl(8), '8'); + }); + + }); + + describeInstance('decodeUrlParam', function(decodeUrlParam) { + + it('should handle basic input', function() { + assertEqual(decodeUrlParam('%3B%2C%2F%3F%3A%40%26%3D%2B%24%23'), ';,/?:@&=+$#'); + assertEqual(decodeUrlParam("-_.!~*'()"), "-_.!~*'()"); + assertEqual(decodeUrlParam('ABC%20abc%20123'), 'ABC abc 123'); + }); + + it('should error on malformed urls', function() { + assertError(function () { decodeUrlParam('% 23'); }); + }); + + it('should handle irregular input', function() { + assertEqual(decodeUrlParam(), ''); + assertEqual(decodeUrlParam(null), 'null'); + assertEqual(decodeUrlParam(NaN), 'NaN'); + assertEqual(decodeUrlParam(8), '8'); }); }); From 80fb7b2129fd2acab16634cf04d2d694d3831f08 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 03:26:35 +0900 Subject: [PATCH 051/191] updated memoize docs and changelog --- CHANGELOG.md | 2 ++ src/function/memoize.js | 32 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 888f7cfbf..94630598d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ v3.0.0 - Removed `RegExp#getFlags`, `RegExp#setFlags`, `RegExp#addFlags` and `RegExp#removeFlags`. - Removed `Function#memoize` ability to deeply serialize all arguments. +- Removed `Function#memoize` `limit` argument. - Removed Math aliases `Number#sin/asin/cos/acos/tan/atan/exp` in favor of directly using `Math`. `Number#round/floor/ceil/abs/sqrt/pow` aliases are retained. @@ -65,6 +66,7 @@ v3.0.0 TODO: +- Function#memoize expose cache? - Consider asserting types instead of coercion?? - Object.values / Object.entries? - Array#flat/Array#flatMap diff --git a/src/function/memoize.js b/src/function/memoize.js index a2117c8d7..c25fc7c7f 100644 --- a/src/function/memoize.js +++ b/src/function/memoize.js @@ -2,19 +2,23 @@ import { hasOwnProperty } from '../util/helpers'; /** * Creates a function that will memoize results for unique calls. - * `memoize` can be thought of as a more powerful `once`. Where `once` + * + * @extra `memoize` can be thought of as a more powerful `once`. Where `once` * will only call a function once ever, memoized functions will be - * called once per unique call. A "unique call" is determined by the - * return value of [hashFn], which is passed the arguments of each call. - * If [hashFn] is undefined, it will deeply serialize all arguments, - * such that any different argument signature will result in a unique - * call. [hashFn] may be a string (allows `deep properties`) that acts - * as a shortcut to return a property of the first argument passed. - * [limit] sets an upper limit on memoized results. The default is no - * limit, meaning that unique calls will continue to memoize results. - * For most use cases this is fine, however [limit] is useful for more - * persistent (often server-side) applications for whom memory leaks - * are a concern. + * called once per "unique" call, which can be customized. + * + * @param {Function} fn - The function to memoize. + * @param {Function} [hashFn] - The hash function. This function should return + * a string that will become the cache key. If the result of a previous call + * to the returned function has the same key, the cached value will be used. + * By default the first argument will coerced to a string and used as the + * cache key. + * + * @returns {Function} + * + * @callback hashFn + * @param {...any} args - The arguments passed to the input function. + * @returns {string} - The string that will determine the cache key. * * @example * @@ -24,10 +28,6 @@ import { hasOwnProperty } from '../util/helpers'; * var fn = calculateUserBalance.memoize('id'); * fn(Harry); fn(Mark); fn(Mark); -> logs twice, memoizing once * - * @param {Function} fn - The function to memoize. - * @param {Function} [hashFn] - The function to memoize. - * @static - * */ export default function memoize(fn, hashFn) { const cache = {}; From ff3ca8a5cfd6779b0d2cd1c23249706e007210d4 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 03:30:54 +0900 Subject: [PATCH 052/191] Added Function#once --- src/function/debounce.js | 4 +-- src/function/define.js | 1 + src/function/methods.js | 1 + src/function/once.js | 29 +++++++++++++++++++++ src/function/throttle.js | 1 + test/OLD/tests/function.js | 53 -------------------------------------- test/tests/function.js | 21 +++++++++++++-- 7 files changed, 53 insertions(+), 57 deletions(-) create mode 100644 src/function/once.js diff --git a/src/function/debounce.js b/src/function/debounce.js index 795cec6ef..9c844dd3e 100644 --- a/src/function/debounce.js +++ b/src/function/debounce.js @@ -11,13 +11,13 @@ import { assertPositiveInteger } from '../util/assertions'; * exception that a debounced function will receive the last arguments * supplied, while a throttled function will receive the first. * + * @param {Function} fn - The function to debounce. + * * @example * * var fn = debounce(logHello, 250) * runTenTimes(fn); -> called once 250ms later * - * @param {Function} fn - The function to debounce. - * * @returns {Function} * */ diff --git a/src/function/define.js b/src/function/define.js index 09526f7fa..7ace263ef 100644 --- a/src/function/define.js +++ b/src/function/define.js @@ -2,5 +2,6 @@ import { defineInstance } from '../core/function'; import * as methods from './methods'; defineInstance('memoize', methods.memoize); +defineInstance('once', methods.once); defineInstance('throttle', methods.throttle); defineInstance('debounce', methods.debounce); diff --git a/src/function/methods.js b/src/function/methods.js index 83649213f..f2ed549e9 100644 --- a/src/function/methods.js +++ b/src/function/methods.js @@ -1,3 +1,4 @@ export { default as memoize } from './memoize'; +export { default as once } from './once'; export { default as throttle } from './throttle'; export { default as debounce } from './debounce'; diff --git a/src/function/once.js b/src/function/once.js new file mode 100644 index 000000000..2cca7d873 --- /dev/null +++ b/src/function/once.js @@ -0,0 +1,29 @@ +/** + * Creates a function that will execute only once and store the result. + * + * @extra `once` is useful for creating functions that will cache the result + * of an expensive operation and use it on subsequent calls. Also it + * can be useful for creating initialization functions that only need + * to be run once. + * + * @param {Function} fn - The function to cache. + * + * @example + * + * var fn = logHello.once(); + * runTenTimes(fn); -> logs once + * + **/ +export default function once(fn) { + let val; + let called = false; + return function memoized() { + if (called) { + return val; + } else { + called = true; + val = fn.apply(this, arguments); + return val; + } + } +} diff --git a/src/function/throttle.js b/src/function/throttle.js index 181ef3211..afc747d0b 100644 --- a/src/function/throttle.js +++ b/src/function/throttle.js @@ -18,6 +18,7 @@ const DEFAULT_OPTIONS = { * will receive the first arguments before it was locked, where `debounce` * will receive the last. * + * @param {Function} fn - The function to throttle. * @param {number} ms - The delay to throttle the function by. * @param {Object} [options] - Options to be passed to throttle. * diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index 0b14e674b..45f4a5d3f 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -473,59 +473,6 @@ namespace('Function', function () { }); - method('once', function() { - var fn, count; - - // Simple count - count = 0; - fn = run(function(one, two) { - count++; - }, 'once'); - - fn.call(); - fn.call(); - fn.call(); - - equal(count, 1, 'returning undefined will not affect the number of calls'); - - // Simple arguments - count = 0; - fn = run(function(n) { - count++; - return n + 1; - }, 'once'); - equal(fn(3), 4, 'running with 3 should add 1'); - equal(fn(4), 4, 'running with 4 should remain 4'); - equal(fn(500), 4, 'running with 500 should still be 4'); - // Runs - fn(1); - // Runs - fn(2); - // Cached - fn(3); - equal(count, 1, 'should have run once'); - - // Complex arguments - var obj = { foo: 'bar' }; - count = 0; - fn = run(function(one, two) { - count++; - equal(this, obj, 'scope is properly set'); - equal(one, 'one', 'first argument is passed'); - equal(two, 'two', 'second argument is passed'); - return count * 30; - }, 'once'); - - equal(fn.call(obj, 'one', 'two'), 30, 'first call calculates the result'); - equal(fn.call(obj, 'one', 'two'), 30, 'second call memoizes the result'); - equal(fn.call(obj, 'one', 'two'), 30, 'third call memoizes the result'); - equal(fn.call(obj, 'one', 'two'), 30, 'fourth call memoizes the result'); - equal(fn.call(obj, 'one', 'two'), 30, 'fifth call memoizes the result'); - - equal(count, 1, 'count is only incremented once'); - - }); - method('partial', function() { var format = function(place, last){ diff --git a/test/tests/function.js b/test/tests/function.js index 210d9fbdc..d81417091 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -21,14 +21,14 @@ namespace('Function', function() { describeInstance('memoize', function(memoize) { it('should perform basic caching', function() { - const fn = memoize(captureArgs); + var fn = memoize(captureArgs); assertArrayEqual(fn('a'), ['a']); assertArrayEqual(fn('a', 'b'), ['a']); assertArrayEqual(args, [['a']]); }); it('should use hash function as the cache key', function() { - const fn = memoize(captureArgs, function(i) { + var fn = memoize(captureArgs, function(i) { return i % 2 === 0; }); assertArrayEqual(fn(1), [1]); @@ -52,6 +52,23 @@ namespace('Function', function() { }); + describeInstance('once', function(once) { + + it('should only run once', function() { + var fn = once(captureArgs); + assertArrayEqual(fn('a'), ['a']); + assertArrayEqual(fn('a', 'b'), ['a']); + assertArrayEqual(args, [['a']]); + }); + + it('should receive same args and context', function() { + once(function(a, b, c) { + assertArrayEqual([this, a, b, c], [1,2,3,4]); + }).call(1,2,3,4); + }); + + }); + describeInstance('debounce', function(debounce) { it('should perform basic debounce', function() { From 4ee59d249bc26ed5517c064efd648c8859a9d6f3 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 03:39:14 +0900 Subject: [PATCH 053/191] expose cache on function returned from Function#memoize --- CHANGELOG.md | 1 - src/function/memoize.js | 24 +++++++++++++++--------- test/tests/function.js | 9 +++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94630598d..0aef31d73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,7 +66,6 @@ v3.0.0 TODO: -- Function#memoize expose cache? - Consider asserting types instead of coercion?? - Object.values / Object.entries? - Array#flat/Array#flatMap diff --git a/src/function/memoize.js b/src/function/memoize.js index c25fc7c7f..f4b9fc993 100644 --- a/src/function/memoize.js +++ b/src/function/memoize.js @@ -1,11 +1,10 @@ -import { hasOwnProperty } from '../util/helpers'; - /** * Creates a function that will memoize results for unique calls. * * @extra `memoize` can be thought of as a more powerful `once`. Where `once` * will only call a function once ever, memoized functions will be - * called once per "unique" call, which can be customized. + * called once per "unique" call, which can be customized. Custom cache control + * can also be achieved by the `cache` property on the memoized function. * * @param {Function} fn - The function to memoize. * @param {Function} [hashFn] - The hash function. This function should return @@ -14,7 +13,9 @@ import { hasOwnProperty } from '../util/helpers'; * By default the first argument will coerced to a string and used as the * cache key. * - * @returns {Function} + * @returns {Function} - The returned function will have a `cache` property + * defined on it of type Map, allowing clearing, setting, or removing items + * from the cache. * * @callback hashFn * @param {...any} args - The arguments passed to the input function. @@ -30,15 +31,20 @@ import { hasOwnProperty } from '../util/helpers'; * */ export default function memoize(fn, hashFn) { - const cache = {}; + const cache = new Map(); hashFn = hashFn || defaultHashFn; - return function memoized() { + const memoizedFn = function memoized() { const key = hashFn.apply(this, arguments); - if (hasOwnProperty(cache, key)) { - return cache[key]; + if (cache.has(key)) { + return cache.get(key); + } else { + const val = fn.apply(this, arguments); + cache.set(key, val); + return val; } - return cache[key] = fn.apply(this, arguments); }; + memoizedFn.cache = cache; + return memoizedFn; } function defaultHashFn(arg) { diff --git a/test/tests/function.js b/test/tests/function.js index d81417091..f568fbb65 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -44,6 +44,15 @@ namespace('Function', function() { }).call(1,2,3,4); }); + it('should be able to clear the cache', function() { + var fn = memoize(captureArgs, () => true); + assertArrayEqual(fn('a'), ['a']); + assertArrayEqual(fn('b'), ['a']); + fn.cache.clear(); + assertArrayEqual(fn('b'), ['b']); + assertArrayEqual(fn('c'), ['b']); + }); + it('should pass same args and context to the hash function', function() { memoize(noop, function(a, b, c) { assertArrayEqual([this, a, b, c], [1,2,3,4]); From f7cf8721bce7a05a67b35080215703b33ad80488 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 04:20:03 +0900 Subject: [PATCH 054/191] Added Function#delay --- src/function/debounce.js | 13 ++-- src/function/define.js | 3 +- src/function/delay.js | 26 +++++++ src/function/methods.js | 3 +- src/function/throttle.js | 8 ++- src/function/util/scheduleDelay.js | 23 ++++++ src/util/assertions.js | 24 ++++--- test/OLD/tests/function.js | 37 ---------- test/tests/function.js | 110 ++++++++++++++++++++++++----- 9 files changed, 171 insertions(+), 76 deletions(-) create mode 100644 src/function/delay.js create mode 100644 src/function/util/scheduleDelay.js diff --git a/src/function/debounce.js b/src/function/debounce.js index 9c844dd3e..3f3b427b3 100644 --- a/src/function/debounce.js +++ b/src/function/debounce.js @@ -1,4 +1,4 @@ -import { assertPositiveInteger } from '../util/assertions'; +import { assertFunction, assertPositiveInteger } from '../util/assertions'; /** * Creates a "debounced" function that postpones its execution until @@ -12,6 +12,7 @@ import { assertPositiveInteger } from '../util/assertions'; * supplied, while a throttled function will receive the first. * * @param {Function} fn - The function to debounce. + * @param {number} ms - The delay to debounce the function by. Default is `1`. * * @example * @@ -21,24 +22,24 @@ import { assertPositiveInteger } from '../util/assertions'; * @returns {Function} * */ -export default function debounce(fn, ms = 0) { - +export default function debounce(fn, ms = 1) { + assertFunction(fn); assertPositiveInteger(ms); let timer = null; let returnValue = null; - const debounced = function() { + const debounced = function () { clearTimeout(timer); timer = setTimeout(() => { returnValue = fn.apply(this, arguments); }, ms); return returnValue; - } + }; debounced.cancel = () => { clearTimeout(timer); - } + }; return debounced; } diff --git a/src/function/define.js b/src/function/define.js index 7ace263ef..6d64f17e2 100644 --- a/src/function/define.js +++ b/src/function/define.js @@ -1,7 +1,8 @@ import { defineInstance } from '../core/function'; import * as methods from './methods'; +defineInstance('debounce', methods.debounce); +defineInstance('delay', methods.delay); defineInstance('memoize', methods.memoize); defineInstance('once', methods.once); defineInstance('throttle', methods.throttle); -defineInstance('debounce', methods.debounce); diff --git a/src/function/delay.js b/src/function/delay.js new file mode 100644 index 000000000..de863126b --- /dev/null +++ b/src/function/delay.js @@ -0,0 +1,26 @@ +import scheduleDelay from './util/scheduleDelay'; + +/** + * Executes the function after `ms` milliseconds. + * + * @extra Returns a reference to itself. `delay` is also a way to execute non- + * blocking operations that will wait until the CPU is free. + * + * @param {Function} fn - The function to execute. + * @param {number} [ms] - The number of milliseconds to delay before executing + * the function. Must be a positive integer. Default is `0`. + * @param {...any} [args] - Any arguments passed in after the delay will be + * applied when executing the function. + * + * @returns {Function} - The returned function has a `cancel` method on it that + * will cancel the execution. + * + * @example + * + * logHello.delay(500) -> logs after 500ms + * logArgs.delay(500, 'a') -> logs "a" after 500ms + * + **/ +export default function delay(fn, ms = 0, ...args) { + return scheduleDelay(fn, ms, args); +} diff --git a/src/function/methods.js b/src/function/methods.js index f2ed549e9..0dc5b38de 100644 --- a/src/function/methods.js +++ b/src/function/methods.js @@ -1,4 +1,5 @@ +export { default as debounce } from './debounce'; +export { default as delay } from './delay'; export { default as memoize } from './memoize'; export { default as once } from './once'; export { default as throttle } from './throttle'; -export { default as debounce } from './debounce'; diff --git a/src/function/throttle.js b/src/function/throttle.js index afc747d0b..860fc3b6d 100644 --- a/src/function/throttle.js +++ b/src/function/throttle.js @@ -1,4 +1,5 @@ import { + assertFunction, assertPositiveInteger, assertPositiveIntegerOrInfinity, } from '../util/assertions'; @@ -19,7 +20,7 @@ const DEFAULT_OPTIONS = { * will receive the last. * * @param {Function} fn - The function to throttle. - * @param {number} ms - The delay to throttle the function by. + * @param {number} ms - The delay to throttle the function by. Default is `1`. * @param {Object} [options] - Options to be passed to throttle. * * @param {number} [options.limit = 1] - The number of executions allowed before @@ -35,14 +36,15 @@ const DEFAULT_OPTIONS = { * @returns {Function} * */ -export default function throttle(fn, ms = 0, options) { +export default function throttle(fn, ms = 1, options) { + assertFunction(fn); + assertPositiveInteger(ms); const opt = { ...DEFAULT_OPTIONS, ...options, }; - assertPositiveInteger(ms); assertPositiveIntegerOrInfinity(opt.limit); const queue = []; diff --git a/src/function/util/scheduleDelay.js b/src/function/util/scheduleDelay.js new file mode 100644 index 000000000..f91d9a913 --- /dev/null +++ b/src/function/util/scheduleDelay.js @@ -0,0 +1,23 @@ +import { assertNonNegativeInteger } from '../../util/assertions'; + +export default function scheduleDelay(fn, ms, args = []) { + assertNonNegativeInteger(ms); + + if (!fn.timers) { + fn.timers = []; + } + if (!fn.cancel) { + fn.cancel = () => { + for (let timer of fn.timers) { + clearTimeout(timer); + } + fn.timers = []; + }; + } + fn.timers.push( + setTimeout(() => { + fn.apply(null, args); + }, ms) + ); + return fn; +} diff --git a/src/util/assertions.js b/src/util/assertions.js index 14f54010e..93f4e3d9a 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -13,49 +13,55 @@ function usesScientificNotation(n) { export function assertString(str) { if (!isString(str)) { - throw new TypeError(str + ' is not a string'); + throw new TypeError(`${str} is not a string`); } } export function assertNumber(n) { if (!n && n !== 0) { - throw new TypeError(n + ' is not a valid number'); + throw new TypeError(`${n} is not a valid number`); } } export function assertPositiveNumber(n) { if (n <= 0) { - throw new TypeError(n + ' is not a positive number'); + throw new TypeError(`${n} is not a positive number`); } } export function assertFinite(n) { if (!Number.isFinite(n)) { - throw new TypeError(n + ' is not a finite number'); + throw new TypeError(`${n} is not a finite number`); } } export function assertInteger(n) { if (!Number.isInteger(n)) { - throw new TypeError(n + ' is not an integer'); + throw new TypeError(`${n} is not an integer`); } } export function assertPositiveInteger(n) { if (!Number.isInteger(n) || n <= 0) { - throw new TypeError(n + ' is not a positive integer'); + throw new TypeError(`${n} is not a positive integer`); + } +} + +export function assertNonNegativeInteger(n) { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError(`${n} is not a non-negative integer`); } } export function assertPositiveIntegerOrInfinity(n) { if ((!Number.isInteger(n) || n <= 0) && n !== Infinity) { - throw new TypeError(n + ' is not a positive integer or Infinity'); + throw new TypeError(`${n} is not a positive integer or Infinity`); } } export function assertDecimal(n) { if (!Number.isFinite(n) || usesScientificNotation(n)) { - throw new TypeError(n + ' cannot be represented as a decimal'); + throw new TypeError(`${n} cannot be represented as a decimal`); } } @@ -65,7 +71,7 @@ export function assertArgument(exists) { } } -export function assertCallable(obj) { +export function assertFunction(obj) { if (!isFunction(obj)) { throw new TypeError('Function is not callable'); } diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index 45f4a5d3f..dc41e71d2 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -52,43 +52,6 @@ namespace('Function', function () { clock.restore(); }); - method('delay', function() { - var fn, ret, count; - count = 0; - fn = function() { - count++; - } - run(fn, 'delay', []); - clock.tick(1); - equal(count, 1, 'no arguments should be equal to 1ms'); - - clock.reset(); - count = 0; - fn = function(one, two) { - count++; - equal(this, fn, 'this object should be the function'); - equal(one, 'one', 'first parameter'); - equal(two, 'two', 'second parameter'); - }; - equal(getTimers(fn), undefined, 'timers object should not exist yet'); - ret = run(fn, 'delay', [20, 'one', 'two']); - equal(typeof getTimers(fn), 'object', 'timers object should be exposed'); - equal(typeof ret, 'function', 'returns the function'); - equal(count, 0, 'should not have run yet'); - clock.tick(20); - equal(count, 1, 'should have run once'); - equal(getTimers(fn).length, 1, 'timers are not cleared after execution'); - - count = 0; - fn = function() { - count++; - } - run(fn, 'delay', []); - clock.tick(1); - equal(count, 1, 'no arguments should be equal to 1ms'); - - }); - method('cancel', function() { var fn, ref, count; diff --git a/test/tests/function.js b/test/tests/function.js index f568fbb65..a7ad0fd58 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -2,7 +2,7 @@ namespace('Function', function() { - let args; + var args; function captureArgs() { var arr = Array.from(arguments); @@ -45,7 +45,7 @@ namespace('Function', function() { }); it('should be able to clear the cache', function() { - var fn = memoize(captureArgs, () => true); + var fn = memoize(captureArgs, function() { return true; }); assertArrayEqual(fn('a'), ['a']); assertArrayEqual(fn('b'), ['a']); fn.cache.clear(); @@ -81,7 +81,7 @@ namespace('Function', function() { describeInstance('debounce', function(debounce) { it('should perform basic debounce', function() { - const fn = debounce(captureArgs, 200); + var fn = debounce(captureArgs, 200); fn('a'); fn('b'); fn('c'); @@ -94,7 +94,7 @@ namespace('Function', function() { }); it('should be able to cancel', function() { - const fn = debounce(captureArgs, 200); + var fn = debounce(captureArgs, 200); fn('a'); fn('b'); assertArrayEqual(args, []); @@ -104,7 +104,7 @@ namespace('Function', function() { }); it('should be able to cancel after first execution', function() { - const fn = debounce(captureArgs, 200); + var fn = debounce(captureArgs, 200); fn('a'); clock.tick(200); assertArrayEqual(args, [['a']]); @@ -116,7 +116,7 @@ namespace('Function', function() { it('should retain the last value when called repeatedly', function() { // Note this differs from throttle with limit 1 - const fn = debounce(captureArgs, 200, { + var fn = debounce(captureArgs, 200, { limit: 1 }); fn('a'); @@ -128,6 +128,20 @@ namespace('Function', function() { assertArrayEqual(args, [['c'],['d']]); }); + it('should default to 1ms', function() { + var fn = debounce(captureArgs); + fn('a'); + clock.tick(1); + assertArrayEqual(args, [['a']]); + }); + + it('should handle irregular input', function() { + assertError(function() { debounce() }); + assertError(function() { debounce(captureArgs, 0) }); + assertError(function() { debounce(captureArgs, 'str') }); + assertError(function() { debounce(captureArgs, null) }); + assertError(function() { debounce(captureArgs, NaN) }); + }); }); @@ -135,8 +149,15 @@ namespace('Function', function() { describe('No Args', function() { + it('should default to 1ms', function() { + var fn = throttle(captureArgs); + fn('a'); + clock.tick(1); + assertArrayEqual(args, [['a']]); + }); + it('should queue execution with default arguments', function() { - const fn = throttle(captureArgs, 200); + var fn = throttle(captureArgs, 200); fn('a'); fn('b'); assertArrayEqual(args, []); @@ -147,7 +168,7 @@ namespace('Function', function() { }); it('should return value from last completed execution', function() { - const fn = throttle(captureArgs, 200); + var fn = throttle(captureArgs, 200); assertEqual(fn('a'), null); clock.tick(200); assertArrayEqual(fn('b'), ['a']); @@ -158,7 +179,7 @@ namespace('Function', function() { }); it('should pass all arguments to execution', function() { - const fn = throttle(captureArgs, 200); + var fn = throttle(captureArgs, 200); fn('a','b','c'); clock.tick(200); assertArrayEqual(args, [['a','b','c']]); @@ -169,7 +190,7 @@ namespace('Function', function() { describe('Limit option', function() { it('should not queue beyond limit', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { limit: 2 }); fn('a'); @@ -187,7 +208,7 @@ namespace('Function', function() { it('should retain the first value when called repeatedly', function() { // Note this differs from debounce - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { limit: 1 }); fn('a'); @@ -204,7 +225,7 @@ namespace('Function', function() { describe('Immediate Option', function() { it('should allow firing immediately', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { immediate: true }); fn('a'); @@ -217,7 +238,7 @@ namespace('Function', function() { }); it('should continue firing immediately after timeout', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { immediate: true }); fn('a'); @@ -228,7 +249,7 @@ namespace('Function', function() { }); it('should queue functions after first release', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { immediate: true }); fn('a'); @@ -242,7 +263,7 @@ namespace('Function', function() { }); it('should lock an immediate function with limit of 1', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { limit: 1, immediate: true }); @@ -261,7 +282,7 @@ namespace('Function', function() { describe('Canceling', function() { it('should cancel a lazy function', function() { - const fn = throttle(captureArgs, 200); + var fn = throttle(captureArgs, 200); fn('a'); fn.cancel(); clock.tick(200); @@ -269,7 +290,7 @@ namespace('Function', function() { }); it('should cancel a lazy function after first execution', function() { - const fn = throttle(captureArgs, 200); + var fn = throttle(captureArgs, 200); fn('a'); fn('b'); clock.tick(200); @@ -279,7 +300,7 @@ namespace('Function', function() { }); it('should cancel an immediate function', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { immediate: true }); fn('a'); @@ -291,7 +312,7 @@ namespace('Function', function() { }); it('should cancel immediate function after first execution', function() { - const fn = throttle(captureArgs, 200, { + var fn = throttle(captureArgs, 200, { immediate: true }); fn('a'); @@ -325,6 +346,57 @@ namespace('Function', function() { }); + it('should handle irregular input', function() { + assertError(function() { throttle() }); + assertError(function() { throttle(captureArgs, 'str') }); + assertError(function() { throttle(captureArgs, null) }); + assertError(function() { throttle(captureArgs, NaN) }); + }); + + }); + + describeInstance('delay', function(delay) { + + var fn; + + beforeEach(function() { + fn = function() { + return captureArgs.apply(this, arguments); + }; + }); + + it('should delay execution of the function for 1s', function() { + delay(fn, 1000, 'a'); + assertArrayEqual(args, []); + clock.tick(1000); + assertArrayEqual(args, [['a']]); + clock.tick(1000); + assertArrayEqual(args, [['a']]); + }); + + it('should default to 0ms with no args', function() { + delay(fn); + assertArrayEqual(args, []); + clock.tick(100); + assertArrayEqual(args, [[]]); + }); + + it('should be cancelable', function() { + delay(fn, 1000, 'a'); + assertArrayEqual(args, []); + fn.cancel(); + clock.tick(1000); + assertArrayEqual(args, []); + assertArrayEqual(fn.timers, []); + }); + + it('should handle irregular input', function() { + assertError(function() { delay() }); + assertError(function() { delay(fn, 'str') }); + assertError(function() { delay(fn, null) }); + assertError(function() { delay(fn, NaN) }); + }); + }); }); From 376d3dcf3bd554bb7d4d82714ce9c322b5133e69 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 05:20:51 +0900 Subject: [PATCH 055/191] better handling of irregular number input --- src/number/abs.js | 2 +- src/number/log.js | 2 +- src/number/toChar.js | 7 + src/number/util/clamp.js | 10 +- src/number/util/coerce.js | 3 + src/number/util/isMultipleOf.js | 5 + src/number/util/math.js | 1 + src/util/assertions.js | 10 +- test/tests/number.js | 256 +++++++++++++++++++++++--------- 9 files changed, 220 insertions(+), 76 deletions(-) create mode 100644 src/number/util/coerce.js diff --git a/src/number/abs.js b/src/number/abs.js index 7daf88b8b..0c784a844 100644 --- a/src/number/abs.js +++ b/src/number/abs.js @@ -3,5 +3,5 @@ export default function abs(n) { // very strange bug in iOS7 that only occurs occasionally // in which Math.abs() called on non-primitive numbers // returns a completely different number (Issue #400) - return Math.abs(n.valueOf()); + return Math.abs((+n).valueOf()); } diff --git a/src/number/log.js b/src/number/log.js index b75f6efdd..d28cf56cd 100644 --- a/src/number/log.js +++ b/src/number/log.js @@ -1,6 +1,6 @@ export default function log(n, base) { let log = Math.log(n); - if (base) { + if (arguments.length > 1) { log /= Math.log(base); } return log; diff --git a/src/number/toChar.js b/src/number/toChar.js index 7358a4969..d8ef8b3a3 100644 --- a/src/number/toChar.js +++ b/src/number/toChar.js @@ -1,4 +1,11 @@ +import { assertNonNegativeInteger } from '../util/assertions'; + export default function toChar(n) { + if (n != null) { + n = +n; + } + assertNonNegativeInteger(n); + // Note that fromCharCode was historically 2x faster than // fromCodePoint, however this no longer seems to be the case. // https://jsperf.com/fromcharcode-vs-fromcodepoint/6 diff --git a/src/number/util/clamp.js b/src/number/util/clamp.js index f7b34128f..2da01fb5c 100644 --- a/src/number/util/clamp.js +++ b/src/number/util/clamp.js @@ -1,8 +1,10 @@ import { isNumber } from '../../util/typeChecks'; import { assertNumber } from '../../util/assertions'; +import coerce from './coerce'; export default function(n, ...args) { const [min, max] = collectArgs(args); + n = coerce(n); assertNumber(n); if (isNumber(min)) { n = Math.max(n, min); @@ -14,8 +16,14 @@ export default function(n, ...args) { } function collectArgs(args) { + let min, max; if (args.length === 2) { + min = args[0]; + max = args[1]; return [args[0], args[1]]; + } else { + min = null; + max = args[0]; } - return [null, args[0]]; + return [coerce(min), coerce(max)]; } diff --git a/src/number/util/coerce.js b/src/number/util/coerce.js new file mode 100644 index 000000000..905bd02d8 --- /dev/null +++ b/src/number/util/coerce.js @@ -0,0 +1,3 @@ +export default function(n) { + return n != null ? +n : n; +} diff --git a/src/number/util/isMultipleOf.js b/src/number/util/isMultipleOf.js index 36fe55fe7..787e5d454 100644 --- a/src/number/util/isMultipleOf.js +++ b/src/number/util/isMultipleOf.js @@ -1,3 +1,8 @@ +import { isNumber } from '../../util/typeChecks'; + export default function isMultipleOf(n1, n2) { + if (!isNumber(n1) || !isNumber(n2)) { + return false; + } return n1 % n2 === 0; } diff --git a/src/number/util/math.js b/src/number/util/math.js index 16f108dc4..c0862db6f 100644 --- a/src/number/util/math.js +++ b/src/number/util/math.js @@ -1,5 +1,6 @@ function alias(fn) { return function(n, place) { + if (!place) { return fn(n); } diff --git a/src/util/assertions.js b/src/util/assertions.js index 93f4e3d9a..92416e8eb 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -1,4 +1,10 @@ -import { isArray, isString, isFunction, isPrimitive } from './typeChecks'; +import { + isArray, + isString, + isNumber, + isFunction, + isPrimitive, +} from './typeChecks'; const MIN = 1e-6; const MAX = 1e21; @@ -18,7 +24,7 @@ export function assertString(str) { } export function assertNumber(n) { - if (!n && n !== 0) { + if (!isNumber(n)) { throw new TypeError(`${n} is not a valid number`); } } diff --git a/test/tests/number.js b/test/tests/number.js index b545f1005..b791aa51a 100644 --- a/test/tests/number.js +++ b/test/tests/number.js @@ -131,6 +131,12 @@ namespace('Number', function() { assertEqual(round(1e-21, -1), 0); }); + it('should handle irregular input', function() { + assertNaN(round()); + assertEqual(round('8'), 8); + assertEqual(round(null), 0); + }); + }); describeInstance('ceil', function(ceil) { @@ -151,6 +157,12 @@ namespace('Number', function() { assertEqual(ceil(4417.1318, -3), 5000); }); + it('should handle irregular input', function() { + assertNaN(ceil()); + assertEqual(ceil('8'), 8); + assertEqual(ceil(null), 0); + }); + }); describeInstance('floor', function(floor) { @@ -172,6 +184,12 @@ namespace('Number', function() { assertEqual(floor(4417.1318, [-3]), 4000); }); + it('should handle irregular input', function() { + assertNaN(floor()); + assertEqual(floor('8'), 8); + assertEqual(floor(null), 0); + }); + }); describeInstance('trunc', function(trunc) { @@ -187,6 +205,12 @@ namespace('Number', function() { assertEqual(trunc(-5.25, 2), -5.25); }); + it('should handle irregular input', function() { + assertNaN(trunc()); + assertEqual(trunc('8'), 8); + assertEqual(trunc(null), 0); + }); + }); describeInstance('abs', function(abs) { @@ -198,6 +222,12 @@ namespace('Number', function() { assertEqual(abs(3.324), 3.324); }); + it('should handle irregular input', function() { + assertNaN(abs()); + assertEqual(abs('8'), 8); + assertEqual(abs(null), 0); + }); + }); describeInstance('pow', function(pow) { @@ -211,6 +241,14 @@ namespace('Number', function() { assertEqual(pow(3), NaN); }); + it('should handle irregular input', function() { + assertNaN(pow()); + assertNaN(pow('8')); + assertNaN(pow(null)); + assertEqual(pow(2, '8'), 256); + assertEqual(pow(2, null), 1); + }); + }); describeInstance('log', function(log) { @@ -222,6 +260,18 @@ namespace('Number', function() { assertEqual(log(Math.E), 1); }); + it('should get natural log of numbers', function() { + assertEqual(log(1), 0); + }); + + it('should handle irregular input', function() { + assertNaN(log()); + assertEqual(log('1'), 0); + assertEqual(log(null), -Infinity); + assertEqual(log(64, '2'), 6); + assertEqual(log(64, null), -0); + }); + }); describeInstance('sqrt', function(sqrt) { @@ -231,6 +281,12 @@ namespace('Number', function() { assertEqual(sqrt(1024), 32); }); + it('should handle irregular input', function() { + assertNaN(sqrt()); + assertEqual(sqrt('9'), 3); + assertEqual(sqrt(null), 0); + }); + }); describeInstance('toChar', function(toChar) { @@ -239,10 +295,20 @@ namespace('Number', function() { assertEqual(toChar(65), 'A'); assertEqual(toChar(24536), '忘'); assertEqual(toChar(20294), '但'); - assertError(function() { toChar(NaN); }, RangeError); - assertError(function() { toChar(-1); }, RangeError); - assertError(function() { toChar(.5); }, RangeError); - assertError(function() { toChar(0x110000); }, RangeError); + }); + + it('should error on invalid input', function() { + assertError(function() { toChar(); }); + assertError(function() { toChar(null); }); + assertError(function() { toChar(undefined); }); + assertError(function() { toChar(NaN); }); + assertError(function() { toChar(-1); }); + assertError(function() { toChar(.5); }); + assertError(function() { toChar(0x110000); }); + }); + + it('should handle irregular input', function() { + assertEqual(toChar('65'), 'A'); }); }); @@ -279,10 +345,12 @@ namespace('Number', function() { assertEqual(clamp(5), 5); }); - it('should raise errors on invalid', function() { - assertError(function() { clamp(NaN); }); + it('should handle irregular input', function() { + assertError(function() { clamp(); }); assertError(function() { clamp(null); }); - assertError(function() { clamp(undefined); }); + assertEqual(clamp('8'), 8); + assertEqual(clamp(8, '5'), 5); + assertEqual(clamp(8, null), 8); }); }); @@ -290,19 +358,28 @@ namespace('Number', function() { describeInstance('isMultipleOf', function(isMultipleOf) { it('should should determine if multiple', function() { - assertEqual(isMultipleOf(2, 2), true); - assertEqual(isMultipleOf(6, 2), true); - assertEqual(isMultipleOf(100, 2), true); - assertEqual(isMultipleOf(2, 100), false); - assertEqual(isMultipleOf(100, -2), true); - assertEqual(isMultipleOf(6, -2), true); - assertEqual(isMultipleOf(6, 3), true); - assertEqual(isMultipleOf(7, 3), false); - assertEqual(isMultipleOf(2.5, 1.25), true); - assertEqual(isMultipleOf(2, 'a'), false); - assertEqual(isMultipleOf(2, /af/), false); - assertEqual(isMultipleOf(2, null), false); - assertEqual(isMultipleOf(2), false); + assertTrue(isMultipleOf(2, 2)); + assertTrue(isMultipleOf(6, 2)); + assertTrue(isMultipleOf(100, 2)); + assertFalse(isMultipleOf(2, 100)); + assertTrue(isMultipleOf(100, -2)); + assertTrue(isMultipleOf(6, -2)); + assertTrue(isMultipleOf(6, 3)); + assertFalse(isMultipleOf(7, 3)); + assertTrue(isMultipleOf(2.5, 1.25)); + assertFalse(isMultipleOf(2, 'a')); + assertFalse(isMultipleOf(2, /af/)); + assertFalse(isMultipleOf(2, null)); + assertFalse(isMultipleOf(2)); + }); + + it('should handle irregular input', function() { + assertFalse(isMultipleOf()); + assertFalse(isMultipleOf('8')); + assertFalse(isMultipleOf(null)); + assertFalse(isMultipleOf(8)); + assertFalse(isMultipleOf(8, '2')); + assertFalse(isMultipleOf(8, null)); }); }); @@ -310,15 +387,21 @@ namespace('Number', function() { describeInstance('isOdd', function(isOdd) { it('should determine if odd', function() { - assertEqual(isOdd(0), false); - assertEqual(isOdd(1), true); - assertEqual(isOdd(2), false); - assertEqual(isOdd(24), false); - assertEqual(isOdd(200), false); - assertEqual(isOdd(1.1), false); - assertEqual(isOdd(NaN), false); - assertEqual(isOdd(Infinity), false); - assertEqual(isOdd(-Infinity), false); + assertFalse(isOdd(0)); + assertTrue(isOdd(1)); + assertFalse(isOdd(2)); + assertFalse(isOdd(24)); + assertFalse(isOdd(200)); + assertFalse(isOdd(1.1)); + assertFalse(isOdd(NaN)); + assertFalse(isOdd(Infinity)); + assertFalse(isOdd(-Infinity)); + }); + + it('should handle irregular input', function() { + assertFalse(isOdd()); + assertFalse(isOdd('7')); + assertFalse(isOdd(null)); }); }); @@ -326,15 +409,21 @@ namespace('Number', function() { describeInstance('isEven', function(isEven) { it('should determine if even', function() { - assertEqual(isEven(0), true); - assertEqual(isEven(1), false); - assertEqual(isEven(2), true); - assertEqual(isEven(24), true); - assertEqual(isEven(200), true); - assertEqual(isEven(1.1), false); - assertEqual(isEven(NaN), false); - assertEqual(isEven(Infinity), false); - assertEqual(isEven(-Infinity), false); + assertTrue(isEven(0)); + assertFalse(isEven(1)); + assertTrue(isEven(2)); + assertTrue(isEven(24)); + assertTrue(isEven(200)); + assertFalse(isEven(1.1)); + assertFalse(isEven(NaN)); + assertFalse(isEven(Infinity)); + assertFalse(isEven(-Infinity)); + }); + + it('should handle irregular input', function() { + assertFalse(isEven()); + assertFalse(isEven('8')); + assertFalse(isEven(null)); }); }); @@ -394,12 +483,18 @@ namespace('Number', function() { describeInstance('isInteger', function(isInteger) { it('should find integers', function() { - assertEqual(isInteger(15), true); - assertEqual(isInteger(15.2), false); - assertEqual(isInteger(15.2668), false); - assertEqual(isInteger(15.0), true); - assertEqual(isInteger('15'), false); - assertEqual(isInteger('15.8'), false); + assertTrue(isInteger(15)); + assertFalse(isInteger(15.2)); + assertFalse(isInteger(15.2668)); + assertTrue(isInteger(15.0)); + assertFalse(isInteger('15')); + assertFalse(isInteger('15.8')); + }); + + it('should handle irregular input', function() { + assertFalse(isInteger()); + assertFalse(isInteger('8')); + assertFalse(isInteger(null)); }); }); @@ -407,12 +502,18 @@ namespace('Number', function() { describeInstance('isSafeInteger', function(isSafeInteger) { it('should find safe integers', function() { - assertEqual(isSafeInteger(-0), true); - assertEqual(isSafeInteger(0), true); - assertEqual(isSafeInteger(1), true); - assertEqual(isSafeInteger(1e255), false); - assertEqual(isSafeInteger(NaN), false); - assertEqual(isSafeInteger(Infinity), false); + assertTrue(isSafeInteger(-0)); + assertTrue(isSafeInteger(0)); + assertTrue(isSafeInteger(1)); + assertFalse(isSafeInteger(1e255)); + assertFalse(isSafeInteger(NaN)); + assertFalse(isSafeInteger(Infinity)); + }); + + it('should handle irregular input', function() { + assertFalse(isSafeInteger()); + assertFalse(isSafeInteger('8')); + assertFalse(isSafeInteger(null)); }); }); @@ -420,23 +521,36 @@ namespace('Number', function() { describeInstance('isFinite', function(isFinite) { it('should return true for finite numbers', function() { - assertEqual(isFinite(-0), true); - assertEqual(isFinite(0), true); - assertEqual(isFinite(1), true); - assertEqual(isFinite(1e255), true); - assertEqual(isFinite(NaN), false); - assertEqual(isFinite(Infinity), false); - assertEqual(isFinite(-Infinity), false); + assertTrue(isFinite(-0)); + assertTrue(isFinite(0)); + assertTrue(isFinite(1)); + assertTrue(isFinite(1e255)); + assertFalse(isFinite(NaN)); + assertFalse(isFinite(Infinity)); + assertFalse(isFinite(-Infinity)); }); + + it('should handle irregular input', function() { + assertFalse(isFinite()); + assertFalse(isFinite('8')); + assertFalse(isFinite(null)); + }); + }); describeInstance('isNaN', function(isNaN) { it('should return true for NaN', function() { - assertEqual(isNaN(1), false); - assertEqual(isNaN(NaN), true); - assertEqual(isNaN(Infinity), false); - assertEqual(isNaN(-Infinity), false); + assertFalse(isNaN(1)); + assertTrue(isNaN(NaN)); + assertFalse(isNaN(Infinity)); + assertFalse(isNaN(-Infinity)); + }); + + it('should handle irregular input', function() { + assertFalse(isNaN()); + assertFalse(isNaN('8')); + assertFalse(isNaN(null)); }); }); @@ -463,16 +577,6 @@ namespace('Number', function() { assertCount(10, 10); }); - it('should error on invalid input', function() { - assertInvalidInput(-1); - assertInvalidInput(1.5); - assertInvalidInput(NaN); - assertInvalidInput(null); - assertInvalidInput(undefined); - assertInvalidInput(Infinity); - assertInvalidInput(-Infinity); - }); - it('should produce correct return values', function() { assertArrayEqual(times(3, function(i) { return Math.pow(2, i); @@ -487,6 +591,16 @@ namespace('Number', function() { assertError(function() { times(1); }); }); + it('should error on invalid input', function() { + assertInvalidInput(-1); + assertInvalidInput(1.5); + assertInvalidInput(NaN); + assertInvalidInput(null); + assertInvalidInput(undefined); + assertInvalidInput(Infinity); + assertInvalidInput(-Infinity); + }); + }); describeInstance('format', function(format) { From c683733b994246c1295ba9fa7389fbbac4016864 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 16:13:56 +0900 Subject: [PATCH 056/191] Changed immediate option to true on Function#throttle and better docs. --- CHANGELOG.md | 1 + package.json | 2 +- src/function/throttle.js | 31 ++++----- test/tests/function.js | 134 +++++++++++++++++++++++++-------------- yarn.lock | 8 +-- 5 files changed, 110 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aef31d73..9e7ea1e44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ v3.0.0 - Removed `String#forEach`. Use `String#match` instead. - Renamed `String#escapeURL` to `String#encodeUrl` and `String#encodeUrlParam`. - Renamed `String#unesacpeURL` to `String#decodeUrl` and `String#decodeUrlParam`. +- Changed `Function#throttle` to always execute immediately before locking. TODO: diff --git a/package.json b/package.json index 45ac830db..70dab9ef6 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.31", + "ready-test": "^1.0.32", "sinon": "^7.5.0", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/function/throttle.js b/src/function/throttle.js index 860fc3b6d..db305b271 100644 --- a/src/function/throttle.js +++ b/src/function/throttle.js @@ -6,26 +6,28 @@ import { const DEFAULT_OPTIONS = { limit: Infinity, - immediate: false, + immediate: true, }; /** * Creates a "throttled" version of the function that will only be executed - * `limit` times per `ms` milliseconds. `throttle` is useful when multiple - * heavy operations need to be spaced out or execution of a function needs - * to be locked for a given time period. + * once per `ms` milliseconds. * - * Note that `throttle` is subtly different to `debounce`, as the function - * will receive the first arguments before it was locked, where `debounce` - * will receive the last. + * @extra `throttle` is useful when multiple heavy operations need to be spaced + * out or execution of a function needs to be locked for a given time period. * * @param {Function} fn - The function to throttle. * @param {number} ms - The delay to throttle the function by. Default is `1`. * @param {Object} [options] - Options to be passed to throttle. * - * @param {number} [options.limit = 1] - The number of executions allowed before - * waiting. - * @param {string} [options.immediate = false] - Whether to perform the initial + * @param {number} [options.limit = Infinity] - The number of executions allowed + * in the queue while waiting. Set this option to a finite number if + * operations can be disregarded, effectively "locking" execution. Note that + * although debounce is nearly identical to a throttled function with a limit + * of `1`, the behavior is subtly different in that debounce will always take + * the arguments of the last execution, where a limit of `1` here will + * disregard them. + * @param {boolean} [options.immediate = true] - Whether to perform the initial * execution immediately before waiting. * * @example @@ -56,9 +58,9 @@ export default function throttle(fn, ms = 1, options) { const queuedFn = queue.shift(); if (queuedFn) { returnValue = queuedFn(); - } - if (queue.length) { - wait(); + if (queue.length || opt.immediate) { + wait(); + } } } @@ -75,11 +77,10 @@ export default function throttle(fn, ms = 1, options) { const throttled = function() { if (opt.immediate && !isWaiting()) { returnValue = fn.apply(this, arguments); - wait(); } else if (queue.length < opt.limit - (opt.immediate ? 1 : 0)) { queue.push(fn.bind(this, ...arguments)); - wait(); } + wait(); return returnValue; }; diff --git a/test/tests/function.js b/test/tests/function.js index a7ad0fd58..91545e06f 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -12,6 +12,7 @@ namespace('Function', function() { beforeEach(function() { args = []; + clock.reset(); }); afterEach(function() { @@ -147,35 +148,50 @@ namespace('Function', function() { describeInstance('throttle', function(throttle) { - describe('No Args', function() { + describe('no args', function() { it('should default to 1ms', function() { var fn = throttle(captureArgs); fn('a'); - clock.tick(1); + fn('b'); assertArrayEqual(args, [['a']]); + clock.tick(1); + assertArrayEqual(args, [['a'], ['b']]); }); it('should queue execution with default arguments', function() { var fn = throttle(captureArgs, 200); fn('a'); fn('b'); - assertArrayEqual(args, []); + fn('c'); + assertArrayEqual(args, [['a']]); clock.tick(200); + assertArrayEqual(args, [['a'], ['b']]); + clock.tick(200); + assertArrayEqual(args, [['a'], ['b'], ['c']]); + }); + + it('should remain locked white executions still queued', function() { + var fn = throttle(captureArgs, 200); + fn('a'); + fn('b'); assertArrayEqual(args, [['a']]); clock.tick(200); - assertArrayEqual(args, [['a'],['b']]); + assertArrayEqual(args, [['a'], ['b']]); + fn('c'); + assertArrayEqual(args, [['a'], ['b']]); + clock.tick(200); + assertArrayEqual(args, [['a'], ['b'], ['c']]); }); it('should return value from last completed execution', function() { var fn = throttle(captureArgs, 200); - assertEqual(fn('a'), null); - clock.tick(200); + assertArrayEqual(fn('a'), ['a']); assertArrayEqual(fn('b'), ['a']); clock.tick(200); assertArrayEqual(fn('c'), ['b']); clock.tick(200); - assertArrayEqual(args, [['a'],['b'],['c']]); + assertArrayEqual(fn('d'), ['c']); }); it('should pass all arguments to execution', function() { @@ -187,7 +203,7 @@ namespace('Function', function() { }); - describe('Limit option', function() { + describe('limit', function() { it('should not queue beyond limit', function() { var fn = throttle(captureArgs, 200, { @@ -197,13 +213,13 @@ namespace('Function', function() { fn('b'); fn('c'); fn('d'); - assertArrayEqual(args, []); - clock.tick(200); assertArrayEqual(args, [['a']]); clock.tick(200); assertArrayEqual(args, [['a'],['b']]); clock.tick(200); assertArrayEqual(args, [['a'],['b']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); }); it('should retain the first value when called repeatedly', function() { @@ -214,58 +230,58 @@ namespace('Function', function() { fn('a'); fn('b'); fn('c'); - clock.tick(200); + assertArrayEqual(args, [['a']]); assertArrayEqual(fn('d'), ['a']); clock.tick(200); - assertArrayEqual(args, [['a'],['d']]); + assertArrayEqual(fn('e'), ['e']); + clock.tick(200); + assertArrayEqual(args, [['a'], ['e']]); }); }); - describe('Immediate Option', function() { + describe('immediate', function() { - it('should allow firing immediately', function() { - var fn = throttle(captureArgs, 200, { - immediate: true - }); + it('should be immediate by default', function() { + var fn = throttle(captureArgs, 200); + assertArrayEqual(args, []); fn('a'); + assertArrayEqual(args, [['a']]); fn('b'); assertArrayEqual(args, [['a']]); clock.tick(200); - assertArrayEqual(args, [['a'],['b']]); + assertArrayEqual(args, [['a'], ['b']]); + fn('c'); + assertArrayEqual(args, [['a'], ['b']]); clock.tick(200); - assertArrayEqual(args, [['a'],['b']]); + assertArrayEqual(args, [['a'], ['b'], ['c']]); }); it('should continue firing immediately after timeout', function() { - var fn = throttle(captureArgs, 200, { - immediate: true - }); + var fn = throttle(captureArgs, 200); fn('a'); assertArrayEqual(args, [['a']]); clock.tick(200); fn('b'); - assertArrayEqual(args, [['a'],['b']]); + assertArrayEqual(args, [['a'], ['b']]); }); it('should queue functions after first release', function() { - var fn = throttle(captureArgs, 200, { - immediate: true - }); + var fn = throttle(captureArgs, 200); fn('a'); + assertArrayEqual(args, [['a']]); clock.tick(200); assertArrayEqual(args, [['a']]); fn('b'); fn('c'); - assertArrayEqual(args, [['a'],['b']]); + assertArrayEqual(args, [['a'], ['b']]); clock.tick(200); - assertArrayEqual(args, [['a'],['b'],['c']]); + assertArrayEqual(args, [['a'], ['b'], ['c']]); }); it('should lock an immediate function with limit of 1', function() { var fn = throttle(captureArgs, 200, { limit: 1, - immediate: true }); fn('a'); assertArrayEqual(args, [['a']]); @@ -277,51 +293,77 @@ namespace('Function', function() { assertArrayEqual(args, [['a']]); }); - }); - - describe('Canceling', function() { - - it('should cancel a lazy function', function() { - var fn = throttle(captureArgs, 200); + it('should be able to defer execution', function() { + var fn = throttle(captureArgs, 200, { + immediate: false + }); fn('a'); - fn.cancel(); - clock.tick(200); assertArrayEqual(args, []); + fn('b'); + assertArrayEqual(args, []); + clock.tick(200); + assertArrayEqual(args, [['a']]); + clock.tick(200); + assertArrayEqual(args, [['a'],['b']]); }); - it('should cancel a lazy function after first execution', function() { - var fn = throttle(captureArgs, 200); + it('should lock a deferred function with limit of 1', function() { + var fn = throttle(captureArgs, 200, { + limit: 1, + immediate: false, + }); fn('a'); + assertArrayEqual(args, []); fn('b'); + assertArrayEqual(args, []); + fn('c'); + assertArrayEqual(args, []); clock.tick(200); + assertArrayEqual(args, [['a']]); + }); + + }); + + describe('canceling', function() { + + it('should cancel second execution of an immediate function', function() { + var fn = throttle(captureArgs, 200); + fn('a'); fn.cancel(); + fn('b'); clock.tick(200); assertArrayEqual(args, [['a']]); }); - it('should cancel an immediate function', function() { + it('should cancel first execution of deferred function', function() { var fn = throttle(captureArgs, 200, { - immediate: true + immediate: false, }); fn('a'); + fn.cancel(); + clock.tick(200); + assertArrayEqual(args, []); + }); + + it('should cancel immediate function after being queued', function() { + var fn = throttle(captureArgs, 200); + fn('a'); fn('b'); - assertArrayEqual(args, [['a']]); fn.cancel(); clock.tick(200); assertArrayEqual(args, [['a']]); }); - it('should cancel immediate function after first execution', function() { + it('should cancel deferred function after being queued', function() { var fn = throttle(captureArgs, 200, { - immediate: true + immediate: false, }); fn('a'); fn('b'); - fn('c'); clock.tick(200); fn.cancel(); clock.tick(200); - assertArrayEqual(args, [['a'],['b']]); + assertArrayEqual(args, [['a']]); }); }); diff --git a/yarn.lock b/yarn.lock index f31027f6a..0ee076fe8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3496,10 +3496,10 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -ready-test@^1.0.31: - version "1.0.31" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.31.tgz#5860ab3b61eb4f1bebc442e90d3adf051e3724a2" - integrity sha512-2mXxmVAIVzPdqhjJiJAkMvMt6Q/+LXST1TKmoI+4tM//6cBekDxdgCmuwAek5CFUuTDA4/QFjj/el7X1W4T10g== +ready-test@^1.0.32: + version "1.0.32" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.32.tgz#d578780d10ce384e0863168aa579947233db1736" + integrity sha512-HdP6uz6OTey6eCXYl38+XGBpL9RDPXgwvxGVlVvnZWC/aBmZkb/x/3WziI55LARAGqZGW1BwhueSdfTh9VitAQ== dependencies: argv "^0.0.2" chalk "^2.4.2" From ee6cee1139c227b179dfe537040758519cfe4b86 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 16:36:32 +0900 Subject: [PATCH 057/191] Added "immediate" option to Function#debounce --- CHANGELOG.md | 1 + src/function/debounce.js | 38 ++++++++++++++++++++++++++++---------- test/tests/function.js | 36 +++++++++++++++++++++++++++++------- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e7ea1e44..14ee26966 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ v3.0.0 - Renamed `String#escapeURL` to `String#encodeUrl` and `String#encodeUrlParam`. - Renamed `String#unesacpeURL` to `String#decodeUrl` and `String#decodeUrlParam`. - Changed `Function#throttle` to always execute immediately before locking. +- Added `immediate` option to `Function#debounce`. TODO: diff --git a/src/function/debounce.js b/src/function/debounce.js index 3f3b427b3..018d34a67 100644 --- a/src/function/debounce.js +++ b/src/function/debounce.js @@ -1,18 +1,20 @@ import { assertFunction, assertPositiveInteger } from '../util/assertions'; /** - * Creates a "debounced" function that postpones its execution until - * after `ms` milliseconds have passed. This method is useful to execute - * a function after things have "settled down". A good example of this - * is when a user tabs quickly through form fields, an action can be - * taken once they have settled on a field. + * Creates a "debounced" function that invokes only the last (or optionally + * first) execution in a given period of `ms` milliseconds. * + * @extra This method is useful to execute a function after things have + * "settled down". A good example of this is when a user tabs quickly through + * form fields, an action can be taken once they have settled on a field. * Note that this is similar to `throttle` with a limit of 1, with the * exception that a debounced function will receive the last arguments * supplied, while a throttled function will receive the first. * * @param {Function} fn - The function to debounce. - * @param {number} ms - The delay to debounce the function by. Default is `1`. + * @param {number} [ms] - The delay to debounce the function by. Default is `1`. + * @param {boolean} [immediate] - Whether to execute immediately before waiting. + * Default is `false`. * * @example * @@ -22,18 +24,34 @@ import { assertFunction, assertPositiveInteger } from '../util/assertions'; * @returns {Function} * */ -export default function debounce(fn, ms = 1) { +export default function debounce(fn, ms = 1, immediate = false) { assertFunction(fn); assertPositiveInteger(ms); let timer = null; let returnValue = null; - const debounced = function () { - clearTimeout(timer); + function wait(fn) { timer = setTimeout(() => { - returnValue = fn.apply(this, arguments); + timer = null; + if (fn) { + returnValue = fn(); + } }, ms); + } + + function isWaiting() { + return timer !== null; + } + + const debounced = function () { + if (immediate && !isWaiting()) { + returnValue = fn.apply(this, arguments); + wait(); + } else { + clearTimeout(timer); + wait(fn.bind(this, ...arguments)); + } return returnValue; }; diff --git a/test/tests/function.js b/test/tests/function.js index 91545e06f..e1184edec 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -115,14 +115,12 @@ namespace('Function', function() { assertArrayEqual(args, [['a']]); }); - it('should retain the last value when called repeatedly', function() { + it('should retain the last return value when not immediate', function() { // Note this differs from throttle with limit 1 - var fn = debounce(captureArgs, 200, { - limit: 1 - }); - fn('a'); - fn('b'); - fn('c'); + var fn = debounce(captureArgs, 200); + assertNull(fn('a')); + assertNull(fn('b')); + assertNull(fn('c')); clock.tick(200); assertArrayEqual(fn('d'), ['c']); clock.tick(200); @@ -136,6 +134,30 @@ namespace('Function', function() { assertArrayEqual(args, [['a']]); }); + it('should allow immediate execution of the function', function() { + var fn = debounce(captureArgs, 200, true); + fn('a'); + fn('b'); + fn('c'); + assertArrayEqual(args, [['a']]); + clock.tick(200); + assertArrayEqual(args, [['a'], ['c']]); + fn('d'); + assertArrayEqual(args, [['a'], ['c'], ['d']]); + clock.tick(200); + assertArrayEqual(args, [['a'], ['c'], ['d']]); + }); + + it('should retain the last return value when immediate', function() { + var fn = debounce(captureArgs, 200, true); + assertArrayEqual(fn('a'), ['a']);; + assertArrayEqual(fn('b'), ['a']);; + assertArrayEqual(fn('c'), ['a']);; + clock.tick(200); + assertArrayEqual(fn('d'), ['d']);; + assertArrayEqual(fn('e'), ['d']);; + }); + it('should handle irregular input', function() { assertError(function() { debounce() }); assertError(function() { debounce(captureArgs, 0) }); From 5fe7a26e845220ddc84a7af2127698ee192d34f6 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 16:43:00 +0900 Subject: [PATCH 058/191] removed cancel tests and ensuring handling of issue #346 --- src/function/util/scheduleDelay.js | 3 + test/OLD/tests/function.js | 89 ------------------------------ test/tests/function.js | 11 ++++ 3 files changed, 14 insertions(+), 89 deletions(-) diff --git a/src/function/util/scheduleDelay.js b/src/function/util/scheduleDelay.js index f91d9a913..4e2547119 100644 --- a/src/function/util/scheduleDelay.js +++ b/src/function/util/scheduleDelay.js @@ -6,6 +6,7 @@ export default function scheduleDelay(fn, ms, args = []) { if (!fn.timers) { fn.timers = []; } + if (!fn.cancel) { fn.cancel = () => { for (let timer of fn.timers) { @@ -14,10 +15,12 @@ export default function scheduleDelay(fn, ms, args = []) { fn.timers = []; }; } + fn.timers.push( setTimeout(() => { fn.apply(null, args); }, ms) ); + return fn; } diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index dc41e71d2..c53309283 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -52,95 +52,6 @@ namespace('Function', function () { clock.restore(); }); - method('cancel', function() { - var fn, ref, count; - - // Basic functionality - clock.reset(); - count = 0; - fn = function() { - count++; - }; - run(fn, 'delay', [20 / 4]); - run(fn, 'delay', [20 / 5]); - run(fn, 'delay', [20 / 6]); - ref = run(fn, 'cancel'); - equal(ref, fn, 'returns a reference to the function'); - clock.tick(20); - equal(count, 0, 'all functions should be canceled'); - - // Canceling after a delay - clock.reset(); - count = 0; - fn = function() { - count++; - }; - run(fn, 'delay', [50]); - run(fn, 'delay', [10]); - - equal(count, 0, 'should not have been called yet'); - equal(getTimers(fn).length, 2, 'should be 2 calls pending'); - - clock.tick(30); - - run(fn, 'cancel'); - equal(count, 1, 'should have called the function once'); - equal(getTimers(fn).length, 0, 'should have no more calls pending'); - - clock.tick(30); - equal(count, 1, 'should still have only been called once'); - equal(getTimers(fn).length, 0, 'should still be no more delays'); - - - // Canceling after first call (Issue #346) - clock.reset(); - count = 0; - fn = function() { - count++; - run(fn, 'cancel'); - }; - run(fn, 'delay', [5]); - run(fn, 'delay', [20]); - run(fn, 'delay', [20]); - run(fn, 'delay', [20]); - run(fn, 'delay', [20]); - run(fn, 'delay', [20]); - - equal(count, 0, 'should not have been called yet'); - equal(getTimers(fn).length, 6, 'should be 6 calls pending'); - - clock.tick(50); - - equal(count, 1, 'delays should have been canceled after 1'); - equal(getTimers(fn).length, 0, 'should be no more pending calls'); - - - // Canceling n functions in - clock.reset(); - count = 0; - fn = function() { - count++; - if (count === 2) { - run(fn, 'cancel'); - } - }; - run(fn, 'delay', [20]); - run(fn, 'delay', [20]); - run(fn, 'delay', [2]); - run(fn, 'delay', [5]); - run(fn, 'delay', [20]); - run(fn, 'delay', [20]); - - equal(count, 0, 'should not have been called yet'); - equal(getTimers(fn).length, 6, 'should be 6 calls pending'); - - clock.tick(50); - - equal(count, 2, 'should have been called twice'); - equal(getTimers(fn).length, 0, 'should be no more pending calls'); - - }); - method('lazy', function() { var count, fn, expected; diff --git a/test/tests/function.js b/test/tests/function.js index e1184edec..2bda56685 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -461,6 +461,17 @@ namespace('Function', function() { assertError(function() { delay(fn, NaN) }); }); + it('should handle issue #346', () => { + var fn = captureArgs; + fn = delay(fn, 10); + fn = delay(fn, 10); + fn = delay(fn, 10); + fn = delay(fn, 10); + fn.cancel(); + clock.tick(200); + assertArrayEqual(args, []); + }); + }); }); From ac275d6e14615e1b3cccc1243edec55f009a54ab Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 26 Jul 2020 16:46:05 +0900 Subject: [PATCH 059/191] removed tests for Function#lazy --- CHANGELOG.md | 2 + test/OLD/tests/function.js | 166 ------------------------------------- 2 files changed, 2 insertions(+), 166 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14ee26966..0a25b13b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,8 @@ v3.0.0 - Renamed `String#unesacpeURL` to `String#decodeUrl` and `String#decodeUrlParam`. - Changed `Function#throttle` to always execute immediately before locking. - Added `immediate` option to `Function#debounce`. +- Removed `Function#lazy`. This functionality is now encapsulated by + `Function#throttle`. TODO: diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index c53309283..6c08ffe1c 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -52,172 +52,6 @@ namespace('Function', function () { clock.restore(); }); - method('lazy', function() { - var count, fn, expected; - - // Default - clock.reset(); - expected = [['maybe','a',1],['baby','b',2],['you lazy','c',3],['biotch','d',4]]; - count = 0; - fn = run(function(one, two) { - equal([this.toString(), one, two], expected[count], 'scope and arguments are correct'); - count++; - }, 'lazy'); - - fn.call('maybe', 'a', 1); - fn.call('baby', 'b', 2); - fn.call('you lazy', 'c', 3); - - equal(count, 0, 'not immediate by default'); - - clock.tick(5); - - equal(count, 3, 'was executed 3 times in 5ms'); - fn.call('biotch', 'd', 4); - equal(count, 3, 'should not execute immediately on subsequent call'); - - clock.tick(5); - - equal(count, 4, 'final call'); - - - // Immediate execution - clock.reset(); - count = 0; - expected = [['maybe','a',1],['baby','b',2],['you lazy','c',3],['biotch','d',4]]; - fn = run(function(one, two) { - equal([this.toString(), one, two], expected[count], 'scope and arguments are correct'); - count++; - }, 'lazy', [1, true]); - - fn.call('maybe', 'a', 1); - fn.call('baby', 'b', 2); - fn.call('you lazy', 'c', 3); - - equal(count, 1, 'immediately executed'); - - clock.tick(5); - equal(count, 3, 'was executed 3 times in 5ms'); - fn.call('biotch', 'd', 4); - equal(count, 4, 'should execute immediately again'); - clock.tick(5); - equal(count, 4, 'should still have executed 4 times'); - - // Canceling lazy functions - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy'); - fn(); - fn(); - fn(); - - equal(count, 0, 'no calls made yet before cancel'); - equal(getTimers(fn).length, 1, 'should have 1 pending call'); - - run(fn, 'cancel'); - - equal(count, 0, 'no calls made after cancel'); - equal(getTimers(fn).length, 0, 'should have no more pending calls'); - - clock.tick(10); - - equal(count, 0, 'lazy function should have been canceled'); - equal(getTimers(fn).length, 0, 'should have no more pending calls'); - - - // Cancelling immediate lazy functions - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy', [1, true]); - fn(); - fn(); - fn(); - - equal(count, 1, 'should have run once before cancel'); - equal(getTimers(fn).length, 1, 'should have 1 pending call'); - - run(fn, 'cancel'); - - equal(count, 1, 'should still have only run once after cancel'); - equal(getTimers(fn).length, 0, 'should have no more pending calls'); - - clock.tick(10); - - equal(count, 1, 'should still have only run once after 10ms'); - - - // Fractional ms values - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy', [0.1]); - for(var i = 0; i < 20; i++) { - fn(); - } - - equal(count, 0, 'no calls before tick'); - - clock.tick(2); - - equal(count, 20, 'a fractional wait value will call multiple times in a single tick'); - - - // Upper limit for calls - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy', [0.1, false, 10]); - for(var i = 0; i < 50; i++) { - fn(); - } - clock.tick(5); - equal(count, 10, 'number of calls should be capped at 10'); - - - // Upper limit for calls with immediate execution - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy', [0.1, true, 10]); - for(var i = 0; i < 50; i++) { - fn(); - } - clock.tick(5); - equal(count, 10, 'number of calls should be capped at 10'); - - - // Upper limit of 1 - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy', [0.1, false, 1]); - for(var i = 0; i < 50; i++) { - fn(); - } - clock.tick(5); - equal(count, 1, 'should have been called once'); - - // Upper limit of 1 with immediate execution - clock.reset(); - count = 0; - fn = run(function() { - count++; - }, 'lazy', [0.1, true, 1]); - for(var i = 0; i < 50; i++) { - fn(); - } - clock.tick(5); - equal(count, 1, 'should have been called once'); - }); - method('every', function() { var fn, count; From 75504dd09632f6de07725c9f02ed072f1adfd0fa Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 27 Jul 2020 00:34:41 +0900 Subject: [PATCH 060/191] Added Function#setTimeout and Function#setInterval --- CHANGELOG.md | 5 + package.json | 2 +- src/function/define.js | 3 +- src/function/delay.js | 26 --- src/function/methods.js | 3 +- src/function/setInterval.js | 75 +++++++++ src/function/setTimeout.js | 61 +++++++ src/function/util/scheduleDelay.js | 26 --- test/.eslintrc | 1 + test/OLD/tests/function.js | 30 ---- test/tests/function.js | 259 +++++++++++++++++++++++++---- yarn.lock | 112 +++++++------ 12 files changed, 427 insertions(+), 176 deletions(-) delete mode 100644 src/function/delay.js create mode 100644 src/function/setInterval.js create mode 100644 src/function/setTimeout.js delete mode 100644 src/function/util/scheduleDelay.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a25b13b3..8a3c3344f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,11 @@ v3.0.0 - Added `immediate` option to `Function#debounce`. - Removed `Function#lazy`. This functionality is now encapsulated by `Function#throttle`. +- Replaced `Function#delay` with `Function#setTimeout` which is functionally + similar but returns a promise and is cancelable. +- Replaced `Function#every` with `Function#setInterval` which is functionally + similar but returns a promise and is cancelable. + TODO: diff --git a/package.json b/package.json index 70dab9ef6..f80549a0c 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "esm": "^3.2.25", "jsdoc": "^3.6.4", "ready-test": "^1.0.32", - "sinon": "^7.5.0", + "sinon": "^9.0.2", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", "webpack-cli": "^3.3.9", diff --git a/src/function/define.js b/src/function/define.js index 6d64f17e2..4631aa8b2 100644 --- a/src/function/define.js +++ b/src/function/define.js @@ -2,7 +2,8 @@ import { defineInstance } from '../core/function'; import * as methods from './methods'; defineInstance('debounce', methods.debounce); -defineInstance('delay', methods.delay); defineInstance('memoize', methods.memoize); defineInstance('once', methods.once); +defineInstance('setInterval', methods.setInterval); +defineInstance('setTimeout', methods.setTimeout); defineInstance('throttle', methods.throttle); diff --git a/src/function/delay.js b/src/function/delay.js deleted file mode 100644 index de863126b..000000000 --- a/src/function/delay.js +++ /dev/null @@ -1,26 +0,0 @@ -import scheduleDelay from './util/scheduleDelay'; - -/** - * Executes the function after `ms` milliseconds. - * - * @extra Returns a reference to itself. `delay` is also a way to execute non- - * blocking operations that will wait until the CPU is free. - * - * @param {Function} fn - The function to execute. - * @param {number} [ms] - The number of milliseconds to delay before executing - * the function. Must be a positive integer. Default is `0`. - * @param {...any} [args] - Any arguments passed in after the delay will be - * applied when executing the function. - * - * @returns {Function} - The returned function has a `cancel` method on it that - * will cancel the execution. - * - * @example - * - * logHello.delay(500) -> logs after 500ms - * logArgs.delay(500, 'a') -> logs "a" after 500ms - * - **/ -export default function delay(fn, ms = 0, ...args) { - return scheduleDelay(fn, ms, args); -} diff --git a/src/function/methods.js b/src/function/methods.js index 0dc5b38de..b9c85095f 100644 --- a/src/function/methods.js +++ b/src/function/methods.js @@ -1,5 +1,6 @@ export { default as debounce } from './debounce'; -export { default as delay } from './delay'; export { default as memoize } from './memoize'; export { default as once } from './once'; +export { default as setInterval } from './setInterval'; +export { default as setTimeout } from './setTimeout'; export { default as throttle } from './throttle'; diff --git a/src/function/setInterval.js b/src/function/setInterval.js new file mode 100644 index 000000000..f1ad89aa1 --- /dev/null +++ b/src/function/setInterval.js @@ -0,0 +1,75 @@ +import { assertFunction, assertNonNegativeInteger } from '../util/assertions'; + +/** + * Executes the function every `ms` milliseconds. + * + * @extra This method can be thought of as an enhanced form of native + * `setInterval`. It implements `setTimeout` under the hood which guarantees the + * same period of idle time after execution has finished. Compare this to native + * `setInterval` which runs the function every `ms`, even when execution itself + * takes up a portion of that time. In most cases avoiding `setInterval` is + * preferable as calls won't "back up" when the CPU is under strain, however + * this also means that calls are less likely to happen at exact intervals, + * so use case should be considered. + * + * @param {Function} fn - The function to execute. + * @param {number} [ms] - The number of milliseconds to delay for each + * execution. Must be a positive integer. Default is `0`. + * @param {...any} [args] - Any arguments passed in after `ms` will be applied + * when executing the function. + * + * @returns {CancelablePromise} - The returned promise has a `cancel` method + * on it that will cancel the execution and resolve the promise as well as + * a `canceled` property to determine if the interval was canceled. Note that + * the promise will never resolve unless canceled, however it may be rejected + * if an error in execution is encountered. + * + * @example + * + * logHello.setInterval(500) -> logs every 500ms + * logArgs.setInterval(500, 'a') -> logs "a" every 500ms + * await logHello.setInterval(500) -> will never resolve unless canceled + * logHello.setInterval(500).cancel() -> nothing happens + * + * @typedef {Promise} CancelablePromise + * @property {Function} cancel - Will cancel the interval and resolve the + * @property {boolean} canceled - Whether the promise was canceled. + * + **/ +export default function setInterval(fn, ms = 0, ...args) { + let cancel; + + assertFunction(fn); + assertNonNegativeInteger(ms); + + const promise = new Promise((resolve, reject) => { + let timer; + + function awaitNext() { + timer = setTimeout(() => { + try { + fn.apply(null, args); + if (!promise.canceled) { + awaitNext(); + } + } catch(err) { + reject(err); + } + }, ms); + } + + cancel = () => { + clearTimeout(timer); + promise.canceled = true; + resolve(); + } + + awaitNext(); + }); + + promise.cancel = cancel; + promise.canceled = false; + + return promise; +} + diff --git a/src/function/setTimeout.js b/src/function/setTimeout.js new file mode 100644 index 000000000..01cc0a588 --- /dev/null +++ b/src/function/setTimeout.js @@ -0,0 +1,61 @@ +import { assertFunction, assertNonNegativeInteger } from '../util/assertions'; + +export default ((globalSetTimeout) => { + + /** + * Executes the function after `ms` milliseconds. + * + * @extra This method can be thought of as an enhanced form of native + * `setTimeout`. It will return a promise that can be used with async/await. + * Additionally the returned promise will have a `cancel` method on it that + * can be used to cancel the timeout. + * + * @param {Function} fn - The function to execute. + * @param {number} [ms] - The number of milliseconds to delay before executing + * the function. Must be a positive integer. Default is `0`. + * @param {...any} [args] - Any arguments passed in after `ms` will be applied + * when executing the function. + * + * @returns {CancelablePromise} - The returned promise has a `cancel` method + * on it that will cancel the execution and resolve the promise as well as + * a `canceled` property to determine if the timeout was canceled. + * + * @example + * + * logHello.setTimeout(500) -> logs after 500ms + * logArgs.setTimeout(500, 'a') -> logs "a" after 500ms + * await logHello.setTimeout(500) -> will await the delay + * logHello.setTimeout(500).cancel() -> nothing happens + * + * @typedef {Promise} CancelablePromise + * @property {Function} cancel - Will cancel the timeout and resolve the + * @property {boolean} canceled - Whether the promise was canceled. + * + **/ + return function setTimeout(fn, ms = 0, ...args) { + let cancel; + assertFunction(fn); + assertNonNegativeInteger(ms); + + const promise = new Promise((resolve, reject) => { + const timer = globalSetTimeout(() => { + try { + fn.apply(null, args); + resolve(); + } catch(err) { + reject(err); + } + }, ms); + cancel = () => { + clearTimeout(timer); + promise.canceled = true; + resolve(); + } + }); + + promise.cancel = cancel; + promise.canceled = false; + + return promise; + } +})(setTimeout); diff --git a/src/function/util/scheduleDelay.js b/src/function/util/scheduleDelay.js deleted file mode 100644 index 4e2547119..000000000 --- a/src/function/util/scheduleDelay.js +++ /dev/null @@ -1,26 +0,0 @@ -import { assertNonNegativeInteger } from '../../util/assertions'; - -export default function scheduleDelay(fn, ms, args = []) { - assertNonNegativeInteger(ms); - - if (!fn.timers) { - fn.timers = []; - } - - if (!fn.cancel) { - fn.cancel = () => { - for (let timer of fn.timers) { - clearTimeout(timer); - } - fn.timers = []; - }; - } - - fn.timers.push( - setTimeout(() => { - fn.apply(null, args); - }, ms) - ); - - return fn; -} diff --git a/test/.eslintrc b/test/.eslintrc index 61752ef1c..19f9c29f6 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -45,5 +45,6 @@ withNumberFormatter: true, ensureNamespaceNotInitialized: true, Sugar: true, + Promise: true, } } diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index 6c08ffe1c..46cc44643 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -52,36 +52,6 @@ namespace('Function', function () { clock.restore(); }); - method('every', function() { - var fn, count; - - // Basic - clock.reset(); - count = 0; - fn = function(one, two) { - equal(this, fn, 'this object should be the function'); - equal(one, 'one', 'first argument should be curried'); - equal(two, 'two', 'second argument should be curried'); - count++; - }; - run(fn, 'every' , [10, 'one', 'two']); - clock.tick(100); - equal(count, 10, 'should have been called 10 times'); - - // Issue #488 - clock.reset(); - count = 0; - fn = function(one, two) { - count++; - if (count === 5) { - run(fn, 'cancel'); - } - }; - run(fn, 'every' , [10]); - clock.tick(100); - equal(count, 5, 'should have been called 5 times'); - }); - method('after', function() { diff --git a/test/tests/function.js b/test/tests/function.js index 2bda56685..5a3b2a04b 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -150,12 +150,12 @@ namespace('Function', function() { it('should retain the last return value when immediate', function() { var fn = debounce(captureArgs, 200, true); - assertArrayEqual(fn('a'), ['a']);; - assertArrayEqual(fn('b'), ['a']);; - assertArrayEqual(fn('c'), ['a']);; + assertArrayEqual(fn('a'), ['a']); + assertArrayEqual(fn('b'), ['a']); + assertArrayEqual(fn('c'), ['a']); clock.tick(200); - assertArrayEqual(fn('d'), ['d']);; - assertArrayEqual(fn('e'), ['d']);; + assertArrayEqual(fn('d'), ['d']); + assertArrayEqual(fn('e'), ['d']); }); it('should handle irregular input', function() { @@ -419,18 +419,10 @@ namespace('Function', function() { }); - describeInstance('delay', function(delay) { - - var fn; + describeInstance('setTimeout', function(setTimeout) { - beforeEach(function() { - fn = function() { - return captureArgs.apply(this, arguments); - }; - }); - - it('should delay execution of the function for 1s', function() { - delay(fn, 1000, 'a'); + it('should set a timeout of 1 second', function() { + setTimeout(captureArgs, 1000, 'a'); assertArrayEqual(args, []); clock.tick(1000); assertArrayEqual(args, [['a']]); @@ -439,39 +431,234 @@ namespace('Function', function() { }); it('should default to 0ms with no args', function() { - delay(fn); + setTimeout(captureArgs); assertArrayEqual(args, []); - clock.tick(100); + clock.tick(0); assertArrayEqual(args, [[]]); }); it('should be cancelable', function() { - delay(fn, 1000, 'a'); + var promise = setTimeout(captureArgs, 1000, 'a'); assertArrayEqual(args, []); - fn.cancel(); + promise.cancel(); clock.tick(1000); assertArrayEqual(args, []); - assertArrayEqual(fn.timers, []); + }); + + describe('promise behavior', function() { + + it('should return a promise', function() { + assertInstanceOf(setTimeout(captureArgs, 1000), Promise); + }); + + it('should resolve the promise after execution', function() { + return new Promise(function(resolve) { + setTimeout(function() {}, 1000).then(function() { + assertTrue(true); + resolve(); + }); + clock.tick(1000); + }); + }); + + it('should reject the promise on error', function() { + return new Promise(function(resolve) { + setTimeout(function() { + throw Error(); + }, 1000).catch(function() { + assertTrue(true); + resolve(); + }); + clock.tick(1000); + }); + }); + + it('should resolve the promise when canceled', function() { + return new Promise(function(resolve) { + var promise = setTimeout(function() {}, 1000); + promise.then(function() { + assertTrue(true); + resolve(); + }); + promise.cancel(); + }); + }); + + it('should set canceled property of false by default', function() { + var promise = setTimeout(function() {}, 1000); + assertFalse(promise.canceled); + }); + + it('should set canceled property to true when canceled', function() { + return new Promise(function(resolve) { + var promise = setTimeout(function() {}, 1000); + promise.then(function() { + assertTrue(promise.canceled); + resolve(); + }); + promise.cancel(); + }); + }); + + it('should not set canceled property to true when resolved', function() { + return new Promise(function(resolve) { + var promise = setTimeout(function() {}, 1000); + promise.then(function() { + assertFalse(promise.canceled); + resolve(); + }); + clock.tick(1000); + }); + }); + + it('should not set canceled property to true when rejected', function() { + return new Promise(function(resolve) { + var promise = setTimeout(function() { + throw new Error(); + }, 1000); + promise.catch(function() { + assertFalse(promise.canceled); + resolve(); + }); + clock.tick(1000); + }); + }); + }); it('should handle irregular input', function() { - assertError(function() { delay() }); - assertError(function() { delay(fn, 'str') }); - assertError(function() { delay(fn, null) }); - assertError(function() { delay(fn, NaN) }); - }); - - it('should handle issue #346', () => { - var fn = captureArgs; - fn = delay(fn, 10); - fn = delay(fn, 10); - fn = delay(fn, 10); - fn = delay(fn, 10); - fn.cancel(); - clock.tick(200); - assertArrayEqual(args, []); + assertError(function() { setTimeout() }); + assertError(function() { setTimeout(captureArgs, 'str') }); + assertError(function() { setTimeout(captureArgs, null) }); + assertError(function() { setTimeout(captureArgs, NaN) }); }); }); + describeInstance('setInterval', function(setInterval) { + + it('should set an interval of 1 second', function() { + setInterval(captureArgs, 1000, 'a'); + assertArrayEqual(args, []); + clock.tick(1000); + assertArrayEqual(args, [['a']]); + clock.tick(1000); + assertArrayEqual(args, [['a'], ['a']]); + clock.tick(1000); + assertArrayEqual(args, [['a'], ['a'], ['a']]); + }); + + it('should default to 0ms with no args', function() { + setInterval(captureArgs); + assertArrayEqual(args, []); + clock.tick(0); + assertArrayEqual(args, [[]]); + }); + + it('should be cancelable', function() { + var promise = setInterval(captureArgs, 1000, 'a'); + assertArrayEqual(args, []); + clock.tick(1000); + assertArrayEqual(args, [['a']]); + promise.cancel(); + clock.tick(1000); + assertArrayEqual(args, [['a']]); + clock.tick(1000); + assertArrayEqual(args, [['a']]); + }); + + describe('promise behavior', function() { + + it('should return a promise', function() { + assertInstanceOf(setInterval(captureArgs, 1000), Promise); + }); + + it('should resolve the promise after execution', function() { + return new Promise(function(resolve) { + var resolved = false; + setInterval(function() {}, 1000).then(function() { + resolved = true; + }); + // Need to use tickAsync here as .then is always + // async and we're not expecting it to be called; + clock.tickAsync(1000).then(function() { + assertFalse(resolved); + resolve(); + }); + }); + }); + + it('should reject the promise on error', function() { + return new Promise(function(resolve) { + setInterval(function() { + throw Error(); + }, 1000).catch(function() { + assertTrue(true); + resolve(); + }); + clock.tick(1000); + }); + }); + + it('should resolve the promise when canceled', function() { + return new Promise(function(resolve) { + var promise = setInterval(function() {}, 1000); + promise.then(function() { + assertTrue(true); + resolve(); + }); + promise.cancel(); + }); + }); + + it('should set canceled property of false by default', function() { + var promise = setInterval(function() {}, 1000); + assertFalse(promise.canceled); + }); + + it('should set canceled property to true when canceled', function() { + return new Promise(function(resolve) { + var promise = setInterval(function() {}, 1000); + promise.then(function() { + assertTrue(promise.canceled); + resolve(); + }); + promise.cancel(); + }); + }); + + it('should not set canceled property to true when rejected', function() { + return new Promise(function(resolve) { + var promise = setInterval(function() { + throw new Error(); + }, 1000); + promise.catch(function() { + assertFalse(promise.canceled); + resolve(); + }); + clock.tick(1000); + }); + }); + + }); + + it('should handle irregular input', function() { + assertError(function() { setInterval() }); + assertError(function() { setInterval(captureArgs, 'str') }); + assertError(function() { setInterval(captureArgs, null) }); + assertError(function() { setInterval(captureArgs, NaN) }); + }); + + it('should handle issue #488', function() { + var i = 0; + var promise = setInterval(function() { + if(++i >= 3) { + promise.cancel(); + } + }, 1000); + clock.tick(5000); + assertEqual(i, 3); + }); + + }); }); diff --git a/yarn.lock b/yarn.lock index 0ee076fe8..b6c3c4d46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -799,29 +799,43 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": +"@sinonjs/commons@^1", "@sinonjs/commons@^1.7.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^3.2.1": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" - integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.2": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/formatio@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" + integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== dependencies: "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" + "@sinonjs/samsam" "^5.0.2" -"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" + integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" "@sinonjs/text-encoding@^0.7.1": version "0.7.1" @@ -1106,11 +1120,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1777,10 +1786,10 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diffie-hellman@^5.0.0: version "5.0.3" @@ -2832,23 +2841,16 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash@^4.17.13, lodash@^4.17.14: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -lolex@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" - integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== - -lolex@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" - loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3078,15 +3080,15 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" - integrity sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ== +nise@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== dependencies: - "@sinonjs/formatio" "^3.2.1" + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" - lolex "^5.0.1" path-to-regexp "^1.7.0" node-libs-browser@^2.2.1: @@ -3780,18 +3782,18 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -sinon@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" - integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== - dependencies: - "@sinonjs/commons" "^1.4.0" - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.3" - diff "^3.5.0" - lolex "^4.2.0" - nise "^1.5.2" - supports-color "^5.5.0" +sinon@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d" + integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A== + dependencies: + "@sinonjs/commons" "^1.7.2" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/formatio" "^5.0.1" + "@sinonjs/samsam" "^5.0.3" + diff "^4.0.2" + nise "^4.0.1" + supports-color "^7.1.0" slice-ansi@^2.1.0: version "2.1.0" @@ -3989,7 +3991,7 @@ strip-json-comments@^3.1.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -4133,7 +4135,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: +type-detect@4.0.8, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== From 0403c3df993e3e600b20831e3a6365c592bb3ec5 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 27 Jul 2020 06:16:55 +0900 Subject: [PATCH 061/191] Added Function#partial and Function#lock --- CHANGELOG.md | 2 + package.json | 2 +- src/function/define.js | 2 + src/function/lock.js | 23 ++ src/function/methods.js | 2 + src/function/partial.js | 61 ++++++ test/.eslintrc | 4 + test/OLD/tests/function.js | 360 -------------------------------- test/tests/function.js | 418 +++++++++++++++++++++++++++++++++++++ yarn.lock | 35 +++- 10 files changed, 538 insertions(+), 371 deletions(-) create mode 100644 src/function/lock.js create mode 100644 src/function/partial.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a3c3344f..7cc20bd99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,8 @@ v3.0.0 similar but returns a promise and is cancelable. - Replaced `Function#every` with `Function#setInterval` which is functionally similar but returns a promise and is cancelable. +- Removed complex interop between `Function#lock` and `Function#partial`. Simply +call `Function#lock` first in the chain to achieve the same effect. TODO: diff --git a/package.json b/package.json index f80549a0c..7f8d5eca2 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.32", + "ready-test": "^1.0.34", "sinon": "^9.0.2", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/function/define.js b/src/function/define.js index 4631aa8b2..fa7521571 100644 --- a/src/function/define.js +++ b/src/function/define.js @@ -2,8 +2,10 @@ import { defineInstance } from '../core/function'; import * as methods from './methods'; defineInstance('debounce', methods.debounce); +defineInstance('lock', methods.lock); defineInstance('memoize', methods.memoize); defineInstance('once', methods.once); +defineInstance('partial', methods.partial); defineInstance('setInterval', methods.setInterval); defineInstance('setTimeout', methods.setTimeout); defineInstance('throttle', methods.throttle); diff --git a/src/function/lock.js b/src/function/lock.js new file mode 100644 index 000000000..955250f8f --- /dev/null +++ b/src/function/lock.js @@ -0,0 +1,23 @@ +import { assertFunction } from '../util/assertions'; + +/** + * Locks the number of arguments accepted by the function. + * + * @extra If not passed, `n` will be the length of the function. Note that when + * using with other methods that bind arguments such as `Function#bind` or + * `partial` this method needs to be called first in the chain to prevent bound + * arguments from being passed. + * + * @example + * + * logArgs.lock(2)(1,2,3) -> logs 1,2 + * + * @param {number} [n] + * + **/ +export default function lock(fn, n = fn.length) { + assertFunction(fn); + return function(...args) { + return fn.apply(this, args.slice(0, n)); + } +} diff --git a/src/function/methods.js b/src/function/methods.js index b9c85095f..78002ff67 100644 --- a/src/function/methods.js +++ b/src/function/methods.js @@ -1,6 +1,8 @@ export { default as debounce } from './debounce'; +export { default as lock } from './lock'; export { default as memoize } from './memoize'; export { default as once } from './once'; +export { default as partial } from './partial'; export { default as setInterval } from './setInterval'; export { default as setTimeout } from './setTimeout'; export { default as throttle } from './throttle'; diff --git a/src/function/partial.js b/src/function/partial.js new file mode 100644 index 000000000..31bbede7c --- /dev/null +++ b/src/function/partial.js @@ -0,0 +1,61 @@ +import { assertFunction } from '../util/assertions'; + +const PLACEHOLDER = Symbol('placeholder'); + +/** + * Returns a new version of the function which has part of its arguments + * pre-emptively filled in, also known as "currying". + * + * @extra Optionally allows a placeholder to be replaced with invoked arguments. + * This allows currying of arguments even when they occur toward the end of an + * argument list. + * + * @param {Function} fn - The function to apply arguments to. + * @param {...any} [args] - The arguments to curry to the resulting function. If + * any of these arguments are equal to `partial.replace` they will serve a + * placeholder. + * + * @example + * + * logArgs.partial('a')('b') -> logs a, b + * logArgs.partial(logArgs.partial.replace, 'b')('a') -> logs a, b + * + **/ +export default function partial(fn, ...curriedArgs) { + assertFunction(fn); + + const partialFn = function(...invokedArgs) { + const args = []; + let startIndex = 0; + + for (let arg of curriedArgs) { + if (arg === PLACEHOLDER) { + args.push(invokedArgs[startIndex++]); + } else { + args.push(arg); + } + } + + for (let i = startIndex; i < invokedArgs.length; i++) { + args.push(invokedArgs[i]); + } + + // If the bound "this" object is an instance of the partialed + // function, then "new" was used, so preserve the prototype + // so that constructor functions can also be partialed. + if (this instanceof partialFn) { + const self = Object.create(fn.prototype); + const result = fn.apply(self, args); + // An explicit return value is allowed from constructors + // as long as they are of "object" type, so return the + // correct result here accordingly. + return typeof result === 'object' ? result : self; + } + + return fn.apply(this, args); + } + + return partialFn; +} + +partial.replace = PLACEHOLDER; diff --git a/test/.eslintrc b/test/.eslintrc index 19f9c29f6..5952d0b35 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -20,7 +20,11 @@ square: true, concatA: true, describe: true, + fdescribe: true, + xdescribe: true, namespace: true, + famespace: true, + xamespace: true, describeStatic: true, describeInstance: true, fdescribeStatic: true, diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js index 46cc44643..b2af5e5db 100644 --- a/test/OLD/tests/function.js +++ b/test/OLD/tests/function.js @@ -151,364 +151,4 @@ namespace('Function', function () { }); - method('partial', function() { - - var format = function(place, last){ - return (last || '') + this.toFixed(place); - } - - Number.prototype.two = run(format, 'partial', [2]); - equal((18).two(), '18.00'); - equal((9999).two(), '9999.00'); - equal((9999).two('$'), '$9999.00'); - - Number.prototype.euro = run(format, 'partial', [undefined, '€']); - equal((9999.77).euro(), '€10000', 'euro | no params | 9.999,77'); - equal((9999.77).euro(0), '€10000', 'euro | 0 | 9.999'); - equal((9999.77).euro(1), '€9999.8', 'euro | 1 | 9.999,8'); - equal((9999.77).euro(2), '€9999.77', 'euro | 2 | 9.999,77'); - equal((9999.77).euro(3), '€9999.770', 'euro | 3 | 9.999,777'); - - Number.prototype.noop = run(format, 'partial'); - equal((1000).noop(3, '$'), '$1000.000', 'noop | 1 000,000'); - equal((1000).noop(4, '$'), '$1000.0000', 'noop | 1 000,0000'); - equal((1000).noop(5, '$'), '$1000.00000', 'noop | 1 000,00000'); - - var partial = run(function(first) { - return first; - }, 'partial', [['a', 'b']]); - - equal(partial(), ['a','b'], 'can be passed arrays'); - - var partial = run(function(first) { - return Array.prototype.slice.call(arguments); - }, 'partial', [0]); - - equal(partial('a'), [0, 'a'], 'falsy values can be passed'); - - function stringifyArray(arr) { - var result = []; - for (var i = 0; i < arr.length; i++) { - if (testIsArray(arr[i])) { - result.push('[' + stringifyArray(arr[i]) + ']'); - } else { - result.push(String(arr[i])); - } - } - return result.join(' '); - } - var fn = function() { - return stringifyArray(arguments); - } - equal(run(fn, 'partial', [null, 'a'])('b'), 'null a b', 'null first will not act as a placeholder'); - equal(run(fn, 'partial', ['a', null])('b'), 'a null b', 'null second will not act as a placeholder'); - equal(run(fn, 'partial', [null, null, 'a'])(), 'null null a', 'null repeated first'); - equal(run(fn, 'partial', ['a', null, null])(), 'a null null', 'null repeated last'); - equal(run(fn, 'partial', [null, null, null])(), 'null null null', 'all null'); - equal(run(fn, 'partial', [null, null, null])('a','b','c'), 'null null null a b c', 'all null overflowing'); - - equal(run(fn, 'partial', [undefined, 'a'])('b'), 'b a', 'undefined first will act as a placeholder'); - equal(run(fn, 'partial', ['a', undefined])('b'), 'a b', 'undefined second will act as a placeholder'); - equal(run(fn, 'partial', [undefined, undefined, 'a'])('a', 'b'), 'a b a', 'two placeholders first'); - equal(run(fn, 'partial', ['a', undefined, undefined])('a', 'b'), 'a a b', 'two placeholders last'); - equal(run(fn, 'partial', [undefined, undefined, undefined])('a', 'b', 'c'), 'a b c', 'all placeholders'); - equal(run(fn, 'partial', [undefined, undefined, undefined])('a', 'b'), 'a b undefined', 'all placeholders with last undefined'); - equal(run(fn, 'partial', [undefined, undefined, undefined])('a','b','c','d','e'), 'a b c d e', 'all undefined overflowing'); - - equal(run(fn, 'partial', [null, undefined, null])(), 'null undefined null', 'null and undefined mixed'); - equal(run(fn, 'partial', [null, undefined, null])('a'), 'null a null', 'null and undefined mixed with 1 arg'); - equal(run(fn, 'partial', [null, undefined, null])('a', 'b'), 'null a null b', 'null and undefined mixed with 2 args'); - equal(run(fn, 'partial', [null, undefined, null])('a', 'b', 'c'), 'null a null b c', 'null and undefined mixed with 3 args'); - - equal(run(fn, 'partial', [undefined, null, undefined])(), 'undefined null undefined', 'undefined and null mixed'); - equal(run(fn, 'partial', [undefined, null, undefined])('a'), 'a null undefined', 'undefined and null mixed with 1 arg'); - equal(run(fn, 'partial', [undefined, null, undefined])('a', 'b'), 'a null b', 'undefined and null mixed with 2 args'); - equal(run(fn, 'partial', [undefined, null, undefined])('a', 'b', 'c'), 'a null b c', 'undefined and null mixed with 3 args'); - - equal(run(fn, 'partial', ['a'])(undefined), 'a undefined', 'passing undefined'); - equal(run(fn, 'partial', ['a'])(undefined, 'b'), 'a undefined b', 'passing undefined first'); - equal(run(fn, 'partial', ['a'])('b', undefined), 'a b undefined', 'passing undefined second'); - - equal(run(fn, 'partial', [undefined])(undefined), 'undefined', 'passing undefined to a placeholder'); - equal(run(fn, 'partial', [undefined])(undefined, 'b'), 'undefined b', 'passing undefined to a placeholder first'); - equal(run(fn, 'partial', [undefined])('b', undefined), 'b undefined', 'passing undefined to a placeholder second'); - - equal(run(fn, 'partial', ['a'])(null), 'a null', 'passing null'); - equal(run(fn, 'partial', ['a'])(null, 'b'), 'a null b', 'passing null first'); - equal(run(fn, 'partial', ['a'])('b', null), 'a b null', 'passing null second'); - - equal(run(fn, 'partial', [undefined])(null), 'null', 'passing null to a placeholder'); - equal(run(fn, 'partial', [undefined])(null, 'b'), 'null b', 'passing null to a placeholder first'); - equal(run(fn, 'partial', [undefined])('b', null), 'b null', 'passing null to a placeholder second'); - - // More complex - equal(run(fn, 'partial', [[undefined]])('a'), '[undefined] a', 'array of undefined is not a placeholder'); - equal(run(fn, 'partial', [[undefined], undefined])('a'), '[undefined] a', 'placeholder after array'); - equal(run(fn, 'partial', [undefined, [undefined]])('a'), 'a [undefined]', 'placeholder before array'); - - equal(run(fn, 'partial', [[null]])('a'), '[null] a', 'array of null is not a placeholder'); - equal(run(fn, 'partial', [[null], undefined])('a'), '[null] a', 'placeholder after array'); - equal(run(fn, 'partial', [undefined, [null]])('a'), 'a [null]', 'placeholder before array'); - - - // Tests lovingly borrowed from Underscore - - var obj = {name: 'moe'}; - var func = function() { return this.name + ' ' + Array.prototype.slice.call(arguments).join(' '); }; - - obj.func = run(func, 'partial', ['a', 'b']); - equal(obj.func('c', 'd'), 'moe a b c d', 'can partially apply'); - - obj.func = run(func, 'partial', [undefined, 'b', undefined, 'd']); - equal(obj.func('a', 'c'), 'moe a b c d', 'can partially apply with placeholders'); - - func = run(function() { return arguments.length; }, 'partial', [undefined, 'b', undefined, 'd']); - equal(func('a', 'c', 'e'), 5, 'accepts more arguments than the number of placeholders'); - equal(func('a'), 4, 'accepts fewer arguments than the number of placeholders'); - - func = run(function() { return typeof arguments[2]; }, 'partial', [undefined, 'b', undefined, 'd']); - equal(func('a'), 'undefined', 'unfilled placeholders are undefined'); - - // passes context - function MyWidget(name, options) { - this.name = name; - this.options = options; - } - MyWidget.prototype.get = function() { - return this.name; - }; - var MyWidgetWithCoolOpts = run(MyWidget, 'partial', [undefined, {a: 1}]); - var widget = new MyWidgetWithCoolOpts('foo'); - equal(widget instanceof MyWidget, true, 'Can partially bind a constructor'); - equal(widget.get(), 'foo', 'keeps prototype'); - equal(widget.options, {a: 1}, 'options equal'); - - // explicit return value in constructor - function MyWidget2() { - return {foo:'bar'}; - } - var MyFilledWidget = run(MyWidget2, 'partial', [undefined, {a: 1}]); - var widget = new MyFilledWidget(); - equal(widget instanceof MyWidget, false, 'explicit return value is no longer an instance of the constructor'); - equal(widget.foo, 'bar', 'respects return value'); - - - - // Tests lovingly borrowed from Lodash - - function identity(n) { - return n; - } - - var partial = run(identity, 'partial', ['a']); - equal(partial(), 'a', 'partially applies arguments'); - - var fn = function(a, b) { return [a, b]; }; - var partial = run(fn, 'partial', ['a']); - equal(partial('b'), ['a', 'b'], 'creates a function that can be invoked with additional arguments'); - - var fn = function() { return arguments.length; }; - var partial = run(fn, 'partial', []); - equal(partial(), 0, 'works when there are no partially applied arguments and the created function is invoked without additional arguments'); - - var partial = run(identity, 'partial', []); - equal(partial('a'), 'a', 'works when there are no partially applied arguments and the created function is invoked with additional arguments'); - - - // Placeholders are "undefined" in Sugar. - - var fn = function() { return Array.prototype.slice.call(arguments); }; - var partial = run(fn, 'partial', [undefined,'b',undefined]); - equal(partial('a', 'c'), ['a','b','c'], 'placeholders | filling 2'); - equal(partial('a'), ['a','b',undefined], 'placeholders | filling 1'); - equal(partial(), [undefined,'b',undefined], 'placeholders | filling none'); - equal(partial('a','c','d'), ['a','b','c','d'], 'placeholders | filling 2 adding 1'); - - - var fn = function(a, b, c) {}; - var partial = run(fn, 'partial', ['a']); - equal(partial.length, 0, 'creates a function with a length of 0'); - - var object = {}; - function Foo(value) { - return value && object; - } - var partial = run(Foo, 'partial', []); - equal(new partial instanceof Foo, true, 'ensure new partialed is an instance of func'); - equal(new partial(true), object, 'ensure new partialed return value'); - - function greet(greeting, name) { - return greeting + ' ' + name; - } - var partial1 = run(greet, 'partial', ['hi']); - var partial2 = run(partial1, 'partial', ['barney']); - var partial3 = run(partial1, 'partial', ['pebbles']); - equal(partial1('fred'), 'hi fred'); - equal(partial2(), 'hi barney'); - equal(partial3(), 'hi pebbles'); - - - var fn = function() { - var result = [this.a]; - Array.prototype.push.apply(result, arguments); - return result; - }; - var object = { 'a': 1, 'fn': fn }; - - var a = fn.bind(object); - var b = run(a, 'partial', [2]); - equal(b(3), [1,2,3], 'should work with combinations of bound and partial functions'); - - var a = run(fn, 'partial', [2]); - var b = a.bind(object); - equal(b(3), [1,2,3], 'should work with combinations of partial and bound functions'); - - - // Function#bind is spec so our hands are tied here - - var fn = function() { return Array.prototype.slice.call(arguments); }; - var object = { 'fn': fn }; - - var a = fn.bind(object, undefined, 2); - var b = run(a, 'partial', [1, undefined, 4]); - equal(b(3, 5), [undefined,2,1,3,4,5], 'should not work with combinations of functions with placeholders'); - - var a = run(fn, 'partial', [undefined, 2]); - var b = a.bind(object, 1, undefined, 4); - equal(b(3, 5), [1, 2, undefined, 4, 3, 5], 'should not work with combinations of functions with placeholders'); - - }); - - method('lock', function() { - - // Force 3 arguments as .length could be lying - - var fn = run(takesNone, 'lock', []); - equal(fn(), safeArray(u, u, u), 'takes 0 | default | 0 args'); - equal(fn(1), safeArray(u, u, u), 'takes 0 | default | 1 arg'); - equal(fn(1,2,3), safeArray(u, u, u), 'takes 0 | default | 3 args'); - - var fn = run(takesOne, 'lock', []); - equal(fn(), safeArray(u, u, u), 'takes 1 | default | 0 args'); - equal(fn(1), safeArray(1, u, u), 'takes 1 | default | 1 arg'); - equal(fn(1,2,3), safeArray(1, u, u), 'takes 1 | default | 3 args'); - - var fn = run(takesTwo, 'lock', []); - equal(fn(), safeArray(u, u, u), 'takes 2 | default | 0 args'); - equal(fn(1), safeArray(1, u, u), 'takes 2 | default | 1 arg'); - equal(fn(1,2,3), safeArray(1, 2, u), 'takes 2 | default | 3 args'); - - var fn = run(takesNone, 'lock', [1]); - equal(fn(), safeArray(u, u, u), 'takes 0 | manual 1 | 0 args'); - equal(fn(1), safeArray(1, u, u), 'takes 0 | manual 1 | 1 arg'); - equal(fn(1,2,3), safeArray(1, u, u), 'takes 0 | manual 1 | 3 args'); - - var fn = run(takesOne, 'lock', [1]); - equal(fn(), safeArray(u, u, u), 'takes 1 | manual 1 | 0 args'); - equal(fn(1), safeArray(1, u, u), 'takes 1 | manual 1 | 1 arg'); - equal(fn(1,2,3), safeArray(1, u, u), 'takes 1 | manual 1 | 3 args'); - - var fn = run(takesTwo, 'lock', [1]); - equal(fn(), safeArray(u, u, u), 'takes 2 | manual 1 | 0 args'); - equal(fn(1), safeArray(1, u, u), 'takes 2 | manual 1 | 1 arg'); - equal(fn(1,2,3), safeArray(1, u, u), 'takes 2 | manual 1 | 3 args'); - - // Get all arguments by length as forcing 3 could mask - // real number called with .apply - - var fn = run(takesNoneReturnsVaried, 'lock', []); - equal(fn(), [], 'takes 0 returns varied | default | 0 args'); - equal(fn(1), [], 'takes 0 returns varied | default | 1 arg'); - equal(fn(1,2,3), [], 'takes 0 returns varied | default | 3 args'); - - var fn = run(takesTwoReturnsVaried, 'lock', []); - equal(fn(), [], 'takes 2 returns varied | default | 0 args'); - equal(fn(1), [1], 'takes 2 returns varied | default | 1 arg'); - equal(fn(1,2,3), [1,2], 'takes 2 returns varied | default | 3 args'); - - var fn = run(takesNoneReturnsVaried, 'lock', [1]); - equal(fn(), [], 'takes 0 returns varied | manaual 1 | 0 args'); - equal(fn(1), [1], 'takes 0 returns varied | manaual 1 | 1 arg'); - equal(fn(1,2,3), [1], 'takes 0 returns varied | manaual 1 | 3 args'); - - var fn = run(takesTwoReturnsVaried, 'lock', [1]); - equal(fn(), [], 'takes 2 returns varied | manual 1 | 0 args'); - equal(fn(1), [1], 'takes 2 returns varied | manual 1 | 1 arg'); - equal(fn(1,2,3), [1], 'takes 2 returns varied | manual 1 | 3 args'); - - }); - - group('Locking partial functions', function() { - - var partial = run(takesNoneReturnsVaried, 'partial', ['a', 'b']); - var fn = run(partial, 'lock', []); - equal(fn(), ['a','b'], 'filled 2 | default lock | 0 args'); - equal(fn('c'), ['a','b'], 'filled 2 | default lock | 1 arg'); - equal(fn('c','d'), ['a','b'], 'filled 2 | default lock | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', ['a', 'b']); - var fn = run(partial, 'lock', [0]); - equal(fn(), [], 'filled 2 | locked to 0 | 0 args'); - equal(fn('c'), [], 'filled 2 | locked to 0 | 1 arg'); - equal(fn('c','d'), [], 'filled 2 | locked to 0 | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', ['a', 'b']); - var fn = run(partial, 'lock', [1]); - equal(fn(), ['a'], 'filled 2 | locked to 1 | 0 args'); - equal(fn('c'), ['a'], 'filled 2 | locked to 1 | 1 arg'); - equal(fn('c','d'), ['a'], 'filled 2 | locked to 1 | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', ['a', 'b']); - var fn = run(partial, 'lock', [3]); - equal(fn(), ['a','b'], 'filled 2 | locked to 3 | 0 args'); - equal(fn('c'), ['a','b','c'], 'filled 2 | locked to 3 | 1 arg'); - equal(fn('c','d'), ['a','b','c'], 'filled 2 | locked to 3 | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', []); - var fn = run(partial, 'lock', [1]); - equal(fn(), [], 'filled 0 | locked to 1 | 0 args'); - equal(fn('c'), ['c'], 'filled 0 | locked to 1 | 1 arg'); - equal(fn('c','d'), ['c'], 'filled 0 | locked to 1 | 2 args'); - - - // Locking partial functions with curried arguments and holes - - var partial = run(takesNoneReturnsVaried, 'partial', [undefined, 'b']); - var fn = run(partial, 'lock', []); - equal(fn(), safeArray( u, 'b'), 'filled 1 | 1 hole | default lock | 0 args'); - equal(fn('c'), safeArray('c','b'), 'filled 1 | 1 hole | default lock | 1 arg'); - equal(fn('c','d'), safeArray('c','b'), 'filled 1 | 1 hole | default lock | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', [undefined, 'b']); - var fn = run(partial, 'lock', [1]); - equal(fn(), safeArray( u ), 'filled 1 | 1 hole | locked to 1 | 0 args'); - equal(fn('c'), safeArray('c'), 'filled 1 | 1 hole | locked to 1 | 1 arg'); - equal(fn('c','d'), safeArray('c'), 'filled 1 | 1 hole | locked to 1 | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', [undefined, 'b']); - var fn = run(partial, 'lock', [3]); - equal(fn(), safeArray( u, 'b'), 'filled 1 | 1 hole | locked to 3 | 0 args'); - equal(fn('c'), safeArray('c','b'), 'filled 1 | 1 hole | locked to 3 | 1 arg'); - equal(fn('c','d'), safeArray('c','b','d'), 'filled 1 | 1 hole | locked to 3 | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', [undefined, undefined]); - var fn = run(partial, 'lock', []); - equal(fn(), safeArray( u, u ), 'filled 0 | 2 holes | default lock | 0 args'); - equal(fn('c'), safeArray('c', u ), 'filled 0 | 2 holes | default lock | 1 arg'); - equal(fn('c','d'), safeArray('c','d'), 'filled 0 | 2 holes | default lock | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', [undefined, undefined]); - var fn = run(partial, 'lock', [1]); - equal(fn(), safeArray( u ), 'filled 0 | 2 holes | locked to 1 | 0 args'); - equal(fn('c'), safeArray('c'), 'filled 0 | 2 holes | locked to 1 | 1 arg'); - equal(fn('c','d'), safeArray('c'), 'filled 0 | 2 holes | locked to 1 | 2 args'); - - var partial = run(takesNoneReturnsVaried, 'partial', [undefined, undefined]); - var fn = run(partial, 'lock', [3]); - equal(fn(), safeArray( u, u ), 'filled 0 | 2 holes | locked to 3 | 0 args'); - equal(fn('c'), safeArray('c', u ), 'filled 0 | 2 holes | locked to 3 | 1 arg'); - equal(fn('c','d'), safeArray('c','d'), 'filled 0 | 2 holes | locked to 3 | 2 args'); - - }); - }); diff --git a/test/tests/function.js b/test/tests/function.js index 5a3b2a04b..66651b1c8 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -661,4 +661,422 @@ namespace('Function', function() { }); }); + + describeInstance('partial', function(partial) { + + var _ = partial.replace; + + it('should perform basic currying of arguments', () => { + var fn = partial(captureArgs, 'a'); + assertArrayEqual(fn('b'), ['a', 'b']); + assertArrayEqual(fn('b', 'c', 'd'), ['a', 'b', 'c', 'd']); + }); + + it('should allow a placeholder that is replaced', () => { + var fn = partial(captureArgs, _, 'b'); + assertArrayEqual(fn('a'), ['a', 'b']); + }); + + it('should be able to curry past the placeholder', () => { + var fn = partial(captureArgs, 'a', _, 'c'); + assertArrayEqual(fn('b', 'd'), ['a', 'b', 'c', 'd']); + }); + + it('should not accept undefined or null as a placeholder', () => { + var fn = partial(captureArgs, undefined, null); + assertArrayEqual(fn('a', 'b'), [undefined, null, 'a', 'b']); + }); + + it('should not have issues with 0', () => { + var fn = partial(captureArgs, 0); + assertArrayEqual(fn(0), [0, 0]); + }); + + it('should not have issues with passing non-primitive input', () => { + var fn = partial(captureArgs, [1], {}, captureArgs, NaN); + assertArrayEqual(fn(), [[1], {}, captureArgs, NaN]); + }); + + it('should not have issues with invoking with non-primitive input', () => { + var fn = partial(captureArgs); + assertArrayEqual(fn([1], {}, captureArgs, NaN), [[1], {}, captureArgs, NaN]); + }); + + it('should work with no arguments', () => { + var fn = partial(captureArgs); + assertArrayEqual(fn('a', 'b'), ['a', 'b']); + }); + + it('should error on invalid input', () => { + assertError(function() { partial(); }); + assertError(function() { partial(null); }); + assertError(function() { partial(undefined); }); + }); + + describe('ported tests', () => { + + function build() { + return partial.apply(null, [captureArgs].concat( + Array.prototype.slice.call(arguments) + )); + } + + function assert(result, expected) { + assertArrayEqual(result, expected); + } + + it('should handle various cases', () => { + + assert(build(null, 'a')('b'), [null, 'a', 'b']); + assert(build('a', null)('b'), ['a', null, 'b']); + assert(build(null, null, 'a')(), [null, null, 'a']); + assert(build('a', null, null)(), ['a', null, null]); + assert(build(null, null, null)(), [null, null, null]); + assert(build(null, null, null)('a','b','c'), [null, null, null, 'a', 'b', 'c']); + + assert(build(_, 'a')('b'), ['b', 'a']); + assert(build('a', _)('b'), ['a', 'b']); + assert(build(_, _, 'a')('a', 'b'), ['a', 'b', 'a']); + assert(build('a', _, _)('a', 'b'), ['a', 'a', 'b']); + assert(build(_, _, _)('a', 'b', 'c'), ['a', 'b', 'c']); + assert(build(_, _, _)('a', 'b'), ['a', 'b', undefined]); + assert(build(_, _, _)('a','b','c','d','e'), ['a', 'b', 'c', 'd', 'e']); + + assert(build(null, _, null)(), [null, undefined, null]); + assert(build(null, _, null)('a'), [null, 'a', null]); + assert(build(null, _, null)('a', 'b'), [null, 'a', null, 'b']); + assert(build(null, _, null)('a', 'b', 'c'), [null, 'a', null, 'b', 'c']); + + assert(build(_, null, _)(), [undefined, null, undefined]); + assert(build(_, null, _)('a'), ['a', null, undefined]); + assert(build(_, null, _)('a', 'b'), ['a', null, 'b']); + assert(build(_, null, _)('a', 'b', 'c'), ['a', null, 'b', 'c']); + + assert(build('a')(undefined), ['a', undefined]); + assert(build('a')(undefined, 'b'), ['a', undefined, 'b']); + assert(build('a')('b', undefined), ['a', 'b', undefined]); + + assert(build(_)(undefined), [undefined]); + assert(build(_)(undefined, 'b'), [undefined, 'b']); + assert(build(_)('b', undefined), ['b', undefined]); + + assert(build('a')(null), ['a', null]); + assert(build('a')(null, 'b'), ['a', null, 'b']); + assert(build('a')('b', null), ['a', 'b', null]); + + assert(build(_)(null), [null]); + assert(build(_)(null, 'b'), [null, 'b']); + assert(build(_)('b', null), ['b', null]); + + assert(build([undefined])('a'), [[undefined], 'a']); + }); + + it('should handle more complex cases', () => { + assert(build([undefined])('a'), [[undefined], 'a']); + assert(build([undefined], _)('a'), [[undefined], 'a']); + assert(build(_, [undefined])('a'), ['a', [undefined]]); + + assert(build([null])('a'), [[null], 'a']); + assert(build([null], _)('a'), [[null], 'a']); + assert(build(_, [null])('a'), ['a', [null]]); + }); + + it('should handle Underscore cases', () => { + + var obj = {name: 'moe'}; + var func = function() { + return this.name + ' ' + Array.prototype.slice.call(arguments).join(' '); + }; + + obj.func = partial(func, 'a', 'b'); + assertEqual(obj.func('c', 'd'), 'moe a b c d'); + + obj.func = partial(func, _, 'b', _, 'd'); + assertEqual(obj.func('a', 'c'), 'moe a b c d'); + + func = partial(function() { + return arguments.length; + }, _, 'b', _, 'd'); + assertEqual(func('a', 'c', 'e'), 5); + assertEqual(func('a'), 4); + + func = partial(function() { + return typeof arguments[2]; + }, _, 'b', _, 'd'); + assertEqual(func('a'), 'undefined'); + + // passes context + var widget; + + function MyWidget(name, options) { + this.name = name; + this.options = options; + } + MyWidget.prototype.get = function() { + return this.name; + }; + + var MyWidgetWithCoolOpts = partial(MyWidget, _, {a: 1}); + widget = new MyWidgetWithCoolOpts('foo'); + assertInstanceOf(widget, MyWidget); + assertEqual(widget.get(), 'foo'); + assertObjectEqual(widget.options, {a: 1}); + + // explicit return value in constructor + function MyWidget2() { + return {foo:'bar'}; + } + var MyFilledWidget = partial(MyWidget2, _, {a: 1}); + widget = new MyFilledWidget(); + assertFalse(widget instanceof MyWidget); + assertEqual(widget.foo, 'bar'); + + }); + + it('should handle Lodash cases', () => { + + var fn; + var object; + var a, b; + + function identity(n) { + return n; + } + + assertEqual(partial(identity, 'a')(), 'a'); + + fn = function(a, b) { + return [a, b]; + }; + + // creates a function that can be invoked with additional arguments + assertArrayEqual(partial(fn, 'a')('b'), ['a', 'b']); + + fn = function() { + return arguments.length; + }; + // works when there are no partially applied arguments and the created function is invoked without additional arguments + assertEqual(partial(fn)(), 0); + + // works when there are no partially applied arguments and the created function is invoked with additional arguments + assertEqual(partial(identity)('a'), 'a', ''); + + + fn = function() { + return Array.prototype.slice.call(arguments); + }; + assertArrayEqual(partial(fn, _, 'b', _)('a', 'c'), ['a','b','c']); + assertArrayEqual(partial(fn, _, 'b', _)('a'), ['a','b',undefined]); + assertArrayEqual(partial(fn, _, 'b', _)(), [undefined,'b',undefined]); + assertArrayEqual(partial(fn, _, 'b', _)('a','c','d'), ['a','b','c','d']); + + + /* eslint no-unused-vars: "off" */ + fn = function(a, b, c) {}; + + // creates a function with a length of 0 + assertEqual(partial(fn, 'a').length, 0); + + object = {}; + function Foo(value) { + return value && object; + } + + // ensure new partialed is an instance of func + assertInstanceOf(new (partial(Foo)), Foo); + + // ensure new partialed return value + assertObjectEqual(new (partial(Foo))(true), object); + + function greet(greeting, name) { + return greeting + ' ' + name; + } + assertEqual(partial(greet, 'hi')('fred'), 'hi fred'); + assertEqual(partial(partial(greet, 'hi'), 'barney')(), 'hi barney'); + assertEqual(partial(partial(greet, 'hi'), 'pebbles')(), 'hi pebbles'); + + fn = function() { + var result = [this.a]; + Array.prototype.push.apply(result, arguments); + return result; + }; + object = { + 'a': 1, + 'fn': fn, + }; + + a = fn.bind(object); + b = partial(a, 2); + + // should work with combinations of bound and partial functions + assertArrayEqual(b(3), [1,2,3]); + + a = partial(fn, 2); + b = a.bind(object); + + // should work with combinations of partial and bound functions + assertArrayEqual(b(3), [1,2,3]); + + + // Function#bind is spec so our hands are tied here + + fn = function() { + return Array.prototype.slice.call(arguments); + }; + object = { 'fn': fn }; + + a = fn.bind(object, _, 2); + b = partial(a, 1, _, 4); + + // should not work when placeholder is passed to bind + assertArrayEqual(b(3, 5), [_, 2, 1, 3, 4, 5]); + + a = partial(fn, _, 2); + b = a.bind(object, 1, _, 4); + + // should not work when placeholder is passed to bind + assertArrayEqual(b(3, 5), [1, 2, _, 4, 3, 5]); + + }); + + }); + + }); + + describeInstance('lock', function(lock) { + + describe('returns undefined', () => { + + function getThreeNoLength(args) { + var arr = []; + for (var i = 0; i < 3; i++) { + arr[i] = args[i]; + } + return arr; + } + + function takesNone() { + return getThreeNoLength(arguments); + } + + function takesOne(a) { + return getThreeNoLength(arguments); + } + + function takesTwo(a, b) { + return getThreeNoLength(arguments); + } + + describe('default behavior', () => { + + it('should take 0 arguments', () => { + var fn = lock(takesNone); + assertArrayEqual(fn(), [undefined, undefined, undefined]); + assertArrayEqual(fn(1), [undefined, undefined, undefined]); + assertArrayEqual(fn(1,2,3), [undefined, undefined, undefined]); + }); + + it('should take 1 argument', () => { + var fn = lock(takesOne); + assertArrayEqual(fn(), [undefined, undefined, undefined]); + assertArrayEqual(fn(1), [1, undefined, undefined]); + assertArrayEqual(fn(1,2,3), [1, undefined, undefined]); + }); + + it('should take 2 arguments', () => { + var fn = lock(takesTwo); + assertArrayEqual(fn(), [undefined, undefined, undefined]); + assertArrayEqual(fn(1), [1, undefined, undefined]); + assertArrayEqual(fn(1,2,3), [1, 2, undefined]); + }); + + }); + + describe('passing an arg', () => { + + it('should take 0 arguments', () => { + var fn = lock(takesNone, 1); + assertArrayEqual(fn(), [undefined, undefined, undefined]); + assertArrayEqual(fn(1), [1, undefined, undefined]); + assertArrayEqual(fn(1,2,3), [1, undefined, undefined]); + }); + + it('should take 1 argument', () => { + var fn = lock(takesOne, 1); + assertArrayEqual(fn(), [undefined, undefined, undefined]); + assertArrayEqual(fn(1), [1, undefined, undefined]); + assertArrayEqual(fn(1,2,3), [1, undefined, undefined]); + }); + + it('should take 2 arguments', () => { + var fn = lock(takesTwo, 1); + assertArrayEqual(fn(), [undefined, undefined, undefined]); + assertArrayEqual(fn(1), [1, undefined, undefined]); + assertArrayEqual(fn(1,2,3), [1, undefined, undefined]); + }); + + }); + + }); + + describe('returns varied', () => { + + // Get all arguments by length as forcing 3 could mask + // real number called with .apply + function getAllWithLength(args) { + var arr = []; + for (var i = 0; i < args.length; i++) { + arr[i] = args[i]; + } + return arr; + } + + function takesNoneReturnsVaried() { + return getAllWithLength(arguments); + } + + function takesTwoReturnsVaried(a, b) { + return getAllWithLength(arguments); + } + + describe('default behavior', () => { + + it('should take 0 arguments', () => { + var fn = lock(takesNoneReturnsVaried); + assertArrayEqual(fn(), []); + assertArrayEqual(fn(1), []); + assertArrayEqual(fn(1,2,3), []); + }); + + it('should take 2 arguments', () => { + var fn = lock(takesTwoReturnsVaried); + assertArrayEqual(fn(), []); + assertArrayEqual(fn(1), [1]); + assertArrayEqual(fn(1,2,3), [1,2]); + }); + + }); + + describe('passing an arg', () => { + + it('should take 0 arguments', () => { + var fn = lock(takesNoneReturnsVaried, 1); + assertArrayEqual(fn(), []); + assertArrayEqual(fn(1), [1]); + assertArrayEqual(fn(1,2,3), [1]); + }); + + it('should take 2 arguments', () => { + var fn = lock(takesTwoReturnsVaried, 1); + assertArrayEqual(fn(), [], 'takes 2 returns varied | manual 1 | 0 args'); + assertArrayEqual(fn(1), [1], 'takes 2 returns varied | manual 1 | 1 arg'); + assertArrayEqual(fn(1,2,3), [1], 'takes 2 returns varied | manual 1 | 3 args'); + }); + + }); + + }); + + }); + }); diff --git a/yarn.lock b/yarn.lock index b6c3c4d46..cb2af3dac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1438,7 +1438,7 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -1465,7 +1465,7 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.2.1, chokidar@^3.4.0: +chokidar@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== @@ -1480,6 +1480,21 @@ chokidar@^3.2.1, chokidar@^3.4.0: optionalDependencies: fsevents "~2.1.2" +chokidar@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -2278,7 +2293,7 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3498,16 +3513,16 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -ready-test@^1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.32.tgz#d578780d10ce384e0863168aa579947233db1736" - integrity sha512-HdP6uz6OTey6eCXYl38+XGBpL9RDPXgwvxGVlVvnZWC/aBmZkb/x/3WziI55LARAGqZGW1BwhueSdfTh9VitAQ== +ready-test@^1.0.34: + version "1.0.34" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.34.tgz#3251834912d81a45bbbe27194fa309912f8810da" + integrity sha512-2nvb+Ml0NP1d3xrOV0ZBd3JB8yFQ+PP5h+7uhvYc6foCXJamKR/OgEQUzjmqc8gB8wZX2Pyo7Ape2VyI/D/t8w== dependencies: argv "^0.0.2" - chalk "^2.4.2" - chokidar "^3.2.1" + chalk "^4.1.0" + chokidar "^3.4.1" esm "^3.2.25" - glob "^7.1.4" + glob "^7.1.6" regenerate-unicode-properties@^8.2.0: version "8.2.0" From 577739d532a3aa4e057600bd1eb709042c3b8055 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 28 Jul 2020 18:09:31 +0900 Subject: [PATCH 062/191] Added Function#callAfter, Function#callUntil, and Function#filter --- CHANGELOG.md | 3 + package.json | 2 +- src/function/callAfter.js | 31 ++++ src/function/callUntil.js | 31 ++++ src/function/define.js | 3 + src/function/filter.js | 25 +++ src/function/lock.js | 13 +- src/function/methods.js | 3 + src/function/util/createLockFilter.js | 28 +++ test/OLD/tests/function.js | 154 ---------------- test/tests/function.js | 255 ++++++++++++++++++++++++++ yarn.lock | 8 +- 12 files changed, 391 insertions(+), 165 deletions(-) create mode 100644 src/function/callAfter.js create mode 100644 src/function/callUntil.js create mode 100644 src/function/filter.js create mode 100644 src/function/util/createLockFilter.js delete mode 100644 test/OLD/tests/function.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cc20bd99..f9e1eef61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,9 @@ v3.0.0 similar but returns a promise and is cancelable. - Removed complex interop between `Function#lock` and `Function#partial`. Simply call `Function#lock` first in the chain to achieve the same effect. +- Renamed `Function#after` to `Function#callAfter` to better communicate intent. + Additionally allowing a function here to server as the lock condition. +- Added `Function#callUntil`. TODO: diff --git a/package.json b/package.json index 7f8d5eca2..37ffc696c 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.34", + "ready-test": "^1.0.35", "sinon": "^9.0.2", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/function/callAfter.js b/src/function/callAfter.js new file mode 100644 index 000000000..ff087b2a7 --- /dev/null +++ b/src/function/callAfter.js @@ -0,0 +1,31 @@ +import filter from './filter'; +import createLockFilter from './util/createLockFilter'; + +/** + * Calls the function after a specific condition is reached. + * + * @param {Function} fn - The function to filter. + * @param {Function|number} condition - Can be either a function or a positive + * integer. If a function is passed `fn` will be called after it returns true. + * If a number is passed, `fn` will be called after that many invocations + * (>= the number) of the returned function. + * + * @returns {Function} + * + * @example + * + * var fn = logArgs.callAfter((n) => n > 1); + * fn(1); -> not called + * fn(2); -> called + * fn(1); -> called + * + * var fn = logArgs.callAfter(3): + * fn(); -> not called + * fn(); -> not called + * fn(); -> called + * fn(); -> called + * + **/ +export default function callAfter(fn, condition) { + return filter(fn, createLockFilter(condition, true)); +} diff --git a/src/function/callUntil.js b/src/function/callUntil.js new file mode 100644 index 000000000..449a2a4cd --- /dev/null +++ b/src/function/callUntil.js @@ -0,0 +1,31 @@ +import filter from './filter'; +import createLockFilter from './util/createLockFilter'; + +/** + * Calls the function until a specific condition is reached. + * + * @param {Function} fn - The function to filter. + * @param {Function|number} condition - Can be either a function or a positive + * integer. If a function is passed `fn` will be called until it returns true. + * If a number is passed, `fn` will be called until that many invocations + * (>= the number) of the returned function. + * + * @returns {Function} + * + * @example + * + * var fn = logArgs.callUntil((n) => n > 1); + * fn(1); -> called + * fn(2); -> not called + * fn(1); -> not called + * + * var fn = logArgs.callUntil(3): + * fn(); -> called + * fn(); -> called + * fn(); -> not called + * fn(); -> not called + * + **/ +export default function callUntil(fn, condition) { + return filter(fn, createLockFilter(condition, false)); +} diff --git a/src/function/define.js b/src/function/define.js index fa7521571..97e1d28f6 100644 --- a/src/function/define.js +++ b/src/function/define.js @@ -1,8 +1,11 @@ import { defineInstance } from '../core/function'; import * as methods from './methods'; +defineInstance('callAfter', methods.callAfter); +defineInstance('callUntil', methods.callUntil); defineInstance('debounce', methods.debounce); defineInstance('lock', methods.lock); +defineInstance('filter', methods.filter); defineInstance('memoize', methods.memoize); defineInstance('once', methods.once); defineInstance('partial', methods.partial); diff --git a/src/function/filter.js b/src/function/filter.js new file mode 100644 index 000000000..d12ec42c8 --- /dev/null +++ b/src/function/filter.js @@ -0,0 +1,25 @@ +import { assertFunction } from '../util/assertions'; + +/** + * Filters calls to a function. + * + * @param {Function} fn - The function to filter. + * @param {Function} filter - The filter function. When this function returns a + * truthy value, `fn` will be called with the same arguments and context. If + * it returns a falsy value the call will be ignored. + * + * @example + * + * logArgs.filter((n) => n > 1)(0) -> ignored + * logArgs.filter((n) => n > 1)(5) -> logs + * + **/ +export default function filter(fn, filter) { + assertFunction(fn); + assertFunction(filter); + return function() { + if (filter.apply(this, arguments)) { + return fn.apply(this, arguments); + } + } +} diff --git a/src/function/lock.js b/src/function/lock.js index 955250f8f..77caf56e3 100644 --- a/src/function/lock.js +++ b/src/function/lock.js @@ -3,17 +3,18 @@ import { assertFunction } from '../util/assertions'; /** * Locks the number of arguments accepted by the function. * - * @extra If not passed, `n` will be the length of the function. Note that when - * using with other methods that bind arguments such as `Function#bind` or - * `partial` this method needs to be called first in the chain to prevent bound - * arguments from being passed. + * @extra Note that when using with other methods that bind arguments such as + * `Function#bind` or `partial` this method needs to be called first in the + * chain to prevent bound arguments from being passed. + * + * @param {Function} fn - The function to lock. + * @param {number} [n] - The arity (number of arguments) to lock the function + * to. If not passed it will be the `.length` of the function. * * @example * * logArgs.lock(2)(1,2,3) -> logs 1,2 * - * @param {number} [n] - * **/ export default function lock(fn, n = fn.length) { assertFunction(fn); diff --git a/src/function/methods.js b/src/function/methods.js index 78002ff67..1d90dfeec 100644 --- a/src/function/methods.js +++ b/src/function/methods.js @@ -1,4 +1,7 @@ +export { default as callAfter } from './callAfter'; +export { default as callUntil } from './callUntil'; export { default as debounce } from './debounce'; +export { default as filter } from './filter'; export { default as lock } from './lock'; export { default as memoize } from './memoize'; export { default as once } from './once'; diff --git a/src/function/util/createLockFilter.js b/src/function/util/createLockFilter.js new file mode 100644 index 000000000..eadb38228 --- /dev/null +++ b/src/function/util/createLockFilter.js @@ -0,0 +1,28 @@ +import { isNumber } from '../../util/typeChecks'; +import { assertFunction, assertPositiveInteger } from '../../util/assertions'; + +export default function createLockFilter(condition, lockState) { + let locked = false; + + if (isNumber(condition)) { + assertPositiveInteger(condition); + condition = createIterationLock(condition); + } + + assertFunction(condition); + + return function() { + if (!locked) { + locked = condition.apply(this, arguments); + } + return locked === lockState; + } +} + +function createIterationLock(limit) { + let count = 0; + return function() { + count += 1; + return limit <= count; + } +} diff --git a/test/OLD/tests/function.js b/test/OLD/tests/function.js deleted file mode 100644 index b2af5e5db..000000000 --- a/test/OLD/tests/function.js +++ /dev/null @@ -1,154 +0,0 @@ -namespace('Function', function () { - 'use strict'; - - var clock, u; - - function getTimers(fn) { - return testGetPrivateProp(fn, 'timers'); - } - - function getThreeNoLength(args) { - var arr = []; - for (var i = 0; i < 3; i++) { - arr[i] = args[i]; - } - return arr; - } - - function getAllWithLength(args) { - var arr = []; - for (var i = 0; i < args.length; i++) { - arr[i] = args[i]; - } - return arr; - } - - function takesNone() { - return getThreeNoLength(arguments); - } - - function takesOne(a) { - return getThreeNoLength(arguments); - } - - function takesTwo(a, b) { - return getThreeNoLength(arguments); - } - - function takesNoneReturnsVaried() { - return getAllWithLength(arguments); - } - - function takesTwoReturnsVaried(a, b) { - return getAllWithLength(arguments); - } - - - setup(function() { - clock = sinon.useFakeTimers(); - }); - - teardown(function() { - clock.restore(); - }); - - - method('after', function() { - - var count = 0, expected = true; - var fn = function() { count++; }; - var onceFn = run(fn, 'once', []); - var single = run(onceFn, 'after', [3]); - for (var i = 0; i < 10; i++) { - var target = i < 3 ? 0 : 1; - if (count !== target) { - expected = correct; - } - single(); - } - equal(expected, true, 'works in conjunction with once to only be called a single time'); - - function assertCalledAfter(times, arg) { - var i = 0; - var fn = run(function() { - return true; - }, 'after', [arg]); - while(!fn()) { - i++; - }; - equal(i + 1, times, 'should have fired after ' + times + ' executions'); - } - - function assertCalledOutOfTen(times, args) { - var count = 0; - var fn = run(function() { - count++; - }, 'after', args); - for (var i = 0; i < 10; i++) { - fn(); - } - equal(count, times, 'should have fired ' + times + ' times out of 10'); - } - - var count = 0, i = 1; - var expectedArguments = [ - [[1,'bop'], [2,'bop'], [3,'bop'], [4,'bop'], [5,'bop']], - [[1,'bop'], [2,'bop'], [3,'bop'], [4,'bop'], [5,'bop'], [6,'bop']], - [[1,'bop'], [2,'bop'], [3,'bop'], [4,'bop'], [5,'bop'], [6,'bop'], [7,'bop']], - [[1,'bop'], [2,'bop'], [3,'bop'], [4,'bop'], [5,'bop'], [6,'bop'], [7,'bop'], [8,'bop']] - ]; - var fn = run(function(args) { - equal(args, expectedArguments[count], 'collects arguments called'); - equal(!!args[0].slice, true, 'arguments are converted to actual arrays'); - count++; - return 'hooha'; - }, 'after', [5]); - while(i <= 8) { - equal(fn(i, 'bop'), (i >= 5 ? 'hooha' : undefined), 'collects return value as well'); - i++; - } - equal(count, 4, 'calls function every time after n calls'); - - assertCalledAfter(1, 0); - assertCalledAfter(3, 3); - assertCalledAfter(10, 10); - assertCalledAfter(1, 1.5); - assertCalledAfter(1, '0'); - assertCalledAfter(3, '3'); - assertCalledAfter(10, '10'); - - assertCalledAfter(1, null); - assertCalledAfter(1, undefined); - assertCalledAfter(1, NaN); - assertCalledAfter(1, false); - assertCalledAfter(1, true); - assertCalledAfter(1, []); - assertCalledAfter(1, {}); - - assertCalledOutOfTen(10, [0]); - assertCalledOutOfTen(10, [1]); - assertCalledOutOfTen(9, [2]); - assertCalledOutOfTen(8, [3]); - - assertCalledOutOfTen(10, [0]); - assertCalledOutOfTen(10, [1]); - assertCalledOutOfTen(9, [2]); - assertCalledOutOfTen(8, [3]); - - raisesError(function() { run(fn, 'after', [-1]); }, 'negative raises an error'); - raisesError(function() { run(fn, 'after', ['-1']); }, 'negative string raises an error'); - raisesError(function() { run(fn, 'after', [Infinity]); }, 'Infinity raises an error'); - raisesError(function() { run(fn, 'after', [-Infinity]); }, '-Infinity raises an error'); - - - var count = 0; - var fn = function() { count++; }; - var single = run(run(fn, 'once', []), 'after', [3]); - for (var i = 0; i < 10; i++) { - single(); - } - equal(count, 1, 'works in conjunction with once to only be called a single time'); - - }); - -}); diff --git a/test/tests/function.js b/test/tests/function.js index 66651b1c8..d448f004d 100644 --- a/test/tests/function.js +++ b/test/tests/function.js @@ -1079,4 +1079,259 @@ namespace('Function', function() { }); + describeInstance('filter', function(filter) { + + var captureFiltered = filter(captureArgs, function(n) { + return n > 3; + }); + + it('should filter out calls below 3', () => { + captureFiltered(0); + captureFiltered(1); + captureFiltered(2); + captureFiltered(3); + captureFiltered(4); + assertArrayEqual(args, [[4]]); + }); + + it('should not return a value when filtered', () => { + assertUndefined(captureFiltered(0)); + }); + + it('should return when not filtered', () => { + assertArrayEqual(captureFiltered(4), [4]); + }); + + it('should filter when falsy', () => { + filter(captureArgs, function() { + return null; + })(1); + filter(captureArgs, function() { + return undefined; + })(2); + filter(captureArgs, function() { + return ''; + })(3); + filter(captureArgs, function() { + return NaN; + })(4); + filter(captureArgs, function() { + return 'a'; + })(5); + filter(captureArgs, function() { + return 8; + })(6); + filter(captureArgs, function() { + return []; + })(7); + assertArrayEqual(args, [[5], [6], [7]]); + }); + + it('should pass all args to the function', () => { + captureFiltered(4, 'a','b','c','d'); + assertArrayEqual(args, [[4, 'a','b','c','d']]); + }); + + it('should pass all args to filter function', () => { + (filter(captureArgs, function(a, b, c, d) { + assertArrayEqual([a,b,c,d], ['a','b','c','d']); + }))('a','b','c','d'); + }); + + it('should pass context to the function', () => { + filter(function() { + assertEqual(this, 'a'); + }, function() { + return true; + }).call('a'); + }); + + it('should pass context to filter function', () => { + filter(captureArgs, function() { + assertEqual(this, 'a'); + }).call('a'); + }); + + it('should work when typeof number', () => { + var fn = filter(captureArgs, function(n) { + return typeof n === 'number'; + }); + fn(0) + fn(1) + fn('1') + fn(null) + fn(NaN) + fn(true) + fn(false) + assertArrayEqual(args, [[0],[1],[NaN]]); + }); + + it('should work with Number', () => { + var fn = filter(captureArgs, Number); + fn(0) + fn(1) + fn('1') + fn(null) + fn(NaN) + fn(true) + fn(false) + assertArrayEqual(args, [[1],['1'],[true]]); + }); + + it('should error on invalid input', () => { + assertError(function() { filter() }); + assertError(function() { filter(null) }); + assertError(function() { filter(captureArgs) }); + assertError(function() { filter(captureArgs, null) }); + }); + + }); + + describeInstance('callAfter', function(callAfter) { + + it('should capture after returning true', () => { + var fn = callAfter(captureArgs, function(arg) { + return arg === true; + }); + fn(false, 1); + fn(false, 2); + fn(true, 3); + fn(false, 4); + fn(true, 5); + assertArrayEqual(args, [[true, 3], [false, 4], [true, 5]]); + }); + + it('should return values only after locked', () => { + var fn = callAfter(captureArgs, function(arg) { + return arg === true; + }); + assertUndefined(fn(false, 1)); + assertUndefined(fn(false, 2)); + assertArrayEqual(fn(true, 3), [true, 3]); + assertArrayEqual(fn(false, 4), [false, 4]); + assertArrayEqual(fn(true, 5), [true, 5]); + }); + + it('should work with a number as a shortcut for iterations', () => { + var fn = callAfter(captureArgs, 3); + fn('a'); + fn('b'); + fn('c'); + fn('d'); + assertArrayEqual(args, [['c'], ['d']]); + }); + + it('should pass all args to the function', () => { + var fn = callAfter(captureArgs, function(arg) { + return arg === true; + }); + assertArrayEqual(fn(true, 1, 2, 3, 4, 5), [true, 1, 2, 3, 4, 5]); + }); + + it('should pass context to the function', () => { + var fn = callAfter(function() { + assertEqual(this, 'a'); + }, function(arg) { + return true; + }).call('a'); + }); + + it('should pass all args to the filter function', () => { + (callAfter(captureArgs, function(a, b, c, d) { + assertArrayEqual([a,b,c,d], ['a','b','c','d']); + }))('a','b','c','d'); + }); + + it('should pass context to the filter function', () => { + callAfter(captureArgs, function() { + assertEqual(this, 'a'); + }).call('a'); + }); + + it('should error on invalid input', () => { + assertError(function() { callAfter() }); + assertError(function() { callAfter(null) }); + assertError(function() { callAfter(captureArgs) }); + assertError(function() { callAfter(captureArgs, null) }); + assertError(function() { callAfter(captureArgs, '1') }); + assertError(function() { callAfter(captureArgs, -1) }); + assertError(function() { callAfter(captureArgs, Infinity) }); + assertError(function() { callAfter(captureArgs, -Infinity) }); + }); + + }); + + describeInstance('callUntil', function(callUntil) { + + it('should capture until returning true', () => { + var fn = callUntil(captureArgs, function(arg) { + return arg === true; + }); + fn(false, 1); + fn(false, 2); + fn(true, 3); + fn(false, 4); + fn(true, 5); + assertArrayEqual(args, [[false, 1], [false, 2]]); + }); + + it('should return values only until locked', () => { + var fn = callUntil(captureArgs, function(arg) { + return arg === true; + }); + assertArrayEqual(fn(false, 1), [false, 1]); + assertArrayEqual(fn(false, 2), [false, 2]); + assertUndefined(fn(true, 3)); + assertUndefined(fn(false, 4)); + assertUndefined(fn(true, 5)); + }); + + it('should work with a number as a shortcut for iterations', () => { + var fn = callUntil(captureArgs, 3); + fn('a'); + fn('b'); + fn('c'); + fn('d'); + assertArrayEqual(args, [['a'], ['b']]); + }); + + it('should pass all args to the function', () => { + var fn = callUntil(captureArgs, function(arg) { + return arg === false; + }); + assertArrayEqual(fn(true, 1, 2, 3, 4, 5), [true, 1, 2, 3, 4, 5]); + }); + + it('should pass context to the function', () => { + var fn = callUntil(function() { + assertEqual(this, 'a'); + }, function(arg) { + return false; + }).call('a'); + }); + + it('should pass all args to the filter function', () => { + (callUntil(captureArgs, function(a, b, c, d) { + assertArrayEqual([a,b,c,d], ['a','b','c','d']); + }))('a','b','c','d'); + }); + + it('should pass context to the filter function', () => { + callUntil(captureArgs, function() { + assertEqual(this, 'a'); + }).call('a'); + }); + + it('should error on invalid input', () => { + assertError(function() { callUntil() }); + assertError(function() { callUntil(null) }); + assertError(function() { callUntil(captureArgs) }); + assertError(function() { callUntil(captureArgs, null) }); + assertError(function() { callUntil(captureArgs, '1') }); + assertError(function() { callUntil(captureArgs, -1) }); + assertError(function() { callUntil(captureArgs, Infinity) }); + assertError(function() { callUntil(captureArgs, -Infinity) }); + }); + + }); }); diff --git a/yarn.lock b/yarn.lock index cb2af3dac..b38269244 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3513,10 +3513,10 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -ready-test@^1.0.34: - version "1.0.34" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.34.tgz#3251834912d81a45bbbe27194fa309912f8810da" - integrity sha512-2nvb+Ml0NP1d3xrOV0ZBd3JB8yFQ+PP5h+7uhvYc6foCXJamKR/OgEQUzjmqc8gB8wZX2Pyo7Ape2VyI/D/t8w== +ready-test@^1.0.35: + version "1.0.35" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.35.tgz#28c0a3560068e0c0947ba72d29bcf55d804371ef" + integrity sha512-3Yp2p4IJYO1SSjRSbRSKi8pxaNZU2B9itXuMcZ+pgov3Q2gMIks4S6RFPA5uEG5KFAET2vKcjljj9acVxlImrA== dependencies: argv "^0.0.2" chalk "^4.1.0" From 9de6d6dc0509c4f969d2fafbd1595a7ecd710072 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 28 Jul 2020 18:19:38 +0900 Subject: [PATCH 063/191] fix for setTimeout not correctly being mocked in node --- test/index.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/test/index.js b/test/index.js index df36809ea..e8a5fa63d 100644 --- a/test/index.js +++ b/test/index.js @@ -1,8 +1,11 @@ -import { Sugar } from '../src'; -import Sinon from 'sinon'; +// Note: cannot use modules here as Sinon needs to apply fake timers +// before Sugar is imported to correctly mock setTimeout. +const Sinon = require('sinon'); global.clock = Sinon.useFakeTimers(); +const { Sugar } = require('../src'); + // TODO: test browserify // TODO: test broccoli // TODO: test rhino @@ -12,18 +15,18 @@ global.clock = Sinon.useFakeTimers(); global.Sugar = Sugar; // Helpers -import './helpers/namespace'; -import './helpers/suite'; -import './helpers/util'; -import './helpers/intl'; +require('./helpers/namespace'); +require('./helpers/suite'); +require('./helpers/util'); +require('./helpers/intl'); // Tests -import './tests/core'; -import './tests/chainable'; -import './tests/extended'; -import './tests/array'; -import './tests/number'; -import './tests/string'; -import './tests/regexp'; -import './tests/function'; -import './tests/modules'; +require('./tests/core'); +require('./tests/chainable'); +require('./tests/extended'); +require('./tests/array'); +require('./tests/number'); +require('./tests/string'); +require('./tests/regexp'); +require('./tests/function'); +require('./tests/modules'); From 0ced0cf6654116a35f700c35e6e07cc4d962232c Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 29 Aug 2020 14:03:03 +0900 Subject: [PATCH 064/191] added Array#at --- src/array/at.js | 39 ++++++++++++++++++++ src/array/define.js | 1 + src/array/methods.js | 1 + test/OLD/tests/array.js | 32 ---------------- test/tests/array.js | 82 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 123 insertions(+), 32 deletions(-) create mode 100644 src/array/at.js diff --git a/src/array/at.js b/src/array/at.js new file mode 100644 index 000000000..5b1c09276 --- /dev/null +++ b/src/array/at.js @@ -0,0 +1,39 @@ +/** + * Gets the element(s) at the given index. + * + * @param {Array} arr - The array. + * @param {number|number[]} index - The index to return the element at. + * If this is an array, multiple elements will be returned. + * @param {boolean} loop - When `true`, overshooting the end of the array will + * begin counting from the other end. Default `false`. + * + * @example + * + * [1,2,3].at(0) -> 1 + * [1,2,3].at(2) -> 3 + * [1,2,3].at(4) -> undefined + * [1,2,3].at(4, true) -> 2 + * [1,2,3].at(-1) -> 3 + * [1,2,3].at([0, 1]) -> [1, 2] + * + **/ +export default function(arr, index, loop = false) { + if (Array.isArray(index)) { + return index.map((i) => { + return getElement(arr, i, loop); + }); + } else { + return getElement(arr, index, loop); + } +} + +function getElement(arr, index, loop) { + index = +index; + if (loop) { + index %= arr.length; + } + if (index < 0) { + index += arr.length; + } + return arr[index]; +} diff --git a/src/array/define.js b/src/array/define.js index 60862cafc..379899d0e 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -1,4 +1,5 @@ import { defineInstance } from '../core/array'; import * as methods from './methods'; +defineInstance('at', methods.at); defineInstance('groupBy', methods.groupBy); diff --git a/src/array/methods.js b/src/array/methods.js index eaf22fa67..7037054a2 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1 +1,2 @@ +export { default as at } from './at'; export { default as groupBy } from './groupBy'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 490d2c724..cd60d7a34 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -102,38 +102,6 @@ namespace('Array', function () { }); - method('at', function() { - - test(['a','b','c'], [0], 'a', 'a,b,c | 0'); - test(['a','b','c'], [1], 'b', 'a,b,c | 1'); - test(['a','b','c'], [2], 'c', 'a,b,c | 2'); - test(['a','b','c'], [3], undefined, 'a,b,c | 3'); - test(['a','b','c'], [-1], 'c', 'a,b,c | -1'); - test(['a','b','c'], [-2], 'b', 'a,b,c | -2'); - test(['a','b','c'], [-3], 'a', 'a,b,c | -3'); - test(['a','b','c'], [-4], undefined, 'a,b,c | -3'); - - test(['a','b','c'], [3, true], 'a', 'a,b,c | 3'); - test(['a','b','c'], [-4, true], 'c', 'a,b,c | -3'); - test(['a','b','c'], [], undefined, 'a,b,c | no argument'); - test([false], [0], false, 'false | 0'); - - test(['a'], [0], 'a', 'a | 0'); - test(['a'], [1], undefined, 'a | loop off | 1'); - test(['a'], [1, true], 'a', 'a | 1'); - test(['a'], [-1], 'a', 'a | -1'); - test(['a'], [-2], undefined, 'a | -1'); - test(['a'], [-2, true], 'a', 'a | -1'); - - test(['a','b','c','d','e','f'], [[0,2,4,6]], safeArray('a','c','e', undefined), 'a,b,c,d,e,f | 0,2,4,6,false | false'); - - test(['a','b','c','d','e','f'], [[0,2,4]], ['a','c','e'], 'a,b,c,d,e,f | 0,2,4'); - test(['a','b','c','d','e','f'], [[1,3,5]], ['b','d','f'], 'a,b,c,d,e,f | 1,3,5'); - test(['a','b','c','d','e','f'], [[0,2,4,6], true], ['a','c','e','a'], 'a,b,c,d,e,f | 0,2,4,6'); - test(['a','b','c','d','e','f'], [[0,2,4,6,18], true], ['a','c','e','a','a'], 'a,b,c,d,e,f | 0,2,4,6,18'); - - }); - method('add', function() { test([], [], [], 'nothing'); diff --git a/test/tests/array.js b/test/tests/array.js index 5fcd3c8a3..44b61d9d1 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -108,4 +108,86 @@ namespace('Array', function() { }); + describeInstance('at', function(at) { + + it('should work with normal indexes', function () { + assertEqual(at(['a','b','c'], 0), 'a'); + assertEqual(at(['a','b','c'], 1), 'b'); + assertEqual(at(['a','b','c'], 2), 'c'); + assertUndefined(at(['a','b','c'], 3)); + }); + + it('should work with negative indexes', function () { + assertEqual(at(['a','b','c'], -1), 'c'); + assertEqual(at(['a','b','c'], -2), 'b'); + assertEqual(at(['a','b','c'], -3), 'a'); + assertUndefined(at(['a','b','c'], -4)); + }); + + it('should allow looping with positive indexes', function () { + assertEqual(at(['a','b','c'], 3, true), 'a'); + assertEqual(at(['a','b','c'], 4, true), 'b'); + assertEqual(at(['a','b','c'], 5, true), 'c'); + assertEqual(at(['a','b','c'], 6, true), 'a'); + assertEqual(at(['a','b','c'], 6000, true), 'a'); + }); + + it('should allow looping with negative indexes', function () { + assertEqual(at(['a','b','c'], -4, true), 'c'); + assertEqual(at(['a','b','c'], -5, true), 'b'); + assertEqual(at(['a','b','c'], -6, true), 'a'); + assertEqual(at(['a','b','c'], -7, true), 'c'); + assertEqual(at(['a','b','c'], -7000, true), 'c'); + }); + + it('should return multiple elements with an array', function () { + assertArrayEqual(at(['a','b','c'], [0, 2]), ['a', 'c']); + assertArrayEqual(at(['a','b','c'], [1, 2]), ['b', 'c']); + assertArrayEqual(at(['a','b','c'], [1, 3]), ['b', undefined]); + }); + + it('should return multiple elements with negative indexes', function () { + assertArrayEqual(at(['a','b','c'], [-1, -2]), ['c', 'b']); + assertArrayEqual(at(['a','b','c'], [-1, -3]), ['c', 'a']); + assertArrayEqual(at(['a','b','c'], [-1, -4]), ['c', undefined]); + }); + + it('should return multiple elements with mixed indexes', function () { + assertArrayEqual(at(['a','b','c'], [-1, 1]), ['c', 'b']); + assertArrayEqual(at(['a','b','c'], [ 1,-1]), ['b', 'c']); + }); + + it('should return multiple elements with looping', function () { + assertArrayEqual(at(['a','b','c'], [1, 3], true), ['b', 'a']); + assertArrayEqual(at(['a','b','c'], [-1, -4], true), ['c', 'c']); + assertArrayEqual(at(['a','b','c'], [-4000, 5000], true), ['c', 'c']); + }); + + it('should have no issues with sparse arrays', function() { + assertEqual(at(['a',,'c'], 0), 'a'); + assertUndefined(at(['a',,'c'], 1)); + assertEqual(at(['a',,'c'], 2), 'c'); + assertUndefined(at(['a',,'c'], 3)); + assertEqual(at(['a',,'c'], 3, true), 'a'); + assertEqual(at(['a',,'c'], -1), 'c'); + assertUndefined(at(['a',,'c'], -2)); + assertEqual(at(['a',,'c'], -3), 'a'); + assertUndefined(at(['a',,'c'], -4)); + assertEqual(at(['a',,'c'], -4, true), 'c'); + }); + + it('should handle irregular input', function() { + assertEqual(at(['a','b','c'], '0'), 'a'); + assertEqual(at(['a','b','c'], '1'), 'b'); + assertEqual(at(['a','b','c'], '-1'), 'c'); + assertEqual(at(['a','b','c'], '-0'), 'a'); + assertEqual(at(['a','b','c'], null), 'a'); + assertEqual(at(['a','b','c'], true), 'b'); + assertEqual(at(['a','b','c'], false), 'a'); + assertUndefined(at(['a','b','c'])); + assertUndefined(at(['a','b','c'], undefined)); + }); + + }); + }); From 769f5bbc9b098089ab034c2acad3054b7952f4d7 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 29 Aug 2020 16:34:53 +0900 Subject: [PATCH 065/191] Added Array#remove and Array#exclude --- src/array/define.js | 2 + src/array/exclude.js | 47 +++++++++++++ src/array/methods.js | 2 + src/array/remove.js | 50 ++++++++++++++ src/util/array.js | 46 +++++++++++++ src/util/matchers.js | 58 ++++++++++++++++ test/OLD/tests/array.js | 63 ------------------ test/tests/array.js | 144 +++++++++++++++++++++++++++++++++++++++- 8 files changed, 348 insertions(+), 64 deletions(-) create mode 100644 src/array/exclude.js create mode 100644 src/array/remove.js create mode 100644 src/util/array.js create mode 100644 src/util/matchers.js diff --git a/src/array/define.js b/src/array/define.js index 379899d0e..427a2a996 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -2,4 +2,6 @@ import { defineInstance } from '../core/array'; import * as methods from './methods'; defineInstance('at', methods.at); +defineInstance('exclude', methods.exclude); defineInstance('groupBy', methods.groupBy); +defineInstance('remove', methods.remove); diff --git a/src/array/exclude.js b/src/array/exclude.js new file mode 100644 index 000000000..69b343400 --- /dev/null +++ b/src/array/exclude.js @@ -0,0 +1,47 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + Returns a new array with elements removed. + * + * @extra This method can be thought of as the inverse of `Array#filter`. It + * will not modify the original array, Use `remove` to modify the + * array in place. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to find the elements to exclude. When a + * function is passed a truthy return value will match the element. Primitives + * will directly match elements. Can also be a Date object to match dates, a + * RegExp which will test against strings, or a plain object which will perform + * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {Array} + * + * @callback searchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].exclude(3) -> [1,2] + * ['a','b','c'].exclude(/b/) -> ['a','c'] + * [{a:1},{b:2}].exclude(function(n) { + * return n['a'] == 1; + * }); -> [{b:2}] + * + **/ +export default function exclude(arr, match) { + assertArray(arr); + const result = []; + const matcher = getMatcher(match); + forEachSparse(arr, (el, i) => { + if (!matcher(arr[i], i, arr)) { + result.push(arr[i]); + } + }); + return result; +} diff --git a/src/array/methods.js b/src/array/methods.js index 7037054a2..f19004d94 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1,2 +1,4 @@ export { default as at } from './at'; +export { default as exclude } from './exclude'; export { default as groupBy } from './groupBy'; +export { default as remove } from './remove'; diff --git a/src/array/remove.js b/src/array/remove.js new file mode 100644 index 000000000..21fe7e2cd --- /dev/null +++ b/src/array/remove.js @@ -0,0 +1,50 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + * Removes an element from the array. + * + * @extra This method will modify the array! Use `exclude` for a + * non-destructive alias. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to find the elements to remove. When + * a function is passed a truthy return value will match the element. Primitives + * will directly match elements. Can also be a Date object to match dates, a + * RegExp which will test against strings, or a plain object which will perform + * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {Array} + * + * @callback searchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].remove(3) -> [1,2] + * ['a','b','c'].remove(/b/) -> ['a','c'] + * [{a:1},{b:2}].remove(function(n) { + * return n['a'] == 1; + * }); -> [{b:2}] + * + **/ +export default function remove(arr, match) { + assertArray(arr); + const matcher = getMatcher(match); + const indexes = []; + forEachSparse(arr, (el, i) => { + if (matcher(arr[i], i, arr)) { + indexes.push(i); + } + }); + for (let i = 0, len = indexes.length; i < len; i++) { + const idx = indexes[i]; + arr.splice(idx - i, 1); + } + return arr; +} diff --git a/src/util/array.js b/src/util/array.js new file mode 100644 index 000000000..b0004f14c --- /dev/null +++ b/src/util/array.js @@ -0,0 +1,46 @@ +import { hasOwnProperty, forEachProperty } from './helpers'; + +// Iterate over arrays with fallback to prevent iterating +// over all members of sparse arrays. + +export function forEachSparse(arr, fn) { + for (let i = 0, len = arr.length; i < len; i++) { + if (!hasOwnProperty(arr, i)) { + return iterateOverSparseArray(arr, fn, i); + } + if (fn(arr[i], i, arr) === false) { + break; + } + } +} + +function isArrayIndex(n) { + return n >>> 0 == n && n != 0xFFFFFFFF; +} + +function iterateOverSparseArray(arr, fn, fromIndex) { + const indexes = getSparseArrayIndexes(arr, fromIndex); + for (let j = 0, len = indexes.length; j < len; j++) { + const i = indexes[j]; + if (fn(arr[i], i, arr) === false) { + break; + } + } +} + +// It's unclear whether or not sparse arrays qualify as "simple enumerables". +// If they are not, however, the wrapping function will be deoptimized, so +// isolate here. +function getSparseArrayIndexes(arr, fromIndex) { + var indexes = []; + forEachProperty(arr, (key) => { + if (isArrayIndex(key) && key >= fromIndex) { + indexes.push(+key); + } + }); + indexes.sort((a, b) => { + return a - b; + }); + return indexes; +} + diff --git a/src/util/matchers.js b/src/util/matchers.js new file mode 100644 index 000000000..d52c07e90 --- /dev/null +++ b/src/util/matchers.js @@ -0,0 +1,58 @@ +import { isPrimitive, isRegExp, isDate, isFunction, isObjectType } from './typeChecks'; +import { forEachProperty } from './helpers'; +import { isPlainObject } from './object'; + +export function getMatcher(obj) { + if (!isPrimitive(obj)) { + if (isRegExp(obj)) { + return getRegexMatcher(obj); + } else if (isDate(obj)) { + return getDateMatcher(obj); + } else if (isFunction(obj)) { + return getFunctionMatcher(obj); + } else if (isPlainObject(obj)) { + return getFuzzyMatcher(obj); + } + } + return (el) => { + return el === obj; + }; +} + +function getRegexMatcher(reg) { + return (el) => { + return reg.test(el); + }; +} + +function getDateMatcher(date) { + const time = date.getTime(); + return (el) => { + return isDate(el) && el.getTime() == time; + }; +} + +function getFunctionMatcher(fn) { + return (el, i, arr) => { + // Return true up front if match by reference + return el === fn || fn.call(arr, el, i, arr); + }; +} + +function getFuzzyMatcher(obj) { + const matchers = new Map(); + return (el, i, arr) => { + if (!isObjectType(el)) { + return false; + } + let matched = true; + forEachProperty(obj, (key, val) => { + matchers[key] = matchers[key] || getMatcher(val); + if (matchers[key].call(arr, el[key], i, arr) === false) { + matched = false; + } + return matched; + }); + return matched; + }; +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index cd60d7a34..cb0fd99d1 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -1683,68 +1683,5 @@ namespace('Array', function () { }); - method('remove', function() { - var fn; - fn = function() {}; - - test([1,2,2,3], [1,2,2,3], 'no argument numeric'); - test([1,2,2,3], [2], [1,3], 'remove 2s'); - test([0,1,2], [0], [1,2], 'finds 0'); - test(['a','b','c','c'], ['a','b','c','c'], 'no argument alphabet'); - test(['a','b','c','c'], ['c'], ['a','b'], 'remove "c"s'); - test(['a','b','c','c'], [/[ac]/], ['b'], 'regex fuzzy matching'); - test([1,2,2,3], [function(el) { return el % 2 == 0; }], [1,3], 'remove all odd numbers'); - test([1,2,2,3], [function(el) { return el > 2; }], [1,2,2], 'remove all numbers greater than 2'); - test([1,2,2,3], [function(el) { return el > 20; }], [1,2,2,3], 'remove all numbers greater than 20'); - test([{a:1},{a:2},{a:1}], [{a:1}], [{a:2}], 'remove all a:1'); - test([fn], [fn], [], 'can find via strict equality'); - test([1,[2,3]], [[2,3]], [1], 'removing nested arrays'); - - - fn = function(el,i,arr) { - equal(el, 'a', 'first param should be the element'); - equal(i, 0, 'second param should be the index'); - equal(arr, ['a'], 'third param should be the array'); - } - run(['a'], 'remove', [fn]); - - var arr = [1,2,3]; - run(arr, 'remove', [2]); - equal(arr, [1,3], 'should affect the original array'); - - }); - - method('exclude', function() { - var arr, fn; - - fn = function() {}; - - test([1,2,2,3], [1,2,2,3], 'no argument numeric'); - test([1,2,2,3], [2], [1,3], 'exclude 2s'); - test([0,1,2], [0], [1,2], 'finds 0'); - test(['a','b','c','c'], ['a','b','c','c'], 'no argument alphabet'); - test(['a','b','c','c'], ['c'], ['a','b'], 'exclude "c"s'); - test(['a','b','c','c'], [/[ac]/], ['b'], 'regex fuzzy matching'); - test([1,2,2,3], [function(el){ return el % 2 == 0; }], [1,3], 'exclude all odd numbers'); - test([1,2,2,3], [function(el){ return el > 2; }], [1,2,2], 'exclude all numbers greater than 2'); - test([1,2,2,3], [function(el){ return el > 20; }], [1,2,2,3], 'exclude all numbers greater than 20'); - test([{a:1},{a:2},{a:1}], [{a:1}], [{a:2}], 'exclude all a:1'); - test([fn], [fn], [], 'can find via strict equality'); - test([1,[2,3]], [[2,3]], [1], 'removing nested arrays'); - - fn = function(el,i,arr){ - equal(el, 'a', 'first param should be the element'); - equal(i, 0, 'second param should be the index'); - equal(arr, ['a'], 'third param should be the array'); - } - run(['a'], 'exclude', [fn]); - - arr = [1,2,3]; - run(arr, 'exclude', [2]); - equal(arr, [1,2,3], 'should not affect the original array'); - - }); - - }); diff --git a/test/tests/array.js b/test/tests/array.js index 44b61d9d1..5eb9a48c5 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -84,7 +84,7 @@ namespace('Array', function() { }); it('should call a function if necessary', function () { - const arr = [ + var arr = [ { name: function() { return 'Jim'; } }, ]; assertObjectEqual( @@ -164,6 +164,7 @@ namespace('Array', function() { }); it('should have no issues with sparse arrays', function() { + /* eslint-disable no-sparse-arrays */ assertEqual(at(['a',,'c'], 0), 'a'); assertUndefined(at(['a',,'c'], 1)); assertEqual(at(['a',,'c'], 2), 'c'); @@ -190,4 +191,145 @@ namespace('Array', function() { }); + describeInstance('remove', function(remove) { + + it('should modify the array', function() { + var arr1 = ['a', 'b', 'c']; + var arr2 = remove(arr1, 'c'); + assertEqual(arr1.length, 2); + assertEqual(arr2, arr1); + }); + + it('should remove array members', function() { + assertArrayEqual(remove([1,2,2,3], 2), [1,3]); + assertArrayEqual(remove([0,1], 0), [1]); + }); + + it('should remove by regex', function() { + assertArrayEqual(remove(['a','b','c'], /[ac]/), ['b']); + assertArrayEqual(remove([1,2,3,4], /[2-3]/), [1,4]); + }); + + it('should remove by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertArrayEqual(remove([d1, d2], new Date(2020, 7, 28)), [d2]); + }); + + it('should remove by function', function() { + assertArrayEqual(remove([1,2,3,4], (n) => n % 2 === 0), [1,3]); + assertArrayEqual(remove([1,2,3,4], (n) => n > 5), [1,2,3,4]); + assertArrayEqual(remove([1,2,3,4], (n) => n > 2), [1,2]); + }); + + it('should remove by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertArrayEqual(remove([fn1, fn2], fn2), [fn1]); + }); + + it('should remove by fuzzy matching', function() { + assertArrayEqual(remove([{a:1,b:1},{a:2,b:2}], {a:1}), [{a:2,b:2}]); + assertArrayEqual(remove([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'James'}]); + }); + + it('should pass correct params to callback', function() { + remove(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + remove(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertArrayEqual(remove([1,2,2,3]), [1,2,2,3]); + assertArrayEqual(remove([1,2,2,3], null), [1,2,2,3]); + assertArrayEqual(remove([1,2,2,3], NaN), [1,2,2,3]); + assertError(function() { remove(null); }); + assertError(function() { remove('a'); }); + assertError(function() { remove(1); }); + }); + + }); + + describeInstance('exclude', function(exclude) { + + it('should not modify the array', function() { + var arr1 = ['a', 'b', 'c']; + var arr2 = exclude(arr1, 'c'); + assertEqual(arr1.length, 3); + assertEqual(arr2.length, 2); + }); + + it('should exclude array members', function() { + assertArrayEqual(exclude([1,2,2,3], 2), [1,3]); + assertArrayEqual(exclude([0,1], 0), [1]); + }); + + it('should exclude by regex', function() { + assertArrayEqual(exclude(['a','b','c'], /[ac]/), ['b']); + assertArrayEqual(exclude([1,2,3,4], /[2-3]/), [1,4]); + }); + + it('should exclude by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertArrayEqual(exclude([d1, d2], new Date(2020, 7, 28)), [d2]); + }); + + it('should exclude by function', function() { + assertArrayEqual(exclude([1,2,3,4], (n) => n % 2 === 0), [1,3]); + assertArrayEqual(exclude([1,2,3,4], (n) => n > 5), [1,2,3,4]); + assertArrayEqual(exclude([1,2,3,4], (n) => n > 2), [1,2]); + }); + + it('should exclude by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertArrayEqual(exclude([fn1, fn2], fn2), [fn1]); + }); + + it('should exclude by fuzzy matching', function() { + assertArrayEqual(exclude([{a:1,b:1},{a:2,b:2}], {a:1}), [{a:2,b:2}]); + assertArrayEqual(exclude([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'James'}]); + }); + + it('should pass correct params to callback', function() { + exclude(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + exclude(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertArrayEqual(exclude([1,2,2,3]), [1,2,2,3]); + assertArrayEqual(exclude([1,2,2,3], null), [1,2,2,3]); + assertArrayEqual(exclude([1,2,2,3], NaN), [1,2,2,3]); + assertError(function() { exclude(null); }); + assertError(function() { exclude('a'); }); + assertError(function() { exclude(1); }); + }); + + }); }); From df07c72398a884a614502f4a6c031dcac20d5173 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 30 Aug 2020 23:20:59 +0900 Subject: [PATCH 066/191] Array#count and Array#sum --- src/array/count.js | 40 +++++++++++ src/array/define.js | 2 + src/array/exclude.js | 2 +- src/array/methods.js | 2 + src/array/sum.js | 37 ++++++++++ src/util/deepProperties.js | 24 +++---- src/util/enumerable.js | 2 +- src/util/mappers.js | 21 ++++++ src/util/matchers.js | 10 ++- test/OLD/tests/enumerable.js | 25 ------- test/tests/array.js | 127 +++++++++++++++++++++++++++++++++++ 11 files changed, 249 insertions(+), 43 deletions(-) create mode 100644 src/array/count.js create mode 100644 src/array/sum.js create mode 100644 src/util/mappers.js diff --git a/src/array/count.js b/src/array/count.js new file mode 100644 index 000000000..d370c32cf --- /dev/null +++ b/src/array/count.js @@ -0,0 +1,40 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + * Counts elements in the array. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to determine elements that will be + * counted. When a function is passed a truthy return value will match the + * element. Primitives will directly match elements. Can also be a Date object + * to match dates, a RegExp which will test against strings, or a plain object + * which will perform a "fuzzy match" on specific properties. Values of a fuzzy + * match can be any of the matcher types listed above. + * + * @returns {number} + * + * @example + * + * ['a','b','a'].count('a') -> 2 + * ['a','b','c'].count(/b/) -> 1 + * users.count(function(user) { + * return user.age > 30; + * }); -> number of users older than 30 + * + **/ +export default function count(arr, match) { + assertArray(arr); + if (arguments.length === 1) { + return arr.length; + } + let count = 0; + const matcher = getMatcher(match); + forEachSparse(arr, (el, i) => { + if (matcher(arr[i], i, arr)) { + count += 1; + } + }); + return count; +} diff --git a/src/array/define.js b/src/array/define.js index 427a2a996..785355fa4 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -2,6 +2,8 @@ import { defineInstance } from '../core/array'; import * as methods from './methods'; defineInstance('at', methods.at); +defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); defineInstance('groupBy', methods.groupBy); defineInstance('remove', methods.remove); +defineInstance('sum', methods.sum); diff --git a/src/array/exclude.js b/src/array/exclude.js index 69b343400..ce77ac852 100644 --- a/src/array/exclude.js +++ b/src/array/exclude.js @@ -3,7 +3,7 @@ import { assertArray } from '../util/assertions'; import { forEachSparse } from '../util/array'; /** - Returns a new array with elements removed. + * Returns a new array with elements removed. * * @extra This method can be thought of as the inverse of `Array#filter`. It * will not modify the original array, Use `remove` to modify the diff --git a/src/array/methods.js b/src/array/methods.js index f19004d94..d6712c123 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1,4 +1,6 @@ export { default as at } from './at'; +export { default as count } from './count'; export { default as exclude } from './exclude'; export { default as groupBy } from './groupBy'; export { default as remove } from './remove'; +export { default as sum } from './sum'; diff --git a/src/array/sum.js b/src/array/sum.js new file mode 100644 index 000000000..cf6825bd0 --- /dev/null +++ b/src/array/sum.js @@ -0,0 +1,37 @@ +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; +import { getMapper } from '../util/mappers'; + +/** + * Sums values in the array. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to sum. A + * function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * + * @returns {number} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].sum(); -> 6 + * users.sum((user) => user.votes) -> // total user votes + * users.sum('votes') -> // total user votes + * users.sum('profile.likes') -> // total profile likes + * + **/ +export default function sum(arr, map) { + assertArray(arr); + let sum = 0; + const mapper = getMapper(map); + forEachSparse(arr, (el, i) => { + sum += mapper(arr[i], i, arr); + }); + return sum; +} diff --git a/src/util/deepProperties.js b/src/util/deepProperties.js index a2d5b5c0c..e1d75558a 100644 --- a/src/util/deepProperties.js +++ b/src/util/deepProperties.js @@ -2,23 +2,23 @@ import { isString, isObjectType } from './typeChecks'; import { isDefined, hasOwnProperty } from './helpers'; import { assertArray, assertWritable } from './assertions'; -export function deepHasProperty(obj, key, any) { - return handleDeepProperty(obj, key, any, true); +export function deepHasProperty(obj, key) { + return handleDeepProperty(obj, key, true); } -export function deepGetProperty(obj, key, any) { - return handleDeepProperty(obj, key, any, false); +export function deepGetProperty(obj, key) { + return handleDeepProperty(obj, key, false); } export function deepSetProperty(obj, key, val) { - handleDeepProperty(obj, key, false, false, true, false, val); + handleDeepProperty(obj, key, false, true, false, val); return obj; } // Matches 1..2 style ranges in properties. const PROPERTY_RANGE_REG = /^(.*?)\[([-\d]*)\.\.([-\d]*)\](.*)$/; -function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { +function handleDeepProperty(obj, key, has, fill, fillLast, val) { var ns, bs, ps, cbi, set, isLast, isPush, isIndex, nextIsIndex, exists; ns = obj; if (key == null) return; @@ -29,7 +29,7 @@ function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { } else { key = String(key); if (key.indexOf('..') !== -1) { - return handleArrayIndexRange(obj, key, any, val); + return handleArrayIndexRange(obj, key, val); } bs = key.split('['); } @@ -81,9 +81,7 @@ function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { // 2nd part, if there is only 1 part, or if there is an explicit key. if (i || key || blen === 1) { - // TODO: need to be sure this check handles ''.length when - // we refactor. - exists = any ? key in Object(ns) : hasOwnProperty(ns, key); + exists = hasOwnProperty(ns, key); // Non-existent namespaces are only filled if they are intermediate // (not at the end) or explicitly filling the last. @@ -111,7 +109,7 @@ function handleDeepProperty(obj, key, any, has, fill, fillLast, val) { } // Get object property with support for 0..1 style range notation. -function handleArrayIndexRange(obj, key, any, val) { +function handleArrayIndexRange(obj, key, val) { var match, start, end, leading, trailing, arr, set; match = key.match(PROPERTY_RANGE_REG); if (!match) { @@ -122,7 +120,7 @@ function handleArrayIndexRange(obj, key, any, val) { leading = match[1]; if (leading) { - arr = handleDeepProperty(obj, leading, any, false, set ? true : false, true); + arr = handleDeepProperty(obj, leading, false, set ? true : false, true); } else { arr = obj; } @@ -140,7 +138,7 @@ function handleArrayIndexRange(obj, key, any, val) { if (set) { for (var i = start; i < end; i++) { - handleDeepProperty(arr, i + trailing, any, false, true, false, val); + handleDeepProperty(arr, i + trailing, false, true, false, val); } } else { arr = arr.slice(start, end); diff --git a/src/util/enumerable.js b/src/util/enumerable.js index 9e16c245a..25e53092c 100644 --- a/src/util/enumerable.js +++ b/src/util/enumerable.js @@ -13,6 +13,6 @@ export function mapWithShortcuts(el, map, context, mapArgs) { } else if (isFunction(el[map])) { return el[map].call(el); } else { - return deepGetProperty(el, map, true); + return deepGetProperty(el, map); } } diff --git a/src/util/mappers.js b/src/util/mappers.js new file mode 100644 index 000000000..84dcd692e --- /dev/null +++ b/src/util/mappers.js @@ -0,0 +1,21 @@ +import { isFunction, isString } from './typeChecks'; +import { deepGetProperty } from './deepProperties'; + +export function getMapper(obj) { + if (isFunction(obj)) { + return obj; + } else if (isString(obj)) { + return getPropertyMapper(obj); + } + return defaultMapper; +} + +function getPropertyMapper(str) { + return (el) => { + return deepGetProperty(el, str); + }; +} + +function defaultMapper(el) { + return el; +} diff --git a/src/util/matchers.js b/src/util/matchers.js index d52c07e90..b2e293b63 100644 --- a/src/util/matchers.js +++ b/src/util/matchers.js @@ -14,9 +14,7 @@ export function getMatcher(obj) { return getFuzzyMatcher(obj); } } - return (el) => { - return el === obj; - }; + return getDefaultMatcher(obj); } function getRegexMatcher(reg) { @@ -39,6 +37,12 @@ function getFunctionMatcher(fn) { }; } +function getDefaultMatcher(obj) { + return (el) => { + return el === obj; + }; +} + function getFuzzyMatcher(obj) { const matchers = new Map(); return (el, i, arr) => { diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 396ac5d9a..632b0c0f6 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1622,31 +1622,6 @@ namespace('Array', function() { }); - method('count', function() { - test([1,2,2,3], 4, 'no arugment numeric'); - test([1,2,2,3], [2], 2, 'count 2s'); - test(['a','b','c','c'], 4, 'no argument alphabet'); - test(['a','b','c','c'], ['c'], 2, 'count "c"s'); - test([1,2,2,3], [function(el) { return el % 2 == 0; }], 2, 'count all odd numbers'); - test([1,2,2,3], [function(el) { return el > 2; }], 1, 'count all numbers greater than 2'); - test([1,2,2,3], [function(el) { return el > 20; }], 0, 'count all numbers greater than 20'); - test([{a:1},{a:2},{a:1}], [{a:1}], 2, 'count all a:1'); - }); - - method('sum', function() { - test([12,87,55], 154, '12,87,55'); - test([12,87,128], 227, '12,87,128'); - test([], 0, 'empty array is 0'); - test([null, false], 0, '[null,false] is 0'); - test([{a:1,b:5},{a:2,b:5},{a:3,b:5}], [function(el) { return el['a']; }], 6, 'key "a"'); - test([{a:1,b:5},{a:2,b:5},{a:3,b:5}], ['a'], 6, 'shortcut for key "a"'); - test([{a:{b:5}},{a:{b:6}}], ['a.b'], 11, 'deep properties'); - - var arr = [1,2,3]; - arr['foo'] = 5; - test(arr, 6, 'Should not enumerate over non-index properties'); - }); - method('average', function() { var people = [ { name: 'jim', age: 27, hair: 'brown' }, diff --git a/test/tests/array.js b/test/tests/array.js index 5eb9a48c5..d8387458f 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -332,4 +332,131 @@ namespace('Array', function() { }); }); + + describeInstance('count', function(count) { + + it('should count all elements with no arguments', function() { + assertEqual(count(['a','b','c']), 3); + }); + + it('should count by primitive matchers', function() { + assertEqual(count(['a','b','c'], 'a'), 1); + assertEqual(count([3,1,2,3], 3), 2); + assertEqual(count([true, true, false, true], true), 3); + }); + + it('should match by regex', function() { + assertEqual(count(['a','b','c'], /[ac]/), 2); + assertEqual(count([1,2,3,4], /[3]/), 1); + }); + + it('should count by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(count([d1, d2], new Date(2020, 7, 28)), 1); + }); + + it('should count by function', function() { + assertEqual(count([1,2,3,4], (n) => n % 2 === 0), 2); + assertEqual(count([1,2,3,4], (n) => n > 5), 0); + assertEqual(count([1,2,3,4], (n) => n > 2), 2); + }); + + it('should count by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(count([fn1, fn2], fn2), 1); + }); + + it('should count by fuzzy matching', function() { + assertEqual(count([{a:1,b:1},{a:2,b:2}], {a:1}), 1); + assertEqual(count([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), 1); + }); + + it('should pass correct params to callback', function() { + count(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should not iterate over all members of sparse arrays', function() { + var n = 0; + var arr = ['a']; + arr[8000] = 'b'; + count(arr, function () { + n++; + }); + assertEqual(n, 2); + }); + + it('should handle irregular input', function() { + assertEqual(count([1,2,2,3], null), 0); + assertEqual(count([1,2,2,3], NaN), 0); + assertError(function() { count(null); }); + assertError(function() { count('a'); }); + assertError(function() { count(1); }); + }); + + }); + + describeInstance('sum', function(sum) { + + it('should sum all elements with no arguments', function() { + assertEqual(sum([1,2,3]), 6); + assertEqual(sum([0,0,0]), 0); + }); + + it('should sum with function mapper', function() { + assertEqual(sum([1,2,3,4], (n) => n * 2), 20); + assertEqual(sum([1,2,3,4], (n) => n % 2 === 0 ? n : 0), 6); + assertEqual(sum([1,2,3,4], (n) => n > 5 ? n : 0), 0); + assertEqual(sum([1,2,3,4], (n) => n > 2 ? n : 0), 7); + }); + + it('should sum with string mapper', function() { + assertEqual(sum([{a:2},{a:5}], 'a'), 7); + assertNaN(sum([{a:2},{a:5}], 'b')); + }); + + it('should handle deep properties', function() { + assertEqual(sum([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), 73); + assertEqual(sum([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), 189); + assertEqual(sum([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), 189); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + sum(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(sum([]), 0); + assertEqual(sum([null, false]), 0); + assertError(function() { sum(); }); + assertError(function() { sum(null); }); + assertError(function() { sum(1); }); + assertError(function() { sum('a'); }); + }); + + }); + }); From a61fb0c64615574335bbca48ef8a28a56abc9347 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sun, 30 Aug 2020 23:50:02 +0900 Subject: [PATCH 067/191] Array#average and Array#median --- src/array/average.js | 40 +++++++++++ src/array/define.js | 2 + src/array/median.js | 49 ++++++++++++++ src/array/methods.js | 2 + test/OLD/tests/enumerable.js | 59 ---------------- test/tests/array.js | 127 ++++++++++++++++++++++++++++++++++- 6 files changed, 218 insertions(+), 61 deletions(-) create mode 100644 src/array/average.js create mode 100644 src/array/median.js diff --git a/src/array/average.js b/src/array/average.js new file mode 100644 index 000000000..a8191f1d9 --- /dev/null +++ b/src/array/average.js @@ -0,0 +1,40 @@ +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the mean average for values in the array. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to average. + * A function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * + * @returns {number} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].average(); -> 2 + * users.average((user) => user.votes) -> // average user votes + * users.average('votes') -> // average user votes + * users.average('profile.likes') -> // average profile likes + * + **/ +export default function average(arr, map) { + assertArray(arr); + if (arr.length === 0) { + return 0; + } + let sum = 0; + const mapper = getMapper(map); + forEachSparse(arr, (el, i) => { + sum += mapper(arr[i], i, arr); + }); + return sum / arr.length; +} diff --git a/src/array/define.js b/src/array/define.js index 785355fa4..7d51f081b 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -2,8 +2,10 @@ import { defineInstance } from '../core/array'; import * as methods from './methods'; defineInstance('at', methods.at); +defineInstance('average', methods.average); defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); defineInstance('groupBy', methods.groupBy); +defineInstance('median', methods.median); defineInstance('remove', methods.remove); defineInstance('sum', methods.sum); diff --git a/src/array/median.js b/src/array/median.js new file mode 100644 index 000000000..fba031e45 --- /dev/null +++ b/src/array/median.js @@ -0,0 +1,49 @@ +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the median average for values in the array. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to average. + * A function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * + * @returns {number} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,5].median(); -> 2 + * users.median((user) => user.votes) -> // median user votes + * users.median('votes') -> // median user votes + * users.median('profile.likes') -> // median profile likes + * + **/ +export default function median(arr, map) { + assertArray(arr); + const len = arr.length; + if (len === 0) { + return 0; + } + const values = []; + const mapper = getMapper(map); + forEachSparse(arr, (el, i) => { + values.push(mapper(arr[i], i, arr)); + }); + values.sort((a, b) => { + return a - b; + }); + const mid = Math.trunc(len / 2); + if (arr.length % 2 === 0) { + return (values[mid - 1] + values[mid]) / 2; + } else { + return values[mid]; + } +} diff --git a/src/array/methods.js b/src/array/methods.js index d6712c123..113560161 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1,6 +1,8 @@ export { default as at } from './at'; +export { default as average } from './average'; export { default as count } from './count'; export { default as exclude } from './exclude'; export { default as groupBy } from './groupBy'; +export { default as median } from './median'; export { default as remove } from './remove'; export { default as sum } from './sum'; diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 632b0c0f6..0e63d9678 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1622,65 +1622,6 @@ namespace('Array', function() { }); - method('average', function() { - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' } - ]; - - test([13,18,13,14,13,16,14,21,13], 15, '13,18,13,14,13,16,14,21,13'); - test([2,2,2], 2, '2,2,2'); - test([2,3,4], 3, '2,3,4'); - test([2,3,4,2], 2.75, '2,3,4,2'); - test([], 0, 'empty array is 0'); - test([null, false], 0, '[null, false] is 0'); - test([{a:1,b:5},{a:2,b:5},{a:3,b:5}], [function(el) { return el['a']; }], 2, 'key "a"'); - test([{a:1,b:5},{a:2,b:5},{a:3,b:5}], ['a'], 2, 'shortcut for key "a"'); - - test(people, ['age'], 29.75, 'people average age is 29.75'); - test(people, [function(p) { return p.age; }], 29.75, 'people average age is 29.75 by function'); - equal(isNaN(run(people, 'average', [function(p) { return p.hair; }])), true, 'people average hair is NaN'); - - test([{a:{b:5}},{a:{b:11}}], ['a.b'], 8, 'deep properties'); - }); - - method('median', function() { - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' } - ]; - - test([1,2,3,4,5], 3, '1,2,3,4,5'); - test([5,4,3,2,1], 3, '5,4,3,2,1'); - test([2,1,3,4,5], 3, '2,1,3,4,5'); - test([1,2,2,4,5], 2, '1,2,2,4,5'); - test([5,4,2,2,1], 2, '5,4,2,2,1'); - test([1,1,1,1,1], 1, '1,1,1,1,1'); - - test([1,2,3,4,5,6], 3.5, '1,2,3,4,5,6'); - test([6,5,4,3,2,1], 3.5, '6,5,4,3,2,1'); - - test([1,5,6,3,9,8,4,2,0,7], 4.5, '1,5,6,3,9,8,4,2,0,7'); - test([1,2,3], 2, '1,2,3'); - test([1,2], 1.5, '1,2'); - test([1], 1, '1'); - test([], 0, 'no entries in array should be undefined'); - - test([1.50,.0024,15.25,44.2], 8.375, 'decimals'); - test([0,0,0,0], 0, 'all zero'); - test([NaN,NaN,NaN], NaN, 'all NaN'); - test([null,false], 0, 'null,false coerced'); - - test(people, ['age'], 27, 'people median age is 27'); - test(people, [function(p) { return p.age; }], 27, 'people median age is 27 by function'); - - test([{a:{b:5}},{a:{b:6}},{a:{b:8}}], ['a.b'], 6, 'deep properties'); - }); - }); namespace('Object', function() { diff --git a/test/tests/array.js b/test/tests/array.js index d8387458f..a0a6d6d69 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -416,8 +416,8 @@ namespace('Array', function() { }); it('should sum with string mapper', function() { - assertEqual(sum([{a:2},{a:5}], 'a'), 7); - assertNaN(sum([{a:2},{a:5}], 'b')); + assertEqual(sum([{age:2},{age:5}], 'age'), 7); + assertNaN(sum([{age:2},{age:5}], 'height')); }); it('should handle deep properties', function() { @@ -459,4 +459,127 @@ namespace('Array', function() { }); + describeInstance('average', function(average) { + + it('should average all elements with no arguments', function() { + assertEqual(average([1,2,3]), 2); + assertEqual(average([0,0,0]), 0); + }); + + it('should average with function mapper', function() { + assertEqual(average([1,2,3,4], (n) => n * 2), 5); + assertEqual(average([1,2,3,4], (n) => n % 2 === 0 ? n : 0), 1.5); + assertEqual(average([1,2,3,4], (n) => n > 5 ? n : 0), 0); + assertEqual(average([1,2,3,4], (n) => n > 2 ? n : 0), 1.75); + }); + + it('should average with string mapper', function() { + assertEqual(average([{age:2},{age:5}], 'age'), 3.5); + assertNaN(average([{age:2},{age:5}], 'height')); + }); + + it('should handle deep properties', function() { + assertEqual(average([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 38 } }, + ], 'profile.likes'), 25); + assertEqual(average([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), 63); + assertEqual(average([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), 63); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + average(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(average([]), 0); + assertEqual(average([null, false]), 0); + assertNaN(average([NaN, NaN])); + assertError(function() { average(); }); + assertError(function() { average(null); }); + assertError(function() { average(1); }); + assertError(function() { average('a'); }); + }); + + }); + + describeInstance('median', function(median) { + + it('should median average all elements with no arguments', function() { + assertEqual(median([1,2,5,6,7]), 5); + assertEqual(median([1,2,5,6,7,8]), 5.5); + assertEqual(median([8,7,6,5,2,1]), 5.5); + assertEqual(median([1,2,80,81,82]), 80); + assertEqual(median([0,0,0]), 0); + }); + + it('should median average with function mapper', function() { + assertEqual(median([1,2,3,4], (n) => n * 2), 5); + assertEqual(median([1,2,3,4], (n) => n % 2 === 0 ? n : 0), 1); + assertEqual(median([1,2,3,4], (n) => n > 5 ? n : 0), 0); + assertEqual(median([1,2,3,4], (n) => n > 2 ? n : 0), 1.5); + }); + + it('should average with string mapper', function() { + assertEqual(median([{age:2},{age:5}], 'age'), 3.5); + assertNaN(median([{age:2},{age:5}], 'height')); + }); + + it('should handle deep properties', function() { + assertEqual(median([ + { profile: { likes: 10 } }, + { profile: { likes: 17 } }, + { profile: { likes: 38 } }, + { profile: { likes: 18 } }, + ], 'profile.likes'), 17.5); + assertEqual(median([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), 80); + assertEqual(median([ + { posts: [{ views: 20 }] }, + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), 50); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + median(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(median([]), 0); + assertEqual(median([null, false]), 0); + assertNaN(median([NaN, NaN])); + assertError(function() { median(); }); + assertError(function() { median(null); }); + assertError(function() { median(1); }); + assertError(function() { median('a'); }); + }); + + }); + }); From 4e961a5d89eecc7140668bfa73cc8e7e7581718a Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 00:06:14 +0900 Subject: [PATCH 068/191] Array#some and Array#none --- src/array/define.js | 2 + src/array/methods.js | 2 + src/array/none.js | 29 +++++++ src/array/some.js | 43 +++++++++++ test/OLD/tests/enumerable.js | 53 ------------- test/tests/array.js | 144 +++++++++++++++++++++++++++++++++++ 6 files changed, 220 insertions(+), 53 deletions(-) create mode 100644 src/array/none.js create mode 100644 src/array/some.js diff --git a/src/array/define.js b/src/array/define.js index 7d51f081b..490b7ed17 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -7,5 +7,7 @@ defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); defineInstance('groupBy', methods.groupBy); defineInstance('median', methods.median); +defineInstance('none', methods.none); defineInstance('remove', methods.remove); +defineInstance('some', methods.some); defineInstance('sum', methods.sum); diff --git a/src/array/methods.js b/src/array/methods.js index 113560161..b6c3d29b9 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -4,5 +4,7 @@ export { default as count } from './count'; export { default as exclude } from './exclude'; export { default as groupBy } from './groupBy'; export { default as median } from './median'; +export { default as none } from './none'; export { default as remove } from './remove'; +export { default as some } from './some'; export { default as sum } from './sum'; diff --git a/src/array/none.js b/src/array/none.js new file mode 100644 index 000000000..b655e5a73 --- /dev/null +++ b/src/array/none.js @@ -0,0 +1,29 @@ +import some from './some'; + +/** + * Returns true if no elements in the array match input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to determine elements that will be + * checked. When a function is passed a truthy return value will match the + * element. Primitives will directly match elements. Can also be a Date object + * to match dates, a RegExp which will test against strings, or a plain object + * which will perform a "fuzzy match" on specific properties. Values of a fuzzy + * match can be any of the matcher types listed above. + * + * @returns {boolean} + * + * @example + * + * ['a','b','c'].none('a') -> false + * ['a','b','c'].none('d') -> true + * ['a','b','c'].none(/n-z/) -> true + * users.none(function(user) { + * return user.age > 30; + * }); -> true if no users are older than 30 + * + **/ +export default function none(...args) { + return !some(...args); +} + diff --git a/src/array/some.js b/src/array/some.js new file mode 100644 index 000000000..dc3753071 --- /dev/null +++ b/src/array/some.js @@ -0,0 +1,43 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + * Returns true if any element in the array matches input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to determine elements that will be + * checked. When a function is passed a truthy return value will match the + * element. Primitives will directly match elements. Can also be a Date object + * to match dates, a RegExp which will test against strings, or a plain object + * which will perform a "fuzzy match" on specific properties. Values of a fuzzy + * match can be any of the matcher types listed above. + * + * @returns {boolean} + * + * @example + * + * ['a','b','c'].some('a') -> true + * ['a','b','c'].some('d') -> false + * ['a','b','c'].some(/a-f/) -> true + * users.some(function(user) { + * return user.age > 30; + * }); -> true if any user is older than 30 + * + **/ +export default function some(arr, match) { + assertArray(arr); + if (arguments.length === 1) { + throw new Error('Match parameter is required'); + } + const matcher = getMatcher(match); + let exists = false; + forEachSparse(arr, (el, i) => { + if (matcher(arr[i], i, arr)) { + exists = true; + } + return !exists; + }); + return exists; +} + diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 0e63d9678..1ba333a74 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -527,59 +527,6 @@ namespace('Array', function() { test(people, [function(person) { return person.age == 13; }], 2, 'JSON objects'); }); - method('none', function() { - - test([1,2,3], [1], false, 'numeric | 1'); - test([1,2,3], [4], true, 'numeric | 4'); - test([1,2,3], ['a'], true, 'numeric | a'); - test(['a','b','c'], ['a'], false, 'alphabet | a'); - test(['a','b','c'], ['f'], true, 'alphabet | f'); - test(['a','b','c'], [/[a-f]/], false, 'alphabet | /[a-f]/'); - test(['a','b','c'], [/[m-z]/], true, 'alphabet | /[m-z]/'); - test([{a:1},{a:2},{a:1}], [1], true, 'objects | 1'); - test([{a:1},{a:2},{a:1}], [{a:1}], false, 'objects | a:1'); - - test(['a','b','c'], [function(e) { return e.length > 1; }], true, 'alphabet | length is greater than 1'); - test(['a','b','c'], [function(e) { return e.length < 2; }], false, 'alphabet | length is less than 2'); - test(['a','bar','cat'], [function(e) { return e.length < 2; }], false, 'a,bar,cat | length is less than 2'); - test([{a:1},{a:2},{a:1}], [function(e) { return e['a'] == 1; }], false, 'objects | key "a" is 1'); - test([{a:1},{a:2},{a:1}], [function(e) { return e['b'] == 1; }], true, 'objects | key "b" is 1'); - - raisesError(function() { run([1,2,3], 'none'); }, 'no argument raises a TypeError'); - - test(threeUndefined, oneUndefined, false, 'undefined should match all undefined'); - test(threeUndefined, [null], true, 'null should not match all undefined'); - test(undefinedWithNull, oneUndefined, false, 'undefined should match one undefined'); - test(undefinedWithNull, [null], false, 'null should match one null'); - test([null, null], [null], false, 'null should match all null'); - test([null, null], oneUndefined, true, 'undefined should not match all null'); - - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' }, - { name: 'buddy', age: 82, hair: { color: 'red', type: 'long', cost: 15, last_cut: new Date(2010, 4, 18) } } - ]; - - test(people, [{ age: 27 }], false, 'complex | one property'); - test(people, [{ age: 27, hair: 'brown' }], false, 'complex | two properties'); - test(people, [{ hair: { color: 'red' }}], false, 'complex | nested property'); - test(people, [{ hair: { color: 'green' }}], true, 'complex | non-matching nested property'); - test(people, [{ hair: { color: 'red', type: 'long' }}], false, 'complex | two nested properties'); - test(people, [{ hair: { color: 'green', type: 'mean' }}], true, 'complex | two non-matching nested properties'); - test(people, [{ hair: { color: 'red', type: 'mean' }}], true, 'complex | two nested properties, one non-matching'); - test(people, [{ hair: { color: 'red', life: 'long' }}], true, 'complex | two nested properties, one non-existing'); - test(people, [{ hair: { color: /r/ }}], false, 'complex | nested regex'); - test(people, [{ hair: { cost: 15 }}], false, 'complex | nested number'); - test(people, [{ hair: { cost: 23 }}], true, 'complex | nested non-matching number'); - test(people, [{ hair: { cost: undefined }}], true, 'complex | nested undefined property'); - test(people, [{ hair: { cost: NaN }}], true, 'complex | nested property is NaN'); - test(people, [{ hair: { color: function(c){ return c == 'red'; } }}], false, 'complex | nested function'); - test(people, [{ none: { random: { shit: {}}}}], true, 'complex | totally unrelated properties'); - test(people, [{ hair: { last_cut: new Date(2010, 4, 18) }}], false, 'complex | simple date'); - - }); group('Fuzzy Matching', function() { var arr = [{name: 'joe', age: 25}]; diff --git a/test/tests/array.js b/test/tests/array.js index a0a6d6d69..5b56681b3 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -333,6 +333,150 @@ namespace('Array', function() { }); + describeInstance('some', function(some) { + + it('should match by primitive matchers', function() { + assertEqual(some(['a','b','c'], 'a'), true); + assertEqual(some(['a','b','c'], 'd'), false); + assertEqual(some([3,1,2,3], 7), false); + assertEqual(some([true, true, false, true], true), true); + assertEqual(some([false, false, false], true), false); + }); + + it('should match by regex', function() { + assertEqual(some(['a','b','c'], /[ac]/), true); + assertEqual(some(['a','b','c'], /[AC]/), false); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(some([d1, d2], new Date(2020, 7, 28)), true); + assertEqual(some([d1, d2], new Date(2020, 7, 30)), false); + }); + + it('should match by function', function() { + assertEqual(some([1,2,3,4], (n) => n % 2 === 0), true); + assertEqual(some([2,4,6,8], (n) => n % 2 === 1), false); + assertEqual(some([1,2,3,4], (n) => n > 5), false); + assertEqual(some([1,2,3,4], (n) => n > 2), true); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(some([fn1, fn2], fn2), true); + assertEqual(some([fn1], fn2), false); + }); + + it('should match by fuzzy matching', function() { + assertEqual(some([{a:1,b:1},{a:2,b:2}], {a:1}), true); + assertEqual(some([{a:1,b:1},{a:2,b:2}], {a:5}), false); + assertEqual(some([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), true); + assertEqual(some([{name:'Frank'},{name:'James'}], {name: /^[N-Z]/}), false); + }); + + it('should pass correct params to callback', function() { + some(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should not iterate over all members of sparse arrays', function() { + var n = 0; + var arr = ['a']; + arr[8000] = 'b'; + some(arr, function () { + n++; + }); + assertEqual(n, 2); + }); + + it('should handle irregular input', function() { + assertEqual(some([1,2,2,3], null), false); + assertEqual(some([1,2,2,3], NaN), false); + assertError(function() { some([1]); }); + assertError(function() { some(null); }); + assertError(function() { some('a'); }); + assertError(function() { some(1); }); + }); + + }); + + describeInstance('none', function(none) { + + it('should match by primitive matchers', function() { + assertEqual(none(['a','b','c'], 'a'), false); + assertEqual(none(['a','b','c'], 'd'), true); + assertEqual(none([3,1,2,3], 7), true); + assertEqual(none([true, true, false, true], true), false); + assertEqual(none([false, false, false], true), true); + }); + + it('should match by regex', function() { + assertEqual(none(['a','b','c'], /[ac]/), false); + assertEqual(none(['a','b','c'], /[AC]/), true); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(none([d1, d2], new Date(2020, 7, 28)), false); + assertEqual(none([d1, d2], new Date(2020, 7, 30)), true); + }); + + it('should match by function', function() { + assertEqual(none([1,2,3,4], (n) => n % 2 === 0), false); + assertEqual(none([2,4,6,8], (n) => n % 2 === 1), true); + assertEqual(none([1,2,3,4], (n) => n > 5), true); + assertEqual(none([1,2,3,4], (n) => n > 2), false); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(none([fn1, fn2], fn2), false); + assertEqual(none([fn1], fn2), true); + }); + + it('should match by fuzzy matching', function() { + assertEqual(none([{a:1,b:1},{a:2,b:2}], {a:1}), false); + assertEqual(none([{a:1,b:1},{a:2,b:2}], {a:7}), true); + assertEqual(none([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), false); + assertEqual(none([{name:'Frank'},{name:'James'}], {name: /^[N-Z]/}), true); + }); + + it('should pass correct params to callback', function() { + none(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should not iterate over all members of sparse arrays', function() { + var n = 0; + var arr = ['a']; + arr[8000] = 'b'; + none(arr, function () { + n++; + }); + assertEqual(n, 2); + }); + + it('should handle irregular input', function() { + assertEqual(none([1,2,2,3], null), true); + assertEqual(none([1,2,2,3], NaN), true); + assertError(function() { none([1]); }); + assertError(function() { none(null); }); + assertError(function() { none('a'); }); + assertError(function() { none(1); }); + }); + + }); + describeInstance('count', function(count) { it('should count all elements with no arguments', function() { From 7d2d1860b15850165d35ebbe9f539349c7326e8d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 00:15:01 +0900 Subject: [PATCH 069/191] added Array#every --- src/array/define.js | 1 + src/array/every.js | 43 +++++++++++++ src/array/methods.js | 1 + test/OLD/tests/enumerable.js | 116 ----------------------------------- test/tests/array.js | 74 ++++++++++++++++++++++ 5 files changed, 119 insertions(+), 116 deletions(-) create mode 100644 src/array/every.js diff --git a/src/array/define.js b/src/array/define.js index 490b7ed17..7e5c8b8fc 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -5,6 +5,7 @@ defineInstance('at', methods.at); defineInstance('average', methods.average); defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); +defineInstance('every', methods.every); defineInstance('groupBy', methods.groupBy); defineInstance('median', methods.median); defineInstance('none', methods.none); diff --git a/src/array/every.js b/src/array/every.js new file mode 100644 index 000000000..1438b96a6 --- /dev/null +++ b/src/array/every.js @@ -0,0 +1,43 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + * Returns true if every element in the array matches input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to determine elements that will be + * checked. When a function is passed a truthy return value will match the + * element. Primitives will directly match elements. Can also be a Date object + * to match dates, a RegExp which will test against strings, or a plain object + * which will perform a "fuzzy match" on specific properties. Values of a fuzzy + * match can be any of the matcher types listed above. + * + * @returns {boolean} + * + * @example + * + * ['a','b','c'].every('a') -> false + * ['a','a','a'].every('a') -> true + * ['a','b','c'].every(/a-f/) -> true + * users.every(function(user) { + * return user.age > 30; + * }); -> true if every user is older than 30 + * + **/ +export default function every(arr, match) { + assertArray(arr); + if (arguments.length === 1) { + throw new Error('Match parameter is required'); + } + const matcher = getMatcher(match); + let result = true; + forEachSparse(arr, (el, i) => { + if (!matcher(arr[i], i, arr)) { + result = false; + } + return result; + }); + return result; +} + diff --git a/src/array/methods.js b/src/array/methods.js index b6c3d29b9..a67c1fe1a 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1,6 +1,7 @@ export { default as at } from './at'; export { default as average } from './average'; export { default as count } from './count'; +export { default as every } from './every'; export { default as exclude } from './exclude'; export { default as groupBy } from './groupBy'; export { default as median } from './median'; diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 1ba333a74..d2d7fc8f9 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -168,122 +168,6 @@ namespace('Array', function() { }); - method('every', function() { - var fn, arr; - - raisesError(function() { run([1,2,3], 'every', []); }, 'should error with no args'); - - test([1,1,1], [1], true, 'numeric | 1 matches'); - test([1,1,2], [1], false, 'numeric | 1 does not match'); - test([1,2,3], [3], false, 'numeric | 3 does not match'); - test(['a','a','a'], ['a'], true, 'accepts a string shortcut match'); - test(['a','b','a'], ['a'], false, 'accepts a string shortcut no match'); - test(['a','b','c'], [/[a-f]/], true, 'accepts a regex shortcut match'); - test(['a','b','c'], [/[m-z]/], false, 'accepts a regex shortcut no match'); - test([{a:1},{a:1}], [{a:1}], true, 'checks objects match'); - test([{a:1},{a:2}], [{a:1}], false, 'checks object no match'); - test(['a','b','c'], [function(e) { return e.length > 1; }], false, 'alphabet | length is greater than 1'); - test(['a','b','c'], [function(e) { return e.length < 2; }], true, 'alphabet | length is less than 2'); - test(['a','bar','cat'], [function(e) { return e.length < 2; }], false, 'a,bar,cat | length is less than 2'); - test([{a:1},{a:2},{a:1}], [function(e) { return e['a'] == 1; }], false, 'objects | key "a" is 1'); - test([{a:1},{a:2},{a:1}], [function(e) { return e['b'] == 1; }], false, 'objects | key "b" is 1'); - test([{a:1},{a:1},{a:1}], [function(e) { return e['a'] == 1; }], true, 'objects | key "a" is 1 for all'); - - fn = function(el) { - return el >= 10; - } - - test([12,5,8,130,44], [fn], false, 'not every element is greater than 10'); - test([12,54,18,130,44], [fn], true, 'every element is greater than 10'); - - test(threeUndefined, [undefined], true, 'all undefined'); - test(['a', 'b'], [undefined], false, 'none undefined'); - - arr = testClone(threeUndefined); - arr.push('a'); - - test(arr, [oneUndefined], false, 'every undefined'); - - fn = function(el, i, a) { - equal(el, 'a', 'First parameter is the element'); - equal(i, 0, 'Second parameter is the index'); - equal(a, ['a'], 'Third parameter is the array'); - equal(this.toString(), 'this', 'Scope is passed properly'); - } - run(['a'], 'every', [fn, 'this']); - - test([{name:'john',age:25}], [{name:'john',age:25}], true, 'handles complex objects'); - test([{name:'john',age:25},{name:'fred',age:85}], ['age'], false, 'simple string mistakenly passed for complex objects'); - test([{name:'john',age:25},{name:'fred',age:85}], [{name:'john',age:25}], false, "john isn't all"); - }); - - method('some', function() { - var arr, fn; - - test([1,2,3], [1], true, 'accepts a number shortcut match'); - test([2,3,4], [1], false, 'accepts a number shortcut no match'); - test(['a','b','c'], ['a'], true, 'accepts a string shortcut match'); - test(['b','c','d'], ['a'], false, 'accepts a string shortcut no match'); - test(['a','b','c'], [/[a-f]/], true, 'accepts a regex shortcut match'); - test(['a','b','c'], [/[m-z]/], false, 'accepts a regex shortcut no match'); - test([{a:1},{a:2}], [{a:1}], true, 'checks objects match'); - test([{a:2},{a:3}], [{a:1}], false, 'checks object no match'); - test([0], [0], true, '[0] | 0'); - - test([12,5,8,130,44], [function(el, i, a) { return el > 10 }], true, 'some elements are greater than 10'); - test([12,5,8,130,44], [function(el, i, a) { return el < 10 }], true, 'some elements are less than 10'); - test([12,54,18,130,44], [function(el, i, a) { return el >= 10 }], true, 'all elements are greater than 10'); - test([12,5,8,130,44], [function(el, i, a) { return el < 4 }], false, 'no elements are less than 4'); - test([], [function(el, i, a) { return el > 10 }], false, 'no elements are greater than 10 in an empty array'); - - test(threeUndefined, oneUndefined, true, 'all undefined'); - test(['a', 'b'], oneUndefined, false, 'none undefined'); - - arr = testClone(threeUndefined); - arr.push('a'); - - test(arr, oneUndefined, true, 'some undefined'); - - fn = function(el, i, a) { - equal(el, 'a', 'first parameter is the element'); - equal(i, 0, 'second parameter is the index'); - equal(a, ['a'], 'third parameter is the array'); - equal(this.toString(), 'this', 'scope is passed properly'); - } - - run(['a'], 'some', [fn, 'this']); - - test([{name:'john',age:25}], [{name:'john',age:25}], true, 'handles complex objects'); - test([{name:'john',age:25},{name:'fred',age:85}], ['age'], false, 'simple string mistakenly passed for complex objects'); - test([{name:'john',age:25},{name:'fred',age:85}], [{name:'john',age:25}], true, 'john can be found '); - - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' }, - { name: 'buddy', age: 82, hair: { color: 'red', type: 'long', cost: 15, last_cut: new Date(2010, 4, 18) } } - ]; - - test(people, [{ age: 27 }], true, 'complex | one property'); - test(people, [{ age: 27, hair: 'brown' }], true, 'complex | two properties'); - test(people, [{ hair: { color: 'red' }}], true, 'complex | nested property'); - test(people, [{ hair: { color: 'green' }}], false, 'complex | non-matching nested property'); - test(people, [{ hair: { color: 'red', type: 'long' }}], true, 'complex | two nested properties'); - test(people, [{ hair: { color: 'green', type: 'mean' }}], false, 'complex | two non-matching nested properties'); - test(people, [{ hair: { color: 'red', type: 'mean' }}], false, 'complex | two nested properties, one non-matching'); - test(people, [{ hair: { color: 'red', life: 'long' }}], false, 'complex | two nested properties, one non-existing'); - test(people, [{ hair: { color: /r/ }}], true, 'complex | nested regex'); - test(people, [{ hair: { cost: 15 }}], true, 'complex | nested number'); - test(people, [{ hair: { cost: 23 }}], false, 'complex | nested non-matching number'); - test(people, [{ hair: { cost: undefined }}], false, 'complex | nested undefined property'); - test(people, [{ hair: { cost: NaN }}], false, 'complex | nested property is NaN'); - test(people, [{ hair: { color: function(c){ return c == 'red'; } }}], true, 'complex | nested function'); - test(people, [{ some: { random: { shit: {}}}}], false, 'complex | totally unrelated properties'); - test(people, [{ hair: { last_cut: new Date(2010, 4, 18) }}], true, 'complex | simple date'); - - }); - method('filter', function() { var fn; diff --git a/test/tests/array.js b/test/tests/array.js index 5b56681b3..91162954d 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -477,6 +477,80 @@ namespace('Array', function() { }); + describeInstance('every', function(every) { + + it('should match by primitive matchers', function() { + assertEqual(every(['a','b','c'], 'a'), false); + assertEqual(every(['a','a','a'], 'a'), true); + assertEqual(every([1,1,1], 2), false); + assertEqual(every([1,1,1], 1), true); + assertEqual(every([false, false, true], false), false); + assertEqual(every([false, false, false], false), true); + }); + + it('should match by regex', function() { + assertEqual(every(['a','b','c'], /[ac]/), false); + assertEqual(every(['a','b','c'], /[a-c]/), true); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(every([d1, d2], new Date(2020, 7, 28)), false); + assertEqual(every([d1, d1], new Date(2020, 7, 28)), true); + }); + + it('should match by function', function() { + assertEqual(every([1,2,3,4], (n) => n % 2 === 0), false); + assertEqual(every([2,4,6,8], (n) => n % 2 === 0), true); + assertEqual(every([1,2,3,4], (n) => n > 5), false); + assertEqual(every([1,2,3,4], (n) => n > 0), true); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(every([fn1, fn2], fn2), false); + assertEqual(every([fn2, fn2], fn2), true); + }); + + it('should match by fuzzy matching', function() { + assertEqual(every([{a:1,b:1},{a:2,b:2}], {a:1}), false); + assertEqual(every([{a:1,b:1},{a:1,b:2}], {a:1}), true); + assertEqual(every([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), false); + assertEqual(every([{name:'Frank'},{name:'James'}], {name: /^[A-J]/}), true); + }); + + it('should pass correct params to callback', function() { + every(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should not iterate over all members of sparse arrays', function() { + var n = 0; + var arr = ['a']; + arr[8000] = 'b'; + every(arr, function () { + n++; + return true; + }); + assertEqual(n, 2); + }); + + it('should handle irregular input', function() { + assertEqual(every([1,2,2,3], null), false); + assertEqual(every([1,2,2,3], NaN), false); + assertError(function() { every([1]); }); + assertError(function() { every(null); }); + assertError(function() { every('a'); }); + assertError(function() { every(1); }); + }); + + }); + describeInstance('count', function(count) { it('should count all elements with no arguments', function() { From 5345ffbbd756f052c80eac6b52c5a33fe7d34735 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 14:59:22 +0900 Subject: [PATCH 070/191] Added Array#map --- src/array/define.js | 1 + src/array/map.js | 37 ++++++++ src/array/methods.js | 1 + src/util/mappers.js | 17 +++- test/OLD/tests/enumerable.js | 167 ----------------------------------- test/tests/array.js | 99 +++++++++++++++++++++ 6 files changed, 153 insertions(+), 169 deletions(-) create mode 100644 src/array/map.js diff --git a/src/array/define.js b/src/array/define.js index 7e5c8b8fc..0531aa119 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -7,6 +7,7 @@ defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); defineInstance('every', methods.every); defineInstance('groupBy', methods.groupBy); +defineInstance('map', methods.map); defineInstance('median', methods.median); defineInstance('none', methods.none); defineInstance('remove', methods.remove); diff --git a/src/array/map.js b/src/array/map.js new file mode 100644 index 000000000..b50f39965 --- /dev/null +++ b/src/array/map.js @@ -0,0 +1,37 @@ +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; + +/** + * Creates a new array whose values of are the result of a mapper function or + * shortcut. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - Determines the values to be mapped. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. + * + * @returns {Array} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].map(n => n * 2) -> [2,4,6] + * ['a','aa','aaa'].map('length') -> [1,2,3] + * users.map('age') -> an array containing user ages + * users.map('profile.likes') -> an array containing profile like counts + * + **/ +export default function map(arr, map, context) { + assertArray(arr); + if (arguments.length === 1) { + throw new Error('Map parameter is required'); + } + return arr.map(getMapper(map), context); +} + diff --git a/src/array/methods.js b/src/array/methods.js index a67c1fe1a..bdd419bf1 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -4,6 +4,7 @@ export { default as count } from './count'; export { default as every } from './every'; export { default as exclude } from './exclude'; export { default as groupBy } from './groupBy'; +export { default as map } from './map'; export { default as median } from './median'; export { default as none } from './none'; export { default as remove } from './remove'; diff --git a/src/util/mappers.js b/src/util/mappers.js index 84dcd692e..7b70e0eb8 100644 --- a/src/util/mappers.js +++ b/src/util/mappers.js @@ -1,15 +1,28 @@ -import { isFunction, isString } from './typeChecks'; +import { isFunction, isArray } from './typeChecks'; import { deepGetProperty } from './deepProperties'; export function getMapper(obj) { if (isFunction(obj)) { return obj; - } else if (isString(obj)) { + } else if (isArray(obj)) { + return getArrayMapper(obj); + } else if (obj) { return getPropertyMapper(obj); } return defaultMapper; } +function getArrayMapper(obj) { + const mappers = obj.map((el) => { + return getMapper(el); + }); + return (el) => { + return mappers.map((mapper) => { + return mapper(el); + }); + }; +} + function getPropertyMapper(str) { return (el) => { return deepGetProperty(el, str); diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index d2d7fc8f9..76d9d31ef 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1,173 +1,6 @@ namespace('Array', function() { 'use strict'; - method('map', function() { - - var fn; - test([1,4,9], [Math.sqrt], [1,2,3], 'passing Math.sqrt directly'); - test([{ foo: 'bar' }], [function(el) { return el['foo']; }], ['bar'], 'with key "foo"'); - - fn = function(el, i, a) { - equal(el, 'a', 'first parameter is the element'); - equal(i, 0, 'second parameter is the index'); - equal(a, ['a'], 'third parameter is the array'); - equal(this.toString(), 'this', 'scope is passed properly'); - }; - run(['a'], 'map', [fn, 'this']); - - - test(['foot','goose','moose'], [function(el) { return el.replace(/o/g, 'e'); }], ['feet', 'geese', 'meese'], 'with regexp'); - test(['foot','goose','moose'], ['length'], [4,5,5], 'length'); - test([{name:'john',age:25},{name:'fred',age:85}], ['age'], [25,85], 'age'); - test([{name:'john',age:25},{name:'fred',age:85}], ['name'], ['john','fred'], 'name'); - test([{name:'john',age:25},{name:'fred',age:85}], ['cupsize'], twoUndefined, '(nonexistent) cupsize'); - test([], ['name'], [], 'empty array'); - - - // Nested properties with dot syntax - - test([{name:{first:'John',last:'Waters'}},{name:{first:'Fred',last:'Flintstone'}}], ['name.first'], ['John', 'Fred'], 'deep matching with dot'); - test([{a:{b:{c:'x'}}},{a:{b:{c:'y'}}},{a:{b:{c:'z'}}}], ['a.b.c'], ['x','y','z'], 'deeper matching with dot'); - test([{a:[1]},{a:[2]}], ['a.0'], [1,2], 'matching nested array indexes'); - test([{a:[1]},{b:[2]}], ['a.0'], safeArray(1, undefined), 'matching nested array index non-existent'); - test([{a:'a'},{b:'a'}], ['.'], twoUndefined, 'single dot'); - test([{a:'a'},{b:'a'}], ['..'], twoUndefined, 'double dot'); - test([[[1,2]],[[1,2]]], ['0.1'], [2,2], 'deep arrays'); - test([{name:{first:'Joe',last:'P'}},{name:{first:'John',last:'Q'}}], [['name.first', 'name.last']], [['Joe','P'], ['John', 'Q']], 'array with dots'); - - test([1,2,3], ['toString'], ['1','2','3'], 'calls a function on a shortcut string'); - - raisesError(function(){ run([1,2,3], 'map') }, 'no argument raises a type error'); - raisesError(function(){ run([1,2,3], 'map', oneUndefined) }, 'undefined raises a type error'); - raisesError(function(){ run([1,2,3], 'map', [null]) }, 'null raises a type error'); - - test([1,2,3], [4], threeUndefined, 'number'); - - - // Nested properties with dot and bracket syntax - - var accounts = [ - { - profile: { - addresses: [{ - street: '1600 Pennsylvania Ave', - city: 'Washington DC' - }, { - street: '221B Baker St', - city: 'London' - }, { - street: '350 5th Ave', - city: 'New York' - }] - } - }, - { - profile: { - addresses: [{ - street: '31 Spooner St.', - city: 'Quahog' - }, { - street: '742 Evergreen Terrace', - city: 'Springfield' - }, { - street: '342 Gravelpit Terrace', - city: 'Bedrock' - }] - } - } - ]; - - test(accounts, ['profile.addresses[0]'], [accounts[0].profile.addresses[0], accounts[1].profile.addresses[0]], 'deep with bracket'); - test(accounts, ['profile.addresses[0].city'], ['Washington DC', 'Quahog'], 'deep with bracket and trailing dot'); - test(accounts, ['profile.addresses[1]'], [accounts[0].profile.addresses[1], accounts[1].profile.addresses[1]], 'deep with bracket | 1'); - test(accounts, ['profile.addresses[1].city'], ['London', 'Springfield'], 'deep with bracket and trailing dot | 1'); - test(accounts, ['profile.addresses[-1]'], [accounts[0].profile.addresses[2], accounts[1].profile.addresses[2]], 'deep with bracket | -1'); - test(accounts, ['profile.addresses[-1].city'], ['New York', 'Bedrock'], 'deep with bracket and trailing dot | -1'); - - - // Bracket range syntax - - var a1 = accounts[0].profile.addresses.slice(0, 2); - var a2 = accounts[1].profile.addresses.slice(0, 2); - test(accounts, ['profile.addresses[0..1]'], [a1, a2], 'allows range syntax'); - test(accounts, ['profile.addresses[0..1].city'], [['Washington DC', 'London'], ['Quahog', 'Springfield']], 'allows range syntax with trailing dot'); - - raisesError(function() { run([{foo:'bar'}], 'map', 'foo[0..1]'); }, 'Range syntax on an object should raise an error', TypeError); - - // Issue #386 - - var arr = [ - { - name: 'john', - age: 25 - }, - { - name: 'fred', - age: 85 - } - ]; - test(arr, [['name', 'age']], [['john', 25], ['fred', 85]], 'mapping on both name and age'); - test(arr, [['name', 'hair']], [safeArray('john', undefined), safeArray('fred', undefined)], 'mapping on name and non-existent property'); - test(arr, [['hair', 'age']], [safeArray(undefined, 25), safeArray(undefined, 85)], 'mapping on non-existent property and name'); - test(arr, [['hair', 'eyes']], [twoUndefined, twoUndefined], 'mapping on two non-existent properties'); - - var arr = [ - { - age: 25, - size: 3 - }, - { - age: 85, - size: 7 - } - ]; - var count1 = 0; - var count2 = 0; - var fn1 = function(obj, i, a) { - equal(this.valueOf(), 0, 'context should still be passable'); - equal(obj, arr[i], 'first argument should be the element'); - equal(i, count1, 'second argument should be the index'); - equal(a, arr, 'third argument should be the array'); - count1++; - return obj.age + 5; - } - var fn2 = function(obj) { - count2++; - return obj.size - 3; - } - var expected = [ - [30, 0], - [90, 4] - ] - var result = run(arr, 'map', [[fn1, fn2], 0]); - - equal(result, expected, 'should be able to use two mapping functions'); - equal(count1, 2, 'first mapping function should have run twice'); - equal(count2, 2, 'second mapping function should have run twice'); - - // Testing the context - - var resultContext = null; - var fn = function() { - resultContext = this; - } - run(['x'], 'map', [fn]); - equal(resultContext, testNullScope, 'Context should be passable with explicit mapping fn'); - - var resultContext = null; - var fakeContext = {}; - var fn = function() { - resultContext = this; - } - run(['x'], 'map', [fn, fakeContext]); - equal(resultContext, fakeContext, 'Context should be passable with explicit mapping fn'); - - // Issue #525 - var result = [{foo:'foo'},{bar:'bar'}].map(Object.keys); - equal(result, [['foo'],['bar']], 'non-function argument should not be called'); - - }); - method('filter', function() { var fn; diff --git a/test/tests/array.js b/test/tests/array.js index 91162954d..4fa920e58 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -333,6 +333,105 @@ namespace('Array', function() { }); + describeInstance('map', function(map) { + + it('should map with function mapper', function() { + assertArrayEqual(map([1,2,3,4], (n) => n * 2), [2,4,6,8]); + assertArrayEqual(map([1,2,3,4], (n) => n % 2 === 0 ? n : 0), [0,2,0,4]); + assertArrayEqual(map([1,2,3,4], (n) => n > 5 ? n : 0), [0,0,0,0]); + assertArrayEqual(map([1,2,3,4], (n) => n > 2 ? n : 0), [0,0,3,4]); + }); + + it('should map with string mapper', function() { + assertArrayEqual(map([{age:2},{age:5}], 'age'), [2,5]); + assertArrayEqual(map([{age:2},{age:5}], 'height'), [undefined, undefined]); + }); + + it('should handle deep properties', function() { + assertArrayEqual(map([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), [20,17,36]); + assertArrayEqual(map([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), [80,97,12]); + assertArrayEqual(map([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[-1].views'), [80,97,12]); + assertArrayEqual(map([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), [80,97,12]); + }); + + it('should be able multiple properties with an array', function() { + // Issue #386 + assertArrayEqual(map([ + { name: 'John', age: 25 }, + { name: 'Fred', age: 85 }, + { name: 'Kirk', age: 17 }, + ], ['name', 'age']), [['John',25],['Fred',85],['Kirk',17]]); + }); + + it('should be able to map with array range syntax', function() { + assertArrayEqual(map([ + { posts: [{ views: 80 }, { views: 40 }, { views: 20 }] }, + { posts: [{ views: 97 }, { views: 13 }, { views: 52 }] }, + { posts: [{ views: 11 }, { views: 45 }, { views: 81 }] }, + ], 'posts[1..2].views'), [[40,20],[13,52],[45,81]]); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + map(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should be able to use built-in properties', function() { + assertArrayEqual(map(['a','aa','aaa'], 'length'), [1,2,3]); + }); + + it('should be able to use built-in functions', function() { + assertArrayEqual(map([1,4,9], Math.sqrt), [1,2,3]); + }); + + it('should handle issue #525', function() { + assertArrayEqual( + map([{foo:'foo'},{bar:'bar'}], Object.keys), + [['foo'],['bar']] + ); + }); + + it('should be able to pass context', function() { + map([1], function (el) { + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should handle irregular input', function() { + assertArrayEqual(map([1,2,3], null), [1,2,3]); + assertArrayEqual(map([1,2], '.'), [undefined, undefined]); + assertArrayEqual(map([1,2], '..'), [undefined, undefined]); + assertArrayEqual(map([1,2], 4), [undefined, undefined]); + assertError(function() { map(); }); + assertError(function() { map([]); }); + assertError(function() { map(null); }); + assertError(function() { map(1); }); + assertError(function() { map('a'); }); + }); + + }); + describeInstance('some', function(some) { it('should match by primitive matchers', function() { From ad83aa17d815f32edc9306c7c830db1b1ed71d59 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 15:37:11 +0900 Subject: [PATCH 071/191] removing forEachSparse references in favor of native methods --- src/array/average.js | 11 ++++++----- src/array/count.js | 11 ++++++----- src/array/every.js | 15 ++++----------- src/array/exclude.js | 14 ++++++-------- src/array/map.js | 4 +++- src/array/median.js | 11 ++++++----- src/array/remove.js | 11 ++++++----- src/array/some.js | 17 ++++++----------- src/array/sum.js | 11 ++++++----- src/util/array.js | 2 ++ src/util/mappers.js | 4 ++-- src/util/matchers.js | 8 ++++---- test/tests/array.js | 36 +++++++++++++++++++++++++++--------- 13 files changed, 84 insertions(+), 71 deletions(-) diff --git a/src/array/average.js b/src/array/average.js index a8191f1d9..af1ce2f76 100644 --- a/src/array/average.js +++ b/src/array/average.js @@ -1,5 +1,4 @@ import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; import { getMapper } from '../util/mappers'; /** @@ -9,6 +8,8 @@ import { getMapper } from '../util/mappers'; * @param {string|mapFn} [map] - When passed, determines the values to average. * A function may be passed here similar to `Array#map` or a string acting as a * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. * * @returns {number} * @@ -26,15 +27,15 @@ import { getMapper } from '../util/mappers'; * users.average('profile.likes') -> // average profile likes * **/ -export default function average(arr, map) { +export default function average(arr, map, context) { assertArray(arr); if (arr.length === 0) { return 0; } let sum = 0; - const mapper = getMapper(map); - forEachSparse(arr, (el, i) => { - sum += mapper(arr[i], i, arr); + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + sum += mapper(el, i, arr); }); return sum / arr.length; } diff --git a/src/array/count.js b/src/array/count.js index d370c32cf..6c07b71c3 100644 --- a/src/array/count.js +++ b/src/array/count.js @@ -1,6 +1,5 @@ import { getMatcher } from '../util/matchers'; import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; /** * Counts elements in the array. @@ -12,6 +11,8 @@ import { forEachSparse } from '../util/array'; * to match dates, a RegExp which will test against strings, or a plain object * which will perform a "fuzzy match" on specific properties. Values of a fuzzy * match can be any of the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. * * @returns {number} * @@ -24,15 +25,15 @@ import { forEachSparse } from '../util/array'; * }); -> number of users older than 30 * **/ -export default function count(arr, match) { +export default function count(arr, match, context) { assertArray(arr); if (arguments.length === 1) { return arr.length; } let count = 0; - const matcher = getMatcher(match); - forEachSparse(arr, (el, i) => { - if (matcher(arr[i], i, arr)) { + const matcher = getMatcher(match, context); + arr.forEach((el, i) => { + if (matcher(el, i, arr)) { count += 1; } }); diff --git a/src/array/every.js b/src/array/every.js index 1438b96a6..177760451 100644 --- a/src/array/every.js +++ b/src/array/every.js @@ -1,6 +1,7 @@ import { getMatcher } from '../util/matchers'; import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; + +const nativeFn = Array.prototype.every; /** * Returns true if every element in the array matches input. @@ -25,19 +26,11 @@ import { forEachSparse } from '../util/array'; * }); -> true if every user is older than 30 * **/ -export default function every(arr, match) { +export default function every(arr, match, context) { assertArray(arr); if (arguments.length === 1) { throw new Error('Match parameter is required'); } - const matcher = getMatcher(match); - let result = true; - forEachSparse(arr, (el, i) => { - if (!matcher(arr[i], i, arr)) { - result = false; - } - return result; - }); - return result; + return nativeFn.call(arr, getMatcher(match, context)); } diff --git a/src/array/exclude.js b/src/array/exclude.js index ce77ac852..769b583dd 100644 --- a/src/array/exclude.js +++ b/src/array/exclude.js @@ -1,6 +1,5 @@ import { getMatcher } from '../util/matchers'; import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; /** * Returns a new array with elements removed. @@ -16,6 +15,8 @@ import { forEachSparse } from '../util/array'; * RegExp which will test against strings, or a plain object which will perform * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of * the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. * * @returns {Array} * @@ -34,14 +35,11 @@ import { forEachSparse } from '../util/array'; * }); -> [{b:2}] * **/ -export default function exclude(arr, match) { +export default function exclude(arr, match, context) { assertArray(arr); const result = []; - const matcher = getMatcher(match); - forEachSparse(arr, (el, i) => { - if (!matcher(arr[i], i, arr)) { - result.push(arr[i]); - } + const matcher = getMatcher(match, context); + return arr.filter((el, i) => { + return !matcher(el, i, arr); }); - return result; } diff --git a/src/array/map.js b/src/array/map.js index b50f39965..adde8cd38 100644 --- a/src/array/map.js +++ b/src/array/map.js @@ -1,6 +1,8 @@ import { assertArray } from '../util/assertions'; import { getMapper } from '../util/mappers'; +const nativeFn = Array.prototype.map; + /** * Creates a new array whose values of are the result of a mapper function or * shortcut. @@ -32,6 +34,6 @@ export default function map(arr, map, context) { if (arguments.length === 1) { throw new Error('Map parameter is required'); } - return arr.map(getMapper(map), context); + return nativeFn.call(arr, getMapper(map, context)); } diff --git a/src/array/median.js b/src/array/median.js index fba031e45..a6a773e63 100644 --- a/src/array/median.js +++ b/src/array/median.js @@ -1,5 +1,4 @@ import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; import { getMapper } from '../util/mappers'; /** @@ -9,6 +8,8 @@ import { getMapper } from '../util/mappers'; * @param {string|mapFn} [map] - When passed, determines the values to average. * A function may be passed here similar to `Array#map` or a string acting as a * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. * * @returns {number} * @@ -26,16 +27,16 @@ import { getMapper } from '../util/mappers'; * users.median('profile.likes') -> // median profile likes * **/ -export default function median(arr, map) { +export default function median(arr, map, context) { assertArray(arr); const len = arr.length; if (len === 0) { return 0; } const values = []; - const mapper = getMapper(map); - forEachSparse(arr, (el, i) => { - values.push(mapper(arr[i], i, arr)); + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + values.push(mapper(el, i, arr)); }); values.sort((a, b) => { return a - b; diff --git a/src/array/remove.js b/src/array/remove.js index 21fe7e2cd..183e628f9 100644 --- a/src/array/remove.js +++ b/src/array/remove.js @@ -1,6 +1,5 @@ import { getMatcher } from '../util/matchers'; import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; /** * Removes an element from the array. @@ -15,6 +14,8 @@ import { forEachSparse } from '../util/array'; * RegExp which will test against strings, or a plain object which will perform * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of * the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. * * @returns {Array} * @@ -33,12 +34,12 @@ import { forEachSparse } from '../util/array'; * }); -> [{b:2}] * **/ -export default function remove(arr, match) { +export default function remove(arr, match, context) { assertArray(arr); - const matcher = getMatcher(match); + const matcher = getMatcher(match, context); const indexes = []; - forEachSparse(arr, (el, i) => { - if (matcher(arr[i], i, arr)) { + arr.forEach((el, i) => { + if (matcher(el, i, arr)) { indexes.push(i); } }); diff --git a/src/array/some.js b/src/array/some.js index dc3753071..7f0b5fabf 100644 --- a/src/array/some.js +++ b/src/array/some.js @@ -1,6 +1,7 @@ import { getMatcher } from '../util/matchers'; import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; + +const nativeFn = Array.prototype.some; /** * Returns true if any element in the array matches input. @@ -12,6 +13,8 @@ import { forEachSparse } from '../util/array'; * to match dates, a RegExp which will test against strings, or a plain object * which will perform a "fuzzy match" on specific properties. Values of a fuzzy * match can be any of the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. * * @returns {boolean} * @@ -25,19 +28,11 @@ import { forEachSparse } from '../util/array'; * }); -> true if any user is older than 30 * **/ -export default function some(arr, match) { +export default function some(arr, match, context) { assertArray(arr); if (arguments.length === 1) { throw new Error('Match parameter is required'); } - const matcher = getMatcher(match); - let exists = false; - forEachSparse(arr, (el, i) => { - if (matcher(arr[i], i, arr)) { - exists = true; - } - return !exists; - }); - return exists; + return nativeFn.call(arr, getMatcher(match, context)); } diff --git a/src/array/sum.js b/src/array/sum.js index cf6825bd0..45103e6b2 100644 --- a/src/array/sum.js +++ b/src/array/sum.js @@ -1,5 +1,4 @@ import { assertArray } from '../util/assertions'; -import { forEachSparse } from '../util/array'; import { getMapper } from '../util/mappers'; /** @@ -9,6 +8,8 @@ import { getMapper } from '../util/mappers'; * @param {string|mapFn} [map] - When passed, determines the values to sum. A * function may be passed here similar to `Array#map` or a string acting as a * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. * * @returns {number} * @@ -26,12 +27,12 @@ import { getMapper } from '../util/mappers'; * users.sum('profile.likes') -> // total profile likes * **/ -export default function sum(arr, map) { +export default function sum(arr, map, context) { assertArray(arr); let sum = 0; - const mapper = getMapper(map); - forEachSparse(arr, (el, i) => { - sum += mapper(arr[i], i, arr); + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + sum += mapper(el, i, arr); }); return sum; } diff --git a/src/util/array.js b/src/util/array.js index b0004f14c..4bb5ff836 100644 --- a/src/util/array.js +++ b/src/util/array.js @@ -1,3 +1,5 @@ +// TODO: remove? + import { hasOwnProperty, forEachProperty } from './helpers'; // Iterate over arrays with fallback to prevent iterating diff --git a/src/util/mappers.js b/src/util/mappers.js index 7b70e0eb8..48fd378d8 100644 --- a/src/util/mappers.js +++ b/src/util/mappers.js @@ -1,9 +1,9 @@ import { isFunction, isArray } from './typeChecks'; import { deepGetProperty } from './deepProperties'; -export function getMapper(obj) { +export function getMapper(obj, context) { if (isFunction(obj)) { - return obj; + return obj.bind(context); } else if (isArray(obj)) { return getArrayMapper(obj); } else if (obj) { diff --git a/src/util/matchers.js b/src/util/matchers.js index b2e293b63..9bef5ddef 100644 --- a/src/util/matchers.js +++ b/src/util/matchers.js @@ -2,14 +2,14 @@ import { isPrimitive, isRegExp, isDate, isFunction, isObjectType } from './typeC import { forEachProperty } from './helpers'; import { isPlainObject } from './object'; -export function getMatcher(obj) { +export function getMatcher(obj, context) { if (!isPrimitive(obj)) { if (isRegExp(obj)) { return getRegexMatcher(obj); } else if (isDate(obj)) { return getDateMatcher(obj); } else if (isFunction(obj)) { - return getFunctionMatcher(obj); + return getFunctionMatcher(obj, context); } else if (isPlainObject(obj)) { return getFuzzyMatcher(obj); } @@ -30,10 +30,10 @@ function getDateMatcher(date) { }; } -function getFunctionMatcher(fn) { +function getFunctionMatcher(fn, context) { return (el, i, arr) => { // Return true up front if match by reference - return el === fn || fn.call(arr, el, i, arr); + return el === fn || fn.call(context || arr, el, i, arr); }; } diff --git a/test/tests/array.js b/test/tests/array.js index 4fa920e58..ba55a2c1d 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -238,7 +238,8 @@ namespace('Array', function() { assertEqual(el, 'a'); assertEqual(i, 0); assertArrayEqual(arr, ['a']); - }); + assertEqual(this, 'context'); + }, 'context'); }); it('should not iterate over all members of sparse arrays', function() { @@ -294,8 +295,8 @@ namespace('Array', function() { }); it('should exclude by function when strictly equal', function() { - var fn1 = function(){}; - var fn2 = function(){}; + var fn1 = function() {}; + var fn2 = function() {}; assertArrayEqual(exclude([fn1, fn2], fn2), [fn1]); }); @@ -309,7 +310,8 @@ namespace('Array', function() { assertEqual(el, 'a'); assertEqual(i, 0); assertArrayEqual(arr, ['a']); - }); + assertEqual(this, 'context'); + }, 'context'); }); it('should not iterate over all members of sparse arrays', function() { @@ -413,7 +415,10 @@ namespace('Array', function() { }); it('should be able to pass context', function() { - map([1], function (el) { + map(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); assertEqual(this, 'context'); }, 'context'); }); @@ -480,7 +485,8 @@ namespace('Array', function() { assertEqual(el, 'a'); assertEqual(i, 0); assertArrayEqual(arr, ['a']); - }); + assertEqual(this, 'context'); + }, 'context'); }); it('should not iterate over all members of sparse arrays', function() { @@ -552,7 +558,8 @@ namespace('Array', function() { assertEqual(el, 'a'); assertEqual(i, 0); assertArrayEqual(arr, ['a']); - }); + assertEqual(this, 'context'); + }, 'context'); }); it('should not iterate over all members of sparse arrays', function() { @@ -625,7 +632,8 @@ namespace('Array', function() { assertEqual(el, 'a'); assertEqual(i, 0); assertArrayEqual(arr, ['a']); - }); + assertEqual(this, 'context'); + }, 'context'); }); it('should not iterate over all members of sparse arrays', function() { @@ -695,7 +703,8 @@ namespace('Array', function() { assertEqual(el, 'a'); assertEqual(i, 0); assertArrayEqual(arr, ['a']); - }); + assertEqual(this, 'context'); + }, 'context'); }); it('should not iterate over all members of sparse arrays', function() { @@ -755,6 +764,15 @@ namespace('Array', function() { ], 'posts.0.views'), 189); }); + it('should pass correct params to callback', function() { + sum(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + it('should not iterate over all members of sparse arrays', function() { var count = 0; var arr = ['a']; From c862db750aa19f825bae910755ba8652cf00ab22 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 16:18:10 +0900 Subject: [PATCH 072/191] Added Array#filter Array#find and Array#findIndex --- src/array/define.js | 3 + src/array/filter.js | 40 ++++++ src/array/find.js | 51 ++++++++ src/array/findIndex.js | 49 +++++++ src/array/methods.js | 3 + src/util/matchers.js | 3 +- test/OLD/tests/enumerable.js | 243 ----------------------------------- test/tests/array.js | 205 +++++++++++++++++++++++++++++ 8 files changed, 352 insertions(+), 245 deletions(-) create mode 100644 src/array/filter.js create mode 100644 src/array/find.js create mode 100644 src/array/findIndex.js diff --git a/src/array/define.js b/src/array/define.js index 0531aa119..d554f013e 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -6,6 +6,9 @@ defineInstance('average', methods.average); defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); defineInstance('every', methods.every); +defineInstance('filter', methods.filter); +defineInstance('find', methods.find); +defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); defineInstance('map', methods.map); defineInstance('median', methods.median); diff --git a/src/array/filter.js b/src/array/filter.js new file mode 100644 index 000000000..6cb12e934 --- /dev/null +++ b/src/array/filter.js @@ -0,0 +1,40 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; + +const nativeFn = Array.prototype.filter; + +/** + * Returns a new array with matched elements. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to find the elements to include. When a + * function is passed a truthy return value will match the element. Primitives + * will directly match elements. Can also be a Date object to match dates, a + * RegExp which will test against strings, or a plain object which will perform + * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. + * + * @returns {Array} + * + * @callback searchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].filter(2) -> [2] + * ['a','b','c'].filter(/[ac]/) -> ['a','c'] + * [{a:1},{b:2}].filter(function(n) { + * return n['a'] == 1; + * }); -> [{a:1}] + * [{a:1},{b:2}].filter({a:1}); -> [{a:1}] + * + **/ +export default function filter(arr, match, context) { + assertArray(arr); + return nativeFn.call(arr, getMatcher(match, context)); +} diff --git a/src/array/find.js b/src/array/find.js new file mode 100644 index 000000000..a4fc99b7e --- /dev/null +++ b/src/array/find.js @@ -0,0 +1,51 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + * Returns the first element in the array that matches input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to find the elements to include. When a + * function is passed a truthy return value will match the element. Primitives + * will directly match elements. Can also be a Date object to match dates, a + * RegExp which will test against strings, or a plain object which will perform + * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. + * + * @returns {Array} + * + * @callback searchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].find(2) -> 2 + * ['a','b','c'].find(/[ac]/) -> 'a' + * [{a:1},{b:2}].find(function(n) { + * return n['a'] == 1; + * }); -> {a:1} + * [{a:1},{b:2}].find({a:1}); -> {a:1} + * + **/ +export default function find(arr, match, context) { + assertArray(arr); + const matcher = getMatcher(match, context); + let result; + let found = false; + // Native find visits all elements in sparse arrays + // so using helper here instead. + forEachSparse(arr, (el, i) => { + if (matcher(el, i, arr)) { + result = el; + found = true; + } + return !found; + }) + return result; +} diff --git a/src/array/findIndex.js b/src/array/findIndex.js new file mode 100644 index 000000000..bb45403a6 --- /dev/null +++ b/src/array/findIndex.js @@ -0,0 +1,49 @@ +import { getMatcher } from '../util/matchers'; +import { assertArray } from '../util/assertions'; +import { forEachSparse } from '../util/array'; + +/** + * Returns the index of the first element in the array that matches input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to find the elements to include. When a + * function is passed a truthy return value will match the element. Primitives + * will directly match elements. Can also be a Date object to match dates, a + * RegExp which will test against strings, or a plain object which will perform + * a "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * @param {any} [context] - The `this` argument to be passed to the matching + * function. + * + * @returns {Array} + * + * @callback searchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].findIndex(2) -> 1 + * ['a','b','c'].find(/[ac]/) -> 0 + * [{a:1},{b:2}].find(function(n) { + * return n['a'] == 1; + * }); -> 0 + * [{a:1},{b:2}].find({a:1}); -> 0 + * + **/ +export default function findIndex(arr, match, context) { + assertArray(arr); + const matcher = getMatcher(match, context); + // Native findIndex visits all elements in sparse arrays + // so using helper here instead. + let index = -1; + forEachSparse(arr, (el, i) => { + if (matcher(el, i, arr)) { + index = i; + } + return index === -1; + }) + return index; +} diff --git a/src/array/methods.js b/src/array/methods.js index bdd419bf1..f59ca17ed 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -3,6 +3,9 @@ export { default as average } from './average'; export { default as count } from './count'; export { default as every } from './every'; export { default as exclude } from './exclude'; +export { default as filter } from './filter'; +export { default as find } from './find'; +export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; export { default as map } from './map'; export { default as median } from './median'; diff --git a/src/util/matchers.js b/src/util/matchers.js index 9bef5ddef..ef93cec83 100644 --- a/src/util/matchers.js +++ b/src/util/matchers.js @@ -1,6 +1,5 @@ import { isPrimitive, isRegExp, isDate, isFunction, isObjectType } from './typeChecks'; import { forEachProperty } from './helpers'; -import { isPlainObject } from './object'; export function getMatcher(obj, context) { if (!isPrimitive(obj)) { @@ -10,7 +9,7 @@ export function getMatcher(obj, context) { return getDateMatcher(obj); } else if (isFunction(obj)) { return getFunctionMatcher(obj, context); - } else if (isPlainObject(obj)) { + } else { return getFuzzyMatcher(obj); } } diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 76d9d31ef..7a26f65bd 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1,249 +1,6 @@ namespace('Array', function() { 'use strict'; - method('filter', function() { - var fn; - - test([1,2,3], [1], [1], 'accepts a number shortcut match'); - test([2,3,4], [1], [], 'accepts a number shortcut no match'); - test(['a','b','c'], ['a'], ['a'], 'accepts a string shortcut match'); - test(['b','c','d'], ['a'], [], 'accepts a string shortcut no match'); - test(['a','b','c'], [/[a-f]/], ['a','b','c'], 'accepts a regex shortcut match'); - test(['a','b','c'], [/[m-z]/], [], 'accepts a regex shortcut no match'); - test([{a:1},{a:2}], [{a:1}], [{a:1}], 'checks objects match'); - test([{a:2},{a:3}], [{a:1}], [], 'checks object no match'); - test(['a','a','c'], ['a'], ['a','a'], 'a,a'); - test(['a','b','c'], ['q'], [], 'q'); - test([2,2,3], [2], [2,2], '2,2'); - test([1,2,3], [4], [], '4'); - - test([12,4,8,130,44], [function(el, i, a) { return el > 10 }], [12,130,44], 'numbers above 10'); - test([12,4,8,130,44], [function(el, i, a) { return el < 10 }], [4,8], 'numbers below 10'); - - fn = function(el, i, a) { - equal(el, 'a', 'first parameter is the element'); - equal(i, 0, 'second parameter is the index'); - equal(a, ['a'], 'third parameter is the array'); - equal(this.toString(), 'this', 'scope is passed properly'); - } - - run(['a'], 'filter', [fn, 'this']); - - test([{name:'john',age:25},{name:'fred',age:85}], ['age'], [], 'simple string mistakenly passed for complex objects'); - test([{name:'john',age:25},{name:'fred',age:85}], [{name:'john',age:25}], [{name:'john',age:25}], 'filtering john'); - test([{name:'john',age:25},{name:'fred',age:85}], [{name:'fred',age:85}], [{name:'fred',age:85}], 'filtering fred'); - - raisesError(function() { run([1,2,3], 'filter'); }, 'no argument raises a type error'); - - test(threeUndefined, oneUndefined, threeUndefined, 'undefined should match all undefined'); - test(threeUndefined, [null], [], 'null should not match all undefined'); - test(undefinedWithNull, oneUndefined, oneUndefined, 'undefined should match one undefined'); - test(undefinedWithNull, [null], [null], 'null should match one null'); - test([null, null], [null], [null, null], 'null should match all null'); - test([null, null], oneUndefined, [], 'undefined should not match all null'); - - test([{a:1},{b:2},{c:3}], [{a:1}], [{a:1}], 'a:1'); - test([{a:1},{a:1},{c:3}], [{a:1}], [{a:1},{a:1}], 'a:1,a:1'); - test([{a:1},{b:2},{c:3}], [{d:4}], [], 'd:4'); - test([{a:1},{b:2},{c:3}], [{c:4}], [], 'c:4'); - test([[1,2],[2,3],[4,5]], [[2,3]], [[2,3]], '2,3'); - test([[1,2],[2,3],[4,5]], [[2,4]], [], '2,4'); - test([[1,2],[2,3],[2,3]], [[2,3]], [[2,3],[2,3]], '[2,3],[2,3]'); - test(['foo','bar'], [/f+/], ['foo'], '/f+/'); - test(['foo','bar'], [/[a-f]/], ['foo','bar'], '/[a-f]/'); - test(['foo','bar'], [ /q+/], [], '/q+/'); - - test([{a:10},{a:8},{a:3}], [function(e) { return e['a'] > 5; }, 0], [{a:10},{a:8}], 'key "a" is greater than 5'); - test([{a:10},{a:8},{a:3}], [function(e) { return e['a'] > 5; }, 0, true], [{a:10},{a:8}], 'looping | key "a" is greater than 5'); - test([function() {}], [function(e) {}, 0], [], 'null function'); - test([null, null], [null, 0], [null, null], 'null'); - test([function() {}], [function(e) {}, 0, true], [], 'looping | null function'); - test([null, null], [null, 0, true], [null, null], 'looping | null'); - - var fn = function() { - return false; - } - - test([fn], [fn], [], 'should not find functions by reference'); - - var undefinedContextObj = (function(){ return this; }).call(undefined); - var fn = function() { - equal(this, undefinedContextObj, 'this context should be the array'); - } - run([1], 'filter', [fn]); - - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' }, - { name: 'buddy', age: 82, hair: { color: 'red', type: 'long', cost: 15, last_cut: new Date(2010, 4, 18) } } - ]; - - raisesError(function(){ run([], 'filter') }, 'no argument raises an error', TypeError); - - test(people, [{}], people, 'complex | empty object'); - test(people, ['age'], [], 'complex | string argument'); - test(people, [4], [], 'complex | number argument'); - test(people, [{ age: 27 }], [people[0], people[3]], 'complex | one property'); - test(people, [{ age: 27, hair: 'brown' }], [people[0]], 'complex | two properties'); - test(people, [{ hair: { color: 'red' }}], [people[4]], 'complex | nested property'); - test(people, [{ hair: { color: 'green' }}], [], 'complex | non-matching nested property'); - test(people, [{ hair: { color: 'red', type: 'long' }}], [people[4]], 'complex | two nested properties'); - test(people, [{ hair: { color: 'green', type: 'mean' }}], [], 'complex | two non-matching nested properties'); - test(people, [{ hair: { color: 'red', type: 'mean' }}], [], 'complex | two nested properties, one non-matching'); - test(people, [{ hair: { color: 'red', life: 'long' }}], [], 'complex | two nested properties, one non-existing'); - test(people, [{ hair: { color: /r/ }}], [people[4]], 'complex | nested regex'); - test(people, [{ hair: { cost: 15 }}], [people[4]], 'complex | nested number'); - test(people, [{ hair: { cost: 23 }}], [], 'complex | nested non-matching number'); - test(people, [{ hair: { cost: undefined }}], [], 'complex | nested undefined property'); - test(people, [{ hair: { post: undefined }}], [people[4]], 'complex | nested undefined property non-existent'); - test(people, [{ hair: { cost: NaN }}], [], 'complex | nested property is NaN'); - test(people, [{ hair: { color: function(c){ return c == 'red'; } }}], [people[4]], 'complex | nested function'); - test(people, [{ some: { random: { shit: {}}}}], [], 'complex | totally unrelated properties'); - test(people, [{ hair: { last_cut: new Date(2010, 4, 18) }}], [people[4]], 'complex | simple date'); - - - // Issue #157 Ensure that instances can be subject to fuzzy matches despite not being "objects" - - function Foo(a) { - this.a = a; - } - - var one = new Foo('one'); - var two = new Foo('two'); - var three = new Foo('three'); - var four = new Foo(new Date(2001, 3, 15)); - - test([one, two, three, four], [{ a: 'one' }], [one], 'matches class instances | object with string'); - test([one, two, three, four], [{ a: /^t/ }], [two, three], 'matches class instances | object with regex'); - test([one, two, three, four], ['one'], [], 'matches class instances | string'); - test([one, two, three, four], [/t/], [one, two, three, four], 'directly passing a regex is matching the objects stringified'); - test([one, two, three, four], [/x/], [], 'directly passing a regex with no matching letter'); - test([one, two, three, four], [true], [], 'matches class instances | boolean'); - test([one, two, three, four], [new Date()], [], 'matches class instances | now'); - test([one, two, three, four], [new Date(2001, 3, 15)], [], 'matches class instances | correct date'); - test([one, two, three, four], [null], [], 'matches class instances | null'); - test([one, two, three, four], oneUndefined, [], 'matches class instances | undefined'); - test([one, two, three, four], [{ a: 'twof' }], [], 'matches class instances | nonexistent string'); - test([one, two, three, four], [{ b: 'one' }], [], 'matches class instances | nonexistent property'); - test([one, two, three, four], [{}], [one, two, three, four], 'matches class instances | empty object'); - test([one, two, three, four], [{ a: new Date(2001, 3, 15) }], [four], 'matches class instances | object with correct date'); - test([one, two, three, four], [{ b: new Date(2001, 3, 15) }], [], 'matches class instances | object with correct date but wrong property'); - test([one, two, three, four], [{ a: new Date(2001, 3, 16) }], [], 'matches class instances | object with incorrect date'); - test([one, two, three, four], [{ a: new Date(2001, 3, 15, 0, 0, 0, 1) }], [], 'matches class instances | object with date off by 1ms'); - - var date = new Date(2001, 3, 15); - var timestamp = date.getTime(); - var obj = { a: { getTime: function() { return timestamp; } }}; - test([obj], [{ a: date }], [obj], 'duck typing for date matching'); - - var five = new Foo(one); - - test([five], [{ a: 'one' }], [], 'nested instances | object with string'); - test([five], [{ a: { a: 'one' } }], [five], 'nested instances | object with double nested string'); - test([five], [{ a: { a: 'two' } }], [], 'nested instances | object with double nested string but incorrect'); - - - // Fuzzy matching behavior on functions. - - var count = 0; - var fn = function(){ count ++; }; - - run([1,2,3], 'filter', [fn]); - equal(count, 3, 'functions treated as callbacks when matching against non-functions'); - - count = 0; - run([function() {}, function() {}, function() {}], 'filter', [fn]); - equal(count, 3, 'functions are not directly matched'); - - - var fn1 = function() {}; - var fn2 = function() {}; - var matchFn1 = function(el) { - return el === fn1; - } - var matchFn2 = function(el) { - return el === fn2; - } - - equal(run([fn1, fn2, fn1], 'filter', [matchFn1]), [fn1, fn1], 'functions can be matched inside the callback'); - equal(run([fn1, fn2, fn1], 'filter', [matchFn2]), [fn2], 'fn2 | functions can be matched inside the callback'); - - }); - - method('find', function() { - - test(['a','b','c'], ['a'], 'a', 'a'); - test(['a','a','c'], ['a'], 'a', 'first a'); - test(['a','b','c'], ['q'], undefined, 'q'); - test([1,2,3], [1], 1, '1'); - test([2,2,3], [2], 2, '2'); - test([1,2,3], [4], undefined, '4'); - test([{a:1},{b:2},{c:3}], [{a:1}], {a:1}, 'a:1'); - test([{a:1},{a:1},{c:3}], [{a:1}], {a:1}, 'first a:1'); - test([{a:1},{b:2},{c:3}], [{d:4}], undefined, 'd:4'); - test([{a:1},{b:2},{c:3}], [{c:4}], undefined, 'c:4'); - test([[1,2],[2,3],[4,5]], [[2,3]], [2,3], '2,3'); - test([[1,2],[2,3],[4,5]], [[2,4]], undefined, '2,4'); - test([[1,2],[2,3],[2,3]], [[2,3]], [2,3], 'first 2,3'); - test(['foo','bar'], [/f+/], 'foo', '/f+/'); - test(['foo','bar'], [/[a-f]/], 'foo', '/a-f/'); - test(['foo','bar'], [/q+/], undefined, '/q+/'); - test([function() {}], [function(e) {}, 0], undefined, 'undefined function'); - test([null, null], [null, 0], null, 'null'); - test(threeUndefined, safeArray(undefined, 0), undefined, 'undefined'); - test(safeArray(undefined, 'a'), safeArray(undefined, 1), undefined, 'undefined can be found'); - - - var count = 0; - [1,2,3].find(function(n) { - count++; - return n == 1; - }); - equal(count, 1, 'should immediately finish when it finds a match'); - - var count = 0; - run([1,2,3], 'find', [function(n) { - count++; - return n == 1; - }]); - equal(count, 1, 'should also be mapped to global'); - - raisesError(function() { run([1,2,3], 'find'); }, 'no argument raises a type error'); - - }); - - method('findIndex', function() { - - raisesError(function() { run([1,2,3], 'findIndex'); }, 'no argument raises a type error'); - - test(['a','b','c'], ['b'], 1, 'b in a,b,c'); - test(['a','b','c'], ['b', 0], 1, 'b in a,b,c from 0'); - test(['a','b','c'], ['a'], 0, 'a in a,b,c'); - test(['a','b','c'], ['f'], -1, 'f in a,b,c'); - - test(['a','b','c','b'], ['b'], 1, 'finds first instance'); - - test([5,2,4], [5], 0, '5 in 5,2,4'); - test([5,2,4], [2], 1, '2 in 5,2,4'); - test([5,2,4], [4], 2, '4 in 5,2,4'); - - test([{ foo: 'bar' }], [{ foo: 'bar' }], 0, 'will find deep objects'); - test([{ foo: 'bar' }], [function(a) { return a.foo === 'bar'; }], 0, 'will run against a function'); - - test(['a','b','c'], [/[bz]/], 1, 'matches regexp'); - - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' } - ]; - - test(people, [function(person) { return person.age == 13; }], 2, 'JSON objects'); - }); - group('Fuzzy Matching', function() { var arr = [{name: 'joe', age: 25}]; diff --git a/test/tests/array.js b/test/tests/array.js index ba55a2c1d..1cdc2a933 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -658,6 +658,211 @@ namespace('Array', function() { }); + describeInstance('filter', function(filter) { + + it('should filter array members', function() { + assertArrayEqual(filter([1,2,2,3], 2), [2,2]); + assertArrayEqual(filter([0,1], 0), [0]); + }); + + it('should filter by regex', function() { + assertArrayEqual(filter(['a','b','c'], /[ac]/), ['a','c']); + assertArrayEqual(filter([1,2,3,4], /[2-3]/), [2,3]); + }); + + it('should filter by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertArrayEqual(filter([d1, d2], new Date(2020, 7, 28)), [d1]); + }); + + it('should filter by function', function() { + assertArrayEqual(filter([1,2,3,4], (n) => n % 2 === 0), [2,4]); + assertArrayEqual(filter([1,2,3,4], (n) => n > 5), []); + assertArrayEqual(filter([1,2,3,4], (n) => n > 2), [3,4]); + }); + + it('should filter by function when strictly equal', function() { + var fn1 = function() {}; + var fn2 = function() {}; + assertArrayEqual(filter([fn1, fn2], fn2), [fn2]); + }); + + it('should filter by fuzzy matching', function() { + assertArrayEqual(filter([{a:1,b:1},{a:2,b:2}], {a:1}), [{a:1,b:1}]); + assertArrayEqual(filter([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'Frank'}]); + }); + + it('should allow fuzzy matches on non-plain objects', function() { + // Issue #157 + function Foo(a) { + this.a = a; + } + assertArrayEqual(filter([{a:1},{b:2}], new Foo(1)), [{a:1}]); + assertArrayEqual(filter([{a:'a'},{a:'b'}], new Foo('a')), [{a:'a'}]); + assertArrayEqual(filter([{a:'a'},{a:'b'}], new Foo(/b/)), [{a:'b'}]); + }); + + it('should pass correct params to callback', function() { + filter(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + filter(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertArrayEqual(filter([1,2,2,3]), []); + assertArrayEqual(filter([1,2,2,3], null), []); + assertArrayEqual(filter([1,2,2,3], NaN), []); + assertError(function() { filter(null); }); + assertError(function() { filter('a'); }); + assertError(function() { filter(1); }); + }); + + }); + + describeInstance('find', function(find) { + + it('should find array members', function() { + assertEqual(find([1,2,2,3], 2), 2); + assertEqual(find([0,1], 0), 0); + }); + + it('should find by regex', function() { + assertEqual(find(['a','b','c'], /[ac]/), 'a'); + assertEqual(find([1,2,3,4], /[2-3]/), 2); + }); + + it('should find by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertDateEqual(find([d1, d2], new Date(2020, 7, 28)), d1); + }); + + it('should find by function', function() { + assertEqual(find([1,2,3,4], (n) => n % 2 === 0), 2); + assertEqual(find([1,2,3,4], (n) => n > 5), undefined); + assertEqual(find([1,2,3,4], (n) => n > 2), 3); + }); + + it('should find by function when strictly equal', function() { + var fn1 = function() {}; + var fn2 = function() {}; + assertEqual(find([fn1, fn2], fn2), fn2); + }); + + it('should find by fuzzy matching', function() { + assertObjectEqual(find([{a:1,b:1},{a:2,b:2}], {a:1}), {a:1,b:1}); + assertObjectEqual(find([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), {name:'Frank'}); + }); + + it('should pass correct params to callback', function() { + find(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + find(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(find([1,2,2,3]), undefined); + assertEqual(find([1,2,2,3], null), undefined); + assertEqual(find([1,2,2,3], NaN), undefined); + assertError(function() { find(null); }); + assertError(function() { find('a'); }); + assertError(function() { find(1); }); + }); + + }); + + describeInstance('findIndex', function(findIndex) { + + it('should find array members', function() { + assertEqual(findIndex([1,2,2,3], 2), 1); + assertEqual(findIndex([0,1], 0), 0); + }); + + it('should find by regex', function() { + assertEqual(findIndex(['a','b','c'], /[ac]/), 0); + assertEqual(findIndex([1,2,3,4], /[2-3]/), 1); + }); + + it('should find by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(findIndex([d1, d2], new Date(2020, 7, 28)), 0); + }); + + it('should find by function', function() { + assertEqual(findIndex([1,2,3,4], (n) => n % 2 === 0), 1); + assertEqual(findIndex([1,2,3,4], (n) => n > 5), -1); + assertEqual(findIndex([1,2,3,4], (n) => n > 2), 2); + }); + + it('should find by function when strictly equal', function() { + var fn1 = function() {}; + var fn2 = function() {}; + assertEqual(findIndex([fn1, fn2], fn2), 1); + }); + + it('should find by fuzzy matching', function() { + assertEqual(findIndex([{a:1,b:1},{a:2,b:2}], {a:1}), 0); + assertEqual(findIndex([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), 0); + }); + + it('should pass correct params to callback', function() { + findIndex(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + findIndex(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(findIndex([1,2,2,3]), -1); + assertEqual(findIndex([1,2,2,3], null), -1); + assertEqual(findIndex([1,2,2,3], NaN), -1); + assertError(function() { findIndex(null); }); + assertError(function() { findIndex('a'); }); + assertError(function() { findIndex(1); }); + }); + + }); + describeInstance('count', function(count) { it('should count all elements with no arguments', function() { From 3fcefe563827b527776180f2cc3a91d4842fd270 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 16:21:40 +0900 Subject: [PATCH 073/191] removed fromIndex array aliases --- CHANGELOG.md | 4 + test/OLD/tests/enumerable.js | 836 ----------------------------------- 2 files changed, 4 insertions(+), 836 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9e1eef61..c90105057 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,6 +76,10 @@ call `Function#lock` first in the chain to achieve the same effect. - Renamed `Function#after` to `Function#callAfter` to better communicate intent. Additionally allowing a function here to server as the lock condition. - Added `Function#callUntil`. +- Removed Array `fromIndex` aliases `mapFromIndex`, `forEachFromIndex`, + `filterFromIndex`, `someFromIndex`, `everyFromIndex`, `reduceFromIndex`, + `reduceRightFromIndex`, `findFromIndex`, `findIndexFromIndex`. Use + `Array#slice` here instead for similar functionality. TODO: diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 7a26f65bd..a6f3b8c53 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1,842 +1,6 @@ namespace('Array', function() { 'use strict'; - - group('Fuzzy Matching', function() { - var arr = [{name: 'joe', age: 25}]; - var match = { name: /j/ }; - - equal(run(arr, 'every', [match]), true, 'every'); - equal(run(arr, 'some', [match]), true, 'some'); - equal(run(arr, 'none', [match]), false, 'none'); - equal(run(arr, 'count', [match]), 1, 'count'); - equal(run(arr, 'filter', [match]), [arr[0]], 'filter'); - equal(run(arr, 'find', [match]), arr[0], 'find'); - equal(run(arr, 'findIndex', [match]), 0, 'findIndex'); - - }); - - group('Array Inheritance', function() { - var count; - - // Inherits from array... - - var Soup = function() {}, x; - Soup.prototype = [1,2,3]; - - x = new Soup(); - count = 0; - - run(x, 'forEachFromIndex', [0, function() { - count++; - }]); - run(x, 'findFromIndex', [0, function() { - count++; - }]); - run(x, 'filterFromIndex', [0, function() { - count++; - }]); - - equal(count, 9, 'array elements in the prototype chain are also properly iterated'); - - - // Inherits from sparse array... - - var arr = ['a']; - arr[20] = 'b'; - - Soup.prototype = arr; - - x = new Soup(); - count = 0; - - run(x, 'forEachFromIndex', [0, function() { - count++; - }]); - - equal(count, 2, 'sparse array elements in the prototype chain are also properly iterated'); - - // This test cannot be framed in a meaninful way... IE will not set the length property - // when pushing new elements and other browsers will not work on sparse arrays... - // equal(count, 6, 'Array | objects that inherit from arrays can still iterate'); - - }); - - method('forEachFromIndex', function() { - - var xyz = ['x','y','z']; - - function assertForEachFromIndex(arr, args, expectedEls, expectedIdx) { - var els = [], idx = []; - - var fn = function(el, i) { - els.push(el); - idx.push(i); - } - args.push(fn); - run(arr, 'forEachFromIndex', args); - equal(els, expectedEls, 'forEachFromIndex | els'); - equal(idx, expectedIdx, 'forEachFromIndex | idx'); - } - - // Return value - equal(run(xyz, 'forEachFromIndex', [0, function(){}]), undefined, 'Should return the same as forEach'); - - // Errors - raisesError(function() { run(xyz, 'forEachFromIndex', []); }, 'error with no args', TypeError); - raisesError(function() { run(xyz, 'forEachFromIndex', [4]); }, 'error with only start index', TypeError); - - // No looping, pos index - assertForEachFromIndex(xyz, [0], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [1], ['y','z'], [1, 2]); - assertForEachFromIndex(xyz, [2], ['z'], [2]); - assertForEachFromIndex(xyz, [3], [], []); - - // No looping, neg index - assertForEachFromIndex(xyz, [-1], ['z'], [2]); - assertForEachFromIndex(xyz, [-2], ['y','z'], [1, 2]); - assertForEachFromIndex(xyz, [-3], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [-4], ['x','y','z'], [0, 1, 2]); - - // No looping explicit, pos index - assertForEachFromIndex(xyz, [0, false], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [1, false], ['y','z'], [1, 2]); - assertForEachFromIndex(xyz, [2, false], ['z'], [2]); - assertForEachFromIndex(xyz, [3, false], [], []); - - // No looping explicit, neg index - assertForEachFromIndex(xyz, [-1, false], ['z'], [2]); - assertForEachFromIndex(xyz, [-2, false], ['y','z'], [1, 2]); - assertForEachFromIndex(xyz, [-3, false], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [-4, false], ['x','y','z'], [0, 1, 2]); - - // Looping, pos index - assertForEachFromIndex(xyz, [0, true], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [1, true], ['y','z','x'], [1, 2, 0]); - assertForEachFromIndex(xyz, [2, true], ['z','x','y'], [2, 0, 1]); - assertForEachFromIndex(xyz, [3, true], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [4, true], ['x','y','z'], [0, 1, 2]); - - // Looping, neg index - assertForEachFromIndex(xyz, [-1, true], ['z','x','y'], [2, 0, 1]); - assertForEachFromIndex(xyz, [-2, true], ['y','z','x'], [1, 2, 0]); - assertForEachFromIndex(xyz, [-3, true], ['x','y','z'], [0, 1, 2]); - assertForEachFromIndex(xyz, [-4, true], ['x','y','z'], [0, 1, 2]); - - // Args - assertFromIndexArgs(['x'], 'forEach', [0], ['x', 0]); - assertFromIndexArgs(['x','y'], 'forEach', [1], ['y', 1]); - - // Passing context value - var fn = function() { actualContext = this;}, actualContext, fakeContext = {}; - run([1], 'forEachFromIndex', [0, fn, fakeContext]); - equal(actualContext, fakeContext, 'Context should be passable'); - - // Moved from Array#each - - var arr = [2, 5, 9]; - var fn = function(el, i, a) { - equal(el, arr[i], 'looping successfully'); - }; - run(arr, 'forEachFromIndex', [0, fn]); - - var arr = ['a', [1], { foo: 'bar' }, 352]; - var count = 0; - var fn = function() { - count++; - }; - run(arr, 'forEachFromIndex', [0, fn]); - equal(count, 4, 'complex array | should have looped 4 times'); - - var fn = function(el, i, a) { - equal(el, 'a', 'first parameter is the element'); - equal(i, 0, 'second parameter is the index'); - equal(a, ['a'], 'third parameter is the array'); - equal(this, 'this', 'scope is also the array'); - }; - run(['a'], 'forEachFromIndex', [0, fn, 'this']); - - var count = 0; - - run({'0':'a','length':'1'}, 'forEachFromIndex', [0, function() { count++; }]); - - equal(count, 1, 'looping over array-like objects with string lengths'); - - var result = []; - var count = 0; - var fn = function(s, i) { - result.push(s); - equal(i, count + 1, 'index should be correct'); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [1, fn]); - equal(count, 2, 'should have run 2 times'); - equal(result, ['b','c'], 'result'); - - var result = []; - var indexes = [1,2,0]; - var count = 0; - var fn = function(s, i) { - result.push(s); - equal(i, indexes[count], 'looping from index 1 | index should be correct'); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [1, true, fn]); - equal(count, 3, 'looping from index 1 | should have run 3 times') - equal(result, ['b','c','a'], 'looping from index 1 | result'); - - var result = []; - var indexes = [0,1,2]; - var count = 0; - var fn = function(s, i) { - result.push(s); - equal(i, indexes[count], 'looping from index 0 | index should be correct') - count++; - } - run(['a','b','c'], 'forEachFromIndex', [0, true, fn]); - equal(count, 3, 'looping from index 0 | should have run 3 times') - equal(result, ['a','b','c'], 'looping from index 0 | result'); - - var result = []; - var indexes = [2,0,1]; - var count = 0; - var fn = function(s, i) { - result.push(s); - equal(i, indexes[count], 'looping from index 2 | index should be correct'); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [2, true, fn]); - equal(count, 3, 'looping from index 2 | should have run 3 times') - equal(result, ['c','a','b'], 'looping from index 2 | result'); - - var result = []; - var count = 0; - var fn = function(s, i) { - result.push(s); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [3, true, fn]); - equal(count, 3, 'looping from index 3 | should have run 3 times') - equal(result, ['a','b','c'], 'looping from index 3 | result'); - - var result = []; - var count = 0; - var fn = function(s, i) { - result.push(s); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [4, true, fn]); - equal(count, 3, 'looping from index 4 | should have run 3 times') - equal(result, ['a','b','c'], 'looping from index 4 | result'); - - var result = []; - var count = 0; - var fn = function(s, i) { - result.push(s); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [49, true, fn]); - equal(count, 3, 'looping from index 49 | should have run 3 times') - equal(result, ['a','b','c'], 'looping from index 49 | result'); - - var result = []; - var count = 0; - var fn = function(s, i) { - result.push(s); - count++; - } - run(['a','b','c'], 'forEachFromIndex', [0, fn, 'hoofa']); - equal(count, 3, 'string index should default to 0 | should have run 3 times') - equal(result, ['a','b','c'], 'string index should default to 0 | result'); - - // Sparse array handling - - var arr = ['a']; - arr[Math.pow(2,32) - 2] = 'b'; - var expectedValues = ['a','b']; - var expectedIndexes = [0, Math.pow(2,32) - 2]; - var count = 0; - var fn = function(el, i, a) { - equal(this, testNullScope, 'sparse | this object should be default'); - equal(el, expectedValues[count], 'sparse | first argument should be the current element'); - equal(i, expectedIndexes[count], 'sparse | second argument should be the current index'); - equal(a, arr, 'sparse | third argument should be the array'); - count++; - } - run(arr, 'forEachFromIndex', [0, fn]); - equal(count, 2, 'sparse | count should match'); - - var arr = []; - arr[-2] = 'd'; - arr[2] = 'f'; - arr[Math.pow(2, 32)] = 'c'; - var count = 0; - var fn = function(el, i) { - equal(el, 'f', 'sparse | values outside range are not iterated over | el'); - equal(i, 2, 'sparse | values outside range are not iterated over | index'); - count++; - } - run(arr, 'forEachFromIndex', [0, fn]); - equal(count, 1, 'sparse | values outside range are not iterated over | count'); - - var arr = []; - arr[9] = 'd'; - arr[2] = 'f'; - arr[5] = 'c'; - var count = 0; - var values = []; - var indexes = []; - var expectedValues = ['f','c','d']; - var expectedIndexes = [2,5,9]; - fn = function(val, i) { - values.push(val); - indexes.push(i); - } - run(arr, 'forEachFromIndex', [0, fn]); - equal(values, expectedValues, 'sparse | unordered should produce correct values'); - equal(indexes, expectedIndexes, 'sparse | unordered should produce correct indexes'); - - var arr = []; - arr[9] = 'd'; - arr[2] = 'f'; - arr[5] = 'c'; - var values = []; - var indexes = []; - var expectedValues = ['d','f','c']; - var expectedIndexes = [9,2,5]; - var fn = function(val, i) { - values.push(val); - indexes.push(i); - } - run(arr, 'forEachFromIndex', [7, true, fn]); - equal(values, expectedValues, 'sparse | looping should return correct values'); - equal(indexes, expectedIndexes, 'sparse | looping should return correct indexes'); - - var count = 0; - var fn = function() { - count++; - } - run(threeUndefined, 'forEachFromIndex', [0, fn]); - equal(count, 3, 'simply having an undefined in an array does not qualify it as sparse'); - - }); - - method('mapFromIndex', function() { - - var arr = [ - { name: 'John' }, - { name: 'Karen' }, - { name: 'Marty' } - ]; - - // No looping, pos index - assertFromIndex(arr, 'map', [0, 'name'], ['John', 'Karen', 'Marty']); - assertFromIndex(arr, 'map', [1, 'name'], ['Karen', 'Marty']); - assertFromIndex(arr, 'map', [2, 'name'], ['Marty']); - assertFromIndex(arr, 'map', [3, 'name'], []); - assertFromIndex(arr, 'map', [4, 'name'], []); - - // No looping, neg index - assertFromIndex(arr, 'map', [-1, 'name'], ['Marty']); - assertFromIndex(arr, 'map', [-2, 'name'], ['Karen', 'Marty']); - assertFromIndex(arr, 'map', [-3, 'name'], ['John', 'Karen', 'Marty']); - assertFromIndex(arr, 'map', [-4, 'name'], ['John', 'Karen', 'Marty']); - - // Looping, pos index - assertFromIndex(arr, 'map', [0, true, 'name'], ['John', 'Karen', 'Marty']); - assertFromIndex(arr, 'map', [1, true, 'name'], ['Karen', 'Marty', 'John']); - assertFromIndex(arr, 'map', [2, true, 'name'], ['Marty', 'John', 'Karen']); - assertFromIndex(arr, 'map', [3, true, 'name'], ['John', 'Karen', 'Marty']); - assertFromIndex(arr, 'map', [4, true, 'name'], ['John', 'Karen', 'Marty']); - - // Looping, neg index - assertFromIndex(arr, 'map', [-1, true, 'name'], ['Marty', 'John', 'Karen']); - assertFromIndex(arr, 'map', [-2, true, 'name'], ['Karen', 'Marty', 'John']); - assertFromIndex(arr, 'map', [-3, true, 'name'], ['John', 'Karen', 'Marty']); - assertFromIndex(arr, 'map', [-4, true, 'name'], ['John', 'Karen', 'Marty']); - - // Function - assertFromIndex(arr, 'map', [0, function(el) { return el.name; }], ['John', 'Karen', 'Marty']); - assertFromIndex(arr, 'map', [1, function(el) { return el.name; }], ['Karen', 'Marty']); - assertFromIndex(arr, 'map', [2, function(el) { return el.name; }], ['Marty']); - assertFromIndex(arr, 'map', [3, function(el) { return el.name; }], []); - - }); - - method('filterFromIndex', function() { - - var xyz = ['x','y','z']; - - // No looping, pos index - assertFromIndex(xyz, 'filter', [0, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [1, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [2, 'y'], []); - assertFromIndex(xyz, 'filter', [3, 'y'], []); - assertFromIndex(xyz, 'filter', [4, 'y'], []); - - // No looping, neg index - assertFromIndex(xyz, 'filter', [-1, 'y'], []); - assertFromIndex(xyz, 'filter', [-2, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [-3, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [-4, 'y'], ['y']); - - // Looping, pos index - assertFromIndex(xyz, 'filter', [0, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [1, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [2, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [3, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [4, true, 'y'], ['y']); - - // Looping, neg index - assertFromIndex(xyz, 'filter', [-1, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [-2, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [-3, true, 'y'], ['y']); - assertFromIndex(xyz, 'filter', [-4, true, 'y'], ['y']); - - // Looping, pos index, does not exist - assertFromIndex(xyz, 'filter', [0, true, 'q'], []); - assertFromIndex(xyz, 'filter', [1, true, 'q'], []); - assertFromIndex(xyz, 'filter', [2, true, 'q'], []); - assertFromIndex(xyz, 'filter', [3, true, 'q'], []); - assertFromIndex(xyz, 'filter', [4, true, 'q'], []); - - // Looping, neg index, does not exist - assertFromIndex(xyz, 'filter', [-1, true, 'q'], []); - assertFromIndex(xyz, 'filter', [-2, true, 'q'], []); - assertFromIndex(xyz, 'filter', [-3, true, 'q'], []); - assertFromIndex(xyz, 'filter', [-4, true, 'q'], []); - - // Regex - assertFromIndex(xyz, 'filter', [0, /[xy]/], ['x', 'y']); - assertFromIndex(xyz, 'filter', [1, /[xy]/], ['y']); - assertFromIndex(xyz, 'filter', [2, /[xy]/], []); - assertFromIndex(xyz, 'filter', [3, /[xy]/], []); - - // Function - assertFromIndex(xyz, 'filter', [0, function(el) { return el === 'y'; }], ['y']); - assertFromIndex(xyz, 'filter', [1, function(el) { return el === 'y'; }], ['y']); - assertFromIndex(xyz, 'filter', [2, function(el) { return el === 'y'; }], []); - assertFromIndex(xyz, 'filter', [3, function(el) { return el === 'y'; }], []); - - - // Moved from "filterFrom" - - test(['foo','bar'], [1, /[a-f]/], ['bar'], '/[a-f]/ from index 1'); - test(['foo','bar'], [1, true, /[a-f]/], ['bar','foo'], '/[a-f]/ from index 1'); - test([1,2,3], [0, function(e) { return e > 0; }], [1,2,3], 'greater than 0 from index 0'); - test([1,2,3], [1, function(e) { return e > 0; }], [2,3], 'greater than 0 from index 1'); - test([1,2,3], [2, function(e) { return e > 0; }], [3], 'greater than 0 from index 2'); - test([1,2,3], [3, function(e) { return e > 0; }], [], 'greater than 0 from index 3'); - test([1,2,3], [4, function(e) { return e > 0; }], [], 'greater than 0 from index 4'); - test([1,2,3], [0, function(e) { return e > 1; }], [2,3], 'greater than 1 from index 0'); - test([1,2,3], [1, function(e) { return e > 1; }], [2,3], 'greater than 1 from index 1'); - test([1,2,3], [2, function(e) { return e > 1; }], [3], 'greater than 1 from index 2'); - test([1,2,3], [0, function(e) { return e > 2; }], [3], 'greater than 2 from index 0'); - test([1,2,3], [0, function(e) { return e > 3; }], [], 'greater than 3 from index 0'); - - test([1,2,3], [0, true, function(e) { return e > 0; }], [1,2,3], 'looping | greater than 0 from index 0'); - test([1,2,3], [1, true, function(e) { return e > 0; }], [2,3,1], 'looping | greater than 0 from index 1'); - test([1,2,3], [2, true, function(e) { return e > 0; }], [3,1,2], 'looping | greater than 0 from index 2'); - test([1,2,3], [3, true, function(e) { return e > 0; }], [1,2,3], 'looping | greater than 0 from index 3'); - test([1,2,3], [0, true, function(e) { return e > 1; }], [2,3], 'looping | greater than 1 from index 0'); - test([1,2,3], [1, true, function(e) { return e > 1; }], [2,3], 'looping | greater than 1 from index 1'); - test([1,2,3], [2, true, function(e) { return e > 1; }], [3,2], 'looping | greater than 1 from index 2'); - test([1,2,3], [0, true, function(e) { return e > 2; }], [3], 'looping | greater than 2 from index 0'); - test([1,2,3], [0, true, function(e) { return e > 3; }], [], 'looping | greater than 3 from index 0'); - - test([{a:10},{a:8},{a:3}], [0, function(e) { return e['a'] > 5; }], [{a:10},{a:8}], 'key "a" is greater than 5'); - test([{a:10},{a:8},{a:3}], [1, function(e) { return e['a'] > 5; }], [{a:8}], 'key "a" is greater than 5 from index 1'); - test([{a:10},{a:8},{a:3}], [2, function(e) { return e['a'] > 5; }], [], 'key "a" is greater than 5 from index 2'); - - test([{a:10},{a:8},{a:3}], [0, true, function(e) { return e['a'] > 5; }], [{a:10},{a:8}], 'looping | key "a" is greater than 5'); - test([{a:10},{a:8},{a:3}], [1, true, function(e) { return e['a'] > 5; }], [{a:8},{a:10}], 'looping | key "a" is greater than 5 from index 1'); - test([{a:10},{a:8},{a:3}], [2, true, function(e) { return e['a'] > 5; }], [{a:10},{a:8}], 'looping | key "a" is greater than 5 from index 2'); - - test([function() {}], [0, function(e) {}], [], 'null function'); - test([function() {}], [1, function(e) {}], [], 'null function from index 1'); - test([null, null], [0, null], [null, null], 'null'); - test([null, null], [1, null], [null], 'null from index 1'); - - test([function() {}], [0, true, function(e) {}], [], 'looping | null function'); - test([function() {}], [1, true, function(e) {}], [], 'looping | null function from index 1'); - test([null, null], [0, true, null], [null, null], 'looping | null'); - test([null, null], [1, true, null], [null, null], 'looping | null from index 1'); - - // Example: finding last from an index. (reverse order). This means we don't need a filterFromLastIndex - var arr = [1,2,3,4,5,6,7,8,9]; - test(arr, [4, function(n) { return n % 3 == 0; }], [6,9], 'n % 3 from index 4'); - test(arr, [4, true, function(n) { return n % 3 == 0; }], [6,9,3], 'looping | n % 3 from index 4'); - - arr.reverse(); - test(arr, [4, function(n) { return n % 3 == 0; }], [3], 'reversed | n % 3 from index 4 reversed'); - test(arr, [4, true, function(n) { return n % 3 == 0; }], [3,9,6], 'looping | reversed | n % 3 from index 4 reversed'); - - }); - - method('someFromIndex', function() { - - var xyz = ['x','y','z']; - - // No looping, pos index - assertFromIndex(xyz, 'some', [0, 'y'], true); - assertFromIndex(xyz, 'some', [1, 'y'], true); - assertFromIndex(xyz, 'some', [2, 'y'], false); - assertFromIndex(xyz, 'some', [3, 'y'], false); - assertFromIndex(xyz, 'some', [4, 'y'], false); - - // No looping, neg index - assertFromIndex(xyz, 'some', [-1, 'y'], false); - assertFromIndex(xyz, 'some', [-2, 'y'], true); - assertFromIndex(xyz, 'some', [-3, 'y'], true); - assertFromIndex(xyz, 'some', [-4, 'y'], true); - - // Looping should always be true if the element exists - assertFromIndex(xyz, 'some', [0, true, 'y'], true); - assertFromIndex(xyz, 'some', [1, true, 'y'], true); - assertFromIndex(xyz, 'some', [2, true, 'y'], true); - assertFromIndex(xyz, 'some', [3, true, 'y'], true); - assertFromIndex(xyz, 'some', [4, true, 'y'], true); - - assertFromIndex(xyz, 'some', [-1, true, 'y'], true); - assertFromIndex(xyz, 'some', [-2, true, 'y'], true); - assertFromIndex(xyz, 'some', [-3, true, 'y'], true); - assertFromIndex(xyz, 'some', [-4, true, 'y'], true); - - // Looping should never be true if the element does not exist - assertFromIndex(xyz, 'some', [0, true, 'q'], false); - assertFromIndex(xyz, 'some', [1, true, 'q'], false); - assertFromIndex(xyz, 'some', [2, true, 'q'], false); - assertFromIndex(xyz, 'some', [3, true, 'q'], false); - assertFromIndex(xyz, 'some', [4, true, 'q'], false); - - assertFromIndex(xyz, 'some', [-1, true, 'q'], false); - assertFromIndex(xyz, 'some', [-2, true, 'q'], false); - assertFromIndex(xyz, 'some', [-3, true, 'q'], false); - assertFromIndex(xyz, 'some', [-4, true, 'q'], false); - - // Regex - assertFromIndex(xyz, 'some', [0, /[xy]/], true); - assertFromIndex(xyz, 'some', [1, /[xy]/], true); - assertFromIndex(xyz, 'some', [2, /[xy]/], false); - assertFromIndex(xyz, 'some', [3, /[xy]/], false); - - // Function - assertFromIndex(xyz, 'some', [0, function(el) { return el === 'y'; }], true); - assertFromIndex(xyz, 'some', [1, function(el) { return el === 'y'; }], true); - assertFromIndex(xyz, 'some', [2, function(el) { return el === 'y'; }], false); - assertFromIndex(xyz, 'some', [3, function(el) { return el === 'y'; }], false); - - // Can still run against an array of true - assertFromIndex([true, true], 'some', [1, true, true], true); - - }); - - method('everyFromIndex', function() { - - var xyz = ['x','y','z']; - var zzz = ['z','z','z']; - - // No looping, pos index - assertFromIndex(xyz, 'every', [0, 'z'], false); - assertFromIndex(xyz, 'every', [1, 'z'], false); - assertFromIndex(xyz, 'every', [2, 'z'], true); - - // As described on MDN, every is "vacuously true", or true even if the array is an empty set. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every - // https://en.wikipedia.org/wiki/Vacuous_truth#Vacuous_truths_in_mathematics - assertFromIndex(xyz, 'every', [3, 'z'], true); - assertFromIndex(xyz, 'every', [4, 'z'], true); - - // No looping, neg index - assertFromIndex(xyz, 'every', [-1, 'z'], true); - assertFromIndex(xyz, 'every', [-2, 'z'], false); - assertFromIndex(xyz, 'every', [-3, 'z'], false); - assertFromIndex(xyz, 'every', [-4, 'z'], false); - - // Looping, pos index - assertFromIndex(xyz, 'every', [0, true, 'y'], false); - assertFromIndex(xyz, 'every', [1, true, 'y'], false); - assertFromIndex(xyz, 'every', [2, true, 'y'], false); - assertFromIndex(xyz, 'every', [3, true, 'y'], false); - assertFromIndex(xyz, 'every', [4, true, 'y'], false); - - // Looping, neg index - assertFromIndex(xyz, 'every', [-1, true, 'y'], false); - assertFromIndex(xyz, 'every', [-2, true, 'y'], false); - assertFromIndex(xyz, 'every', [-3, true, 'y'], false); - assertFromIndex(xyz, 'every', [-4, true, 'y'], false); - - // Looping, all true - assertFromIndex(zzz, 'every', [0, true, 'z'], true); - assertFromIndex(zzz, 'every', [1, true, 'z'], true); - assertFromIndex(zzz, 'every', [2, true, 'z'], true); - assertFromIndex(zzz, 'every', [3, true, 'z'], true); - assertFromIndex(zzz, 'every', [4, true, 'z'], true); - - assertFromIndex(zzz, 'every', [-1, true, 'z'], true); - assertFromIndex(zzz, 'every', [-2, true, 'z'], true); - assertFromIndex(zzz, 'every', [-3, true, 'z'], true); - assertFromIndex(zzz, 'every', [-4, true, 'z'], true); - - // Regex - assertFromIndex(xyz, 'every', [0, /[yz]/], false); - assertFromIndex(xyz, 'every', [1, /[yz]/], true); - assertFromIndex(xyz, 'every', [2, /[yz]/], true); - assertFromIndex(xyz, 'every', [3, /[yz]/], true); - - // Function - assertFromIndex(xyz, 'every', [0, function(el) { return el === 'z'; }], false); - assertFromIndex(xyz, 'every', [1, function(el) { return el === 'z'; }], false); - assertFromIndex(xyz, 'every', [2, function(el) { return el === 'z'; }], true); - assertFromIndex(xyz, 'every', [3, function(el) { return el === 'z'; }], true); - - // Can still run against an array of true - assertFromIndex([true, true], 'every', [1, true, true], true); - - }); - - method('reduceFromIndex', function() { - - var xy = ['x','y']; - var xyz = ['x','y','z']; - - function addArgs(a, b) { - return a + b; - } - - raisesError(function() { run(arr, 'reduceFromIndex', [3, addArgs]); }, '3 index is no elements'); - - assertFromIndex(xyz, 'reduce', [0, addArgs], 'xyz', 'Reducing from 0'); - assertFromIndex(xyz, 'reduce', [1, addArgs], 'yz', 'Reducing from 1'); - assertFromIndex(xyz, 'reduce', [2, addArgs], 'z', 'Reducing from 2'); - - assertFromIndex(xyz, 'reduce', [-1, addArgs], 'z', 'Reducing from -1'); - assertFromIndex(xyz, 'reduce', [-2, addArgs], 'yz', 'Reducing from -2'); - assertFromIndex(xyz, 'reduce', [-3, addArgs], 'xyz', 'Reducing from -3'); - - assertFromIndex(xyz, 'reduce', [0, addArgs, 'I: '], 'I: xyz', 'Reducing from 0 with init'); - assertFromIndex(xyz, 'reduce', [1, addArgs, 'I: '], 'I: yz', 'Reducing from 1 with init'); - assertFromIndex(xyz, 'reduce', [2, addArgs, 'I: '], 'I: z', 'Reducing from 2 with init'); - - assertFromIndex(xyz, 'reduce', [-1, addArgs, 'I: '], 'I: z', 'Reducing from -1 with init'); - assertFromIndex(xyz, 'reduce', [-2, addArgs, 'I: '], 'I: yz', 'Reducing from -2 with init'); - assertFromIndex(xyz, 'reduce', [-3, addArgs, 'I: '], 'I: xyz', 'Reducing from -3 with init'); - - assertFromIndexArgs(xy, 'reduce', [0], ['x', 'y', 1]); - assertFromIndexArgs(xyz, 'reduce', [1], ['y', 'z', 2]); - assertFromIndexArgs(xyz, 'reduce', [2], null); - assertFromIndexArgs(xyz, 'reduce', [-1], null); - assertFromIndexArgs(xyz, 'reduce', [-2], ['y','z', 2]); - assertFromIndexArgs(xy, 'reduce', [-2], ['x','y', 1]); - assertFromIndexArgs(xy, 'reduce', [-3], ['x','y', 1]); - - }); - - method('reduceRightFromIndex', function() { - - var xy = ['x','y']; - var xyz = ['x','y','z']; - - function addArgs(a, b) { - return a + b; - } - - raisesError(function() { run([], 'reduceRightFromIndex', [ 0, addArgs]); }, 'no elements from 0'); - raisesError(function() { run([], 'reduceRightFromIndex', [ 1, addArgs]); }, 'no elements from 1'); - raisesError(function() { run([], 'reduceRightFromIndex', [-1, addArgs]); }, 'no elements from -1'); - raisesError(function() { run(xyz, 'reduceRightFromIndex', [-4, addArgs]); }, '-4 is no elements'); - raisesError(function() { run(xyz, 'reduceRightFromIndex', [-5, addArgs]); }, '-5 is no elements'); - - assertFromIndex(xyz, 'reduceRight', [0, addArgs], 'x', 'Reducing right from 0'); - assertFromIndex(xyz, 'reduceRight', [1, addArgs], 'yx', 'Reducing right from 1'); - assertFromIndex(xyz, 'reduceRight', [2, addArgs], 'zyx', 'Reducing right from 2'); - assertFromIndex(xyz, 'reduceRight', [3, addArgs], 'zyx', 'Reducing right from 3'); - - assertFromIndex(xyz, 'reduceRight', [-1, addArgs], 'zyx', 'Reducing right from -1'); - assertFromIndex(xyz, 'reduceRight', [-2, addArgs], 'yx', 'Reducing right from -2'); - assertFromIndex(xyz, 'reduceRight', [-3, addArgs], 'x', 'Reducing from -3'); - - assertFromIndex(xyz, 'reduceRight', [0, addArgs, 'I: '], 'I: x', 'Reducing right from 0 with init'); - assertFromIndex(xyz, 'reduceRight', [1, addArgs, 'I: '], 'I: yx', 'Reducing right from 1 with init'); - assertFromIndex(xyz, 'reduceRight', [2, addArgs, 'I: '], 'I: zyx', 'Reducing right from 2 with init'); - assertFromIndex(xyz, 'reduceRight', [3, addArgs, 'I: '], 'I: zyx', 'Reducing right from 3 with init'); - - assertFromIndex(xyz, 'reduceRight', [-1, addArgs, 'I: '], 'I: zyx', 'Reducing right from -1 with init'); - assertFromIndex(xyz, 'reduceRight', [-2, addArgs, 'I: '], 'I: yx', 'Reducing right from -2 with init'); - assertFromIndex(xyz, 'reduceRight', [-3, addArgs, 'I: '], 'I: x', 'Reducing right from -3 with init'); - assertFromIndex(xyz, 'reduceRight', [-4, addArgs, 'I: '], 'I: ', 'Reducing right from -4 with init'); - - assertFromIndexArgs(xy, 'reduceRight', [1], ['y', 'x', 1]); - assertFromIndexArgs(xyz, 'reduceRight', [1], ['y', 'x', 1]); - assertFromIndexArgs(xyz, 'reduceRight', [0], null); - assertFromIndexArgs(xy, 'reduceRight', [-1], ['y','x', 1]); - assertFromIndexArgs(xyz, 'reduceRight', [-2], ['y','x', 1]); - assertFromIndexArgs(xyz, 'reduceRight', [-3], ['x','y', 1]); - - }); - - method('findFromIndex', function() { - - var xyz = ['x','y','z']; - - // No looping, pos index - assertFromIndex(xyz, 'find', [0, 'y'], 'y'); - assertFromIndex(xyz, 'find', [1, 'y'], 'y'); - assertFromIndex(xyz, 'find', [2, 'y'], undefined); - assertFromIndex(xyz, 'find', [3, 'y'], undefined); - assertFromIndex(xyz, 'find', [4, 'y'], undefined); - - // No looping, neg index - assertFromIndex(xyz, 'find', [-1, 'y'], undefined); - assertFromIndex(xyz, 'find', [-2, 'y'], 'y'); - assertFromIndex(xyz, 'find', [-3, 'y'], 'y'); - assertFromIndex(xyz, 'find', [-4, 'y'], 'y'); - - // Looping, pos index - assertFromIndex(xyz, 'find', [0, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [1, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [2, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [3, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [4, true, 'y'], 'y'); - - // Looping, neg index - assertFromIndex(xyz, 'find', [-1, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [-2, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [-3, true, 'y'], 'y'); - assertFromIndex(xyz, 'find', [-4, true, 'y'], 'y'); - - // Looping, pos index, does not exist - assertFromIndex(xyz, 'find', [0, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [1, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [2, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [3, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [4, true, 'q'], undefined); - - // Looping, neg index, does not exist - assertFromIndex(xyz, 'find', [-1, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [-2, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [-3, true, 'q'], undefined); - assertFromIndex(xyz, 'find', [-4, true, 'q'], undefined); - - // Regex - assertFromIndex(xyz, 'find', [0, /[xy]/], 'x'); - assertFromIndex(xyz, 'find', [1, /[xy]/], 'y'); - assertFromIndex(xyz, 'find', [2, /[xy]/], undefined); - assertFromIndex(xyz, 'find', [3, /[xy]/], undefined); - - // Function - assertFromIndex(xyz, 'find', [0, function(el) { return el === 'y'; }], 'y'); - assertFromIndex(xyz, 'find', [1, function(el) { return el === 'y'; }], 'y'); - assertFromIndex(xyz, 'find', [2, function(el) { return el === 'y'; }], undefined); - assertFromIndex(xyz, 'find', [3, function(el) { return el === 'y'; }], undefined); - - // Moved from "findFrom" - - test([1,2,3], [0, function(e) { return e > 0; }], 1, 'greater than 0 from index 0'); - test([1,2,3], [1, function(e) { return e > 0; }], 2, 'greater than 0 from index 1'); - test([1,2,3], [2, function(e) { return e > 0; }], 3, 'greater than 0 from index 2'); - test([1,2,3], [3, function(e) { return e > 0; }], undefined, 'greater than 0 from index 3'); - test([1,2,3], [0, function(e) { return e > 1; }], 2, 'greater than 1 from index 0'); - test([1,2,3], [1, function(e) { return e > 1; }], 2, 'greater than 1 from index 1'); - test([1,2,3], [2, function(e) { return e > 1; }], 3, 'greater than 1 from index 2'); - test([1,2,3], [0, function(e) { return e > 2; }], 3, 'greater than 2 from index 0'); - test([1,2,3], [0, function(e) { return e > 3; }], undefined, 'greater than 3 from index 0'); - - test([1,2,3], [0, true, function(e) { return e > 0; }], 1, 'loop | greater than 0 from index 0'); - test([1,2,3], [1, true, function(e) { return e > 0; }], 2, 'loop | greater than 0 from index 1'); - test([1,2,3], [2, true, function(e) { return e > 0; }], 3, 'loop | greater than 0 from index 2'); - test([1,2,3], [3, true, function(e) { return e > 0; }], 1, 'loop | greater than 0 from index 3'); - test([1,2,3], [0, true, function(e) { return e > 1; }], 2, 'loop | greater than 1 from index 0'); - test([1,2,3], [1, true, function(e) { return e > 1; }], 2, 'loop | greater than 1 from index 1'); - test([1,2,3], [2, true, function(e) { return e > 1; }], 3, 'loop | greater than 1 from index 2'); - test([1,2,3], [0, true, function(e) { return e > 2; }], 3, 'loop | greater than 2 from index 0'); - test([1,2,3], [0, true, function(e) { return e > 3; }], undefined, 'loop | greater than 3 from index 0'); - - test([{a:10},{a:8},{a:3}], [0, function(e) { return e['a'] > 5; }], {a:10}, 'key "a" greater than 5'); - test([{a:10},{a:8},{a:3}], [1, function(e) { return e['a'] > 5; }], {a:8}, 'key "a" greater than 5 from index 1'); - test([{a:10},{a:8},{a:3}], [2, function(e) { return e['a'] > 5; }], undefined, 'key "a" greater than 5 from index 2'); - test([function() {}], [1, function(e) {}], undefined, 'null function from index 1'); - test([null, null], [1, null], null, 'null from index 1'); - test(threeUndefined, [1, undefined], undefined, 'undefined from index 1'); - - test(['foo','bar'], [1, /^[a-f]/], 'bar', '/a-f/ from index 1'); - test(['foo','bar','zak'], [2, true, /^[a-f]/], 'foo', '/a-f/ from index 1 looping'); - - }); - - method('findIndexFromIndex', function() { - - var xyz = ['x','y','z']; - - // No looping, pos index - assertFromIndex(xyz, 'findIndex', [0, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [1, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [2, 'y'], -1); - assertFromIndex(xyz, 'findIndex', [3, 'y'], -1); - assertFromIndex(xyz, 'findIndex', [4, 'y'], -1); - - // No looping, neg index - assertFromIndex(xyz, 'findIndex', [-1, 'y'], -1); - assertFromIndex(xyz, 'findIndex', [-2, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [-3, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [-4, 'y'], 1); - - // Looping, pos index - assertFromIndex(xyz, 'findIndex', [0, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [1, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [2, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [3, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [4, true, 'y'], 1); - - // Looping, neg index - assertFromIndex(xyz, 'findIndex', [-1, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [-2, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [-3, true, 'y'], 1); - assertFromIndex(xyz, 'findIndex', [-4, true, 'y'], 1); - - // Looping, pos index, does not exist - assertFromIndex(xyz, 'findIndex', [0, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [1, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [2, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [3, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [4, true, 'q'], -1); - - // Looping, neg index, does not exist - assertFromIndex(xyz, 'findIndex', [-1, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [-2, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [-3, true, 'q'], -1); - assertFromIndex(xyz, 'findIndex', [-4, true, 'q'], -1); - - // Regex - assertFromIndex(xyz, 'findIndex', [0, /[xy]/], 0); - assertFromIndex(xyz, 'findIndex', [1, /[xy]/], 1); - assertFromIndex(xyz, 'findIndex', [2, /[xy]/], -1); - assertFromIndex(xyz, 'findIndex', [3, /[xy]/], -1); - - // Function - assertFromIndex(xyz, 'findIndex', [0, function(el) { return el === 'y'; }], 1); - assertFromIndex(xyz, 'findIndex', [1, function(el) { return el === 'y'; }], 1); - assertFromIndex(xyz, 'findIndex', [2, function(el) { return el === 'y'; }], -1); - assertFromIndex(xyz, 'findIndex', [3, function(el) { return el === 'y'; }], -1); - - - // Moved from Array#findIndexFrom - - test(['a','b','c','b'], [2, 'b'], 3, 'finds first instance from index'); - test([5,2,4,4], [3, 4], 3, '4 in 5,2,4,4 from index 3'); - test([5,2,4,4], [10, 4], -1, '4 in 5,2,4,4 from index 10'); - test([5,2,4,4], [-10, 4], 2, '4 in 5,2,4,4 from index -10'); - test([5,2,4,4], [-1, 4], 3, '4 in 5,2,4,4 from index -1'); - - test(['a','b','c','b'], [1, true, 'b'], 1, 'finds first instance from index'); - test([5,2,4,4,7,0], [4, true, 4], 2, '4 in 5,2,4,4 from index 3'); - test([5,2,4,4,7,0], [10, true, 4], 2, '4 in 5,2,4,4 from index 10'); - test([5,2,4,4,7,0], [10, true, 8], -1, '8 in 5,2,4,4 from index 10'); - test([5,2,4,4,7,0], [-10, true, 4], 2, '4 in 5,2,4,4 from index -10'); - test([5,2,4,4,7,0], [-1, true, 4], 2, '4 in 5,2,4,4 from index -1'); - - }); - method('min', function() { test([12,87,55], 12, 'no argument'); From bbe53f7c4b1e00cc0cd263cba961444eb5fe0b4b Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 16:44:03 +0900 Subject: [PATCH 074/191] Added Array#min and Array#max --- src/array/define.js | 2 + src/array/find.js | 2 +- src/array/findIndex.js | 2 +- src/array/max.js | 43 +++++++++++ src/array/methods.js | 2 + src/array/min.js | 43 +++++++++++ test/OLD/tests/enumerable.js | 96 ------------------------ test/tests/array.js | 140 +++++++++++++++++++++++++++++++++++ 8 files changed, 232 insertions(+), 98 deletions(-) create mode 100644 src/array/max.js create mode 100644 src/array/min.js diff --git a/src/array/define.js b/src/array/define.js index d554f013e..264cd0264 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -11,6 +11,8 @@ defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); defineInstance('map', methods.map); +defineInstance('max', methods.max); +defineInstance('min', methods.min); defineInstance('median', methods.median); defineInstance('none', methods.none); defineInstance('remove', methods.remove); diff --git a/src/array/find.js b/src/array/find.js index a4fc99b7e..648993dea 100644 --- a/src/array/find.js +++ b/src/array/find.js @@ -15,7 +15,7 @@ import { forEachSparse } from '../util/array'; * @param {any} [context] - The `this` argument to be passed to the matching * function. * - * @returns {Array} + * @returns {any} * * @callback searchFn * diff --git a/src/array/findIndex.js b/src/array/findIndex.js index bb45403a6..6c731af7c 100644 --- a/src/array/findIndex.js +++ b/src/array/findIndex.js @@ -15,7 +15,7 @@ import { forEachSparse } from '../util/array'; * @param {any} [context] - The `this` argument to be passed to the matching * function. * - * @returns {Array} + * @returns {number} * * @callback searchFn * diff --git a/src/array/max.js b/src/array/max.js new file mode 100644 index 000000000..dba26bf22 --- /dev/null +++ b/src/array/max.js @@ -0,0 +1,43 @@ +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; + +/** + * Returns the element in the array with the highest value. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to compare. + * A function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. + * + * @returns {any} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].max(); -> 3 + * users.max((user) => user.votes) -> // user object with max votes + * users.max('votes') -> // user object with max votes + * users.max('profile.likes') -> // user object with max profile likes + * + **/ +export default function max(arr, map, context) { + assertArray(arr); + let max; + let found; + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + const val = mapper(el, i, arr); + if (i === 0 || val > max) { + max = val; + found = el; + } + }); + return found; +} diff --git a/src/array/methods.js b/src/array/methods.js index f59ca17ed..383bfa158 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -8,6 +8,8 @@ export { default as find } from './find'; export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; export { default as map } from './map'; +export { default as max } from './max'; +export { default as min } from './min'; export { default as median } from './median'; export { default as none } from './none'; export { default as remove } from './remove'; diff --git a/src/array/min.js b/src/array/min.js new file mode 100644 index 000000000..95fb961d3 --- /dev/null +++ b/src/array/min.js @@ -0,0 +1,43 @@ +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; + +/** + * Returns the element in the array with the lowest value. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to compare. + * A function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. + * + * @returns {any} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].min(); -> 1 + * users.min((user) => user.votes) -> // user object with min votes + * users.min('votes') -> // user object with min votes + * users.min('profile.likes') -> // user object with min profile likes + * + **/ +export default function min(arr, map, context) { + assertArray(arr); + let min; + let found; + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + const val = mapper(el, i, arr); + if (i === 0 || val < min) { + min = val; + found = el; + } + }); + return found; +} diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index a6f3b8c53..3df302ca0 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1,102 +1,6 @@ namespace('Array', function() { 'use strict'; - method('min', function() { - - test([12,87,55], 12, 'no argument'); - test([12,87,55], oneUndefined, 12, 'undefined'); - test([12,87,55], [null], 12, 'null'); - test([-12,-87,-55], -87, '-87'); - test([5,5,5], 5, '5 is uniqued'); - test(['a','b','c'], 'a', 'strings are not counted'); - test([], undefined, 'empty array'); - test([null], null, '[null]'); - test([{a:1,b:5},{a:2,b:5},{a:3,b:5}], [function(el) { return el['a']; }], {a:1,b:5}, 'key "a"'); - test([{a:1,b:5},{a:2,b:4},{a:3,b:3}], [function(el) { return el['b']; }], {a:3,b:3}, 'key "b", 1 found'); - test([{a:1,b:5},{a:3,b:3},{a:3,b:3}], [function(el) { return el['b']; }], {a:3,b:3}, 'key "b", 1 found'); - test([{a:1,b:3},{a:2,b:4},{a:3,b:3}], [function(el) { return el['b']; }], {a:1,b:3}, 'key "b", first found'); - test([{a:1,b:3},{a:2,b:4},{a:3,b:3}], [true, function(el) { return el['b']; }], [{a:1,b:3},{a:3,b:3}], 'key "b", 2 found'); - test([{a:-1,b:-5},{a:-2,b:-4},{a:-3,b:-3}], [function(el) { return el['b']; }], {a:-1,b:-5}, 'key "b", 1 found'); - test(['short','and','mort'], [function(el) { return el.length; }], 'and', 'length'); - test(['short','and','mort','fat'], [true, function(el) { return el.length; }], ['and','fat'], 'and,fat'); - test(['short','and','mort'], ['length'], 'and', 'length with shortcut'); - test(['short','and','mort'], [true, 'length'], ['and'], 'length with shortcut'); - test([12,12,12], [true, function(n) { return n; }], [12,12,12], 'should not unique'); - - var fn = function(el,i,a) { - equal(this, [1], 'scope should be the array'); - equal(i, 0, 'second param should be the index'); - equal(a, [1], 'third param should also be the array'); - return el; - } - run([1], 'min', [fn]); - - - raisesError(function() { run(threeUndefined, 'min'); }, 'should raise an error when comparing undefined'); - raisesError(function() { run(undefinedWith1, 'min'); }, 'should raise an error when comparing 1 to undefined'); - raisesError(function() { run([87,12,55], 'min', [4]); }, 'number not found in number, so undefined'); - - var arr = [ - {id:1,a:{b:{c:6}}}, - {id:2,a:{b:{c:6}}}, - {id:3,a:{b:{c:4}}}, - {id:4,a:{b:{c:4}}} - ]; - test(arr, ['a.b.c'], {id:3,a:{b:{c:4}}}, 'by deep dot operator'); - test(arr, [true, 'a.b.c'], [{id:3,a:{b:{c:4}}},{id:4,a:{b:{c:4}}}], 'by deep dot operator multiple'); - }); - - method('max', function() { - - test([12,87,55], 87, 'no argument'); - test([12,87,55], oneUndefined, 87, 'undefined'); - test([12,87,55], [null], 87, 'null'); - test([-12,-87,-55], -12, '-12'); - test([5,5,128], 128, '128'); - test([128,128,128], 128, '128 is uniqued'); - test(['a','b','c'], 'c', 'strings are not counted'); - test([], undefined, 'empty array'); - test([null], null, '[null]'); - test([{a:1,b:5},{a:2,b:5},{a:3,b:5}], [function(el) { return el['a']; }], {a:3,b:5}, 'key "a"'); - test([{a:1,b:5},{a:2,b:4},{a:3,b:3}], [function(el) { return el['b']; }], {a:1,b:5}, 'key "b" returns b:5'); - test([{a:1,b:3},{a:2,b:4},{a:3,b:3}], [function(el) { return el['b']; }], {a:2,b:4}, 'key "b" returns b:4'); - test([{a:1,b:3},{a:2,b:4},{a:2,b:4}], [function(el) { return el['b']; }], {a:2,b:4}, 'key "b" returns b:4 uniqued'); - test([{a:1,b:3},{a:2,b:1},{a:3,b:3}], [function(el) { return el['b']; }], {a:1,b:3}, 'key "b", first found'); - test([{a:1,b:3},{a:2,b:1},{a:3,b:3}], [true, function(el) { return el['b']; }], [{a:1,b:3},{a:3,b:3}], 'key "b", 2 found'); - test([{a:-1,b:-5},{a:-2,b:-4},{a:-3,b:-3}], [function(el) { return el['b']; }], {a:-3,b:-3}, 'key "b" returns b:-3'); - test(['short','and', 'mort'], [function(el) { return el.length; }], 'short', 'length'); - test(['short','and', 'morts', 'fat'], [true, function(el) { return el.length; }], ['short','morts'], 'short,morts'); - test([12,12,12], [true, function(n){ return n; }], [12,12,12], 'should not unique'); - - test([{foo:'bar'}], [], {foo:'bar'}, 'object passed should return itself'); - test([{foo:'bar'}], [true, 'foo'], [{foo:'bar'}], 'object passed with multiple returns array'); - - var fn = function(el,i,a) { - equal(this, [1], 'scope should be the array'); - equal(i, 0, 'second param should be the index'); - equal(a, [1], 'third param should also be the array'); - return el; - }; - run([1], 'max', [fn]); - - raisesError(function() { run(threeUndefined, 'max'); }, 'should raise an error when comparing undefined'); - raisesError(function() { run(undefinedWith1, 'max'); }, 'should raise an error when comparing 1 to undefined'); - raisesError(function() { run([87,12,55], 'max', [4]); }, 'number not found in number, so undefined'); - - var arr = [ - {id:1,a:{b:{c:6}}}, - {id:2,a:{b:{c:6}}}, - {id:3,a:{b:{c:4}}}, - {id:4,a:{b:{c:4}}} - ]; - test(arr, ['a.b.c'], {id:1,a:{b:{c:6}}}, 'by deep dot operator'); - test(arr, [true, 'a.b.c'], [{id:1,a:{b:{c:6}}},{id:2,a:{b:{c:6}}}], 'by deep dot operator multiple'); - - test(['one','two','three'], ['length'], 'three', 'Shold allow a string property'); - test(['','two','three'], ['length'], 'three', 'Shold allow an empty string'); - - }); - method('least', function() { diff --git a/test/tests/array.js b/test/tests/array.js index 1cdc2a933..1689160cd 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1122,4 +1122,144 @@ namespace('Array', function() { }); + describeInstance('min', function(min) { + + it('should work with no arguments', function() { + assertEqual(min([1,2,3]), 1); + assertEqual(min([0,0,0]), 0); + }); + + it('should allow a function mapper', function() { + assertEqual(min([1,2,3,4], (n) => 1 / n), 4); + }); + + it('should allow a string mapper', function() { + assertObjectEqual(min([{age:5},{age:2}], 'age'), {age:2}); + assertObjectEqual(min([{age:2},{age:5}], 'height'), {age:2}); + }); + + it('should handle deep properties', function() { + assertObjectEqual(min([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), { profile: { likes: 17 } }); + assertObjectEqual(min([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), { posts: [{ views: 12 }] }); + assertObjectEqual(min([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), { posts: [{ views: 12 }] }); + }); + + it('should handle infinite values', function() { + assertEqual(min([Infinity]), Infinity); + assertEqual(min([-Infinity]), -Infinity); + }); + + it('should pass correct params to callback', function() { + min(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + min(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(min([]), undefined); + assertEqual(min(['c','b','a']), 'a'); + assertEqual(min([null, false]), null); + assertError(function() { min(); }); + assertError(function() { min(null); }); + assertError(function() { min(1); }); + assertError(function() { min('a'); }); + }); + + }); + + describeInstance('max', function(max) { + + it('should work with no arguments', function() { + assertEqual(max([1,2,3]), 3); + assertEqual(max([0,0,0]), 0); + }); + + it('should allow a function mapper', function() { + assertEqual(max([1,2,3,4], (n) => 1 / n), 1); + }); + + it('should allow a string mapper', function() { + assertObjectEqual(max([{age:5},{age:2}], 'age'), {age:5}); + assertObjectEqual(max([{age:2},{age:5}], 'height'), {age:2}); + }); + + it('should handle deep properties', function() { + assertObjectEqual(max([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), { profile: { likes: 36 } }); + assertObjectEqual(max([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), { posts: [{ views: 97 }] }); + assertObjectEqual(max([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), { posts: [{ views: 97 }] }); + }); + + it('should handle infinite values', function() { + assertEqual(max([Infinity]), Infinity); + assertEqual(max([-Infinity]), -Infinity); + }); + + it('should pass correct params to callback', function() { + max(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + max(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertEqual(max([]), undefined); + assertEqual(max(['c','b','a']), 'c'); + assertEqual(max([null, false]), null); + assertError(function() { max(); }); + assertError(function() { max(null); }); + assertError(function() { max(1); }); + assertError(function() { max('a'); }); + }); + + }); + }); From 943d38875c84107c822dee313b8819f3c4ace4fe Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 31 Aug 2020 17:26:40 +0900 Subject: [PATCH 075/191] Added Array#shuffle and Array#sample --- CHANGELOG.md | 3 ++ src/array/define.js | 2 ++ src/array/methods.js | 2 ++ src/array/sample.js | 26 +++++++++++++++++ src/array/shuffle.js | 29 ++++++++++++++++++ test/OLD/tests/array.js | 63 --------------------------------------- test/tests/array.js | 65 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 127 insertions(+), 63 deletions(-) create mode 100644 src/array/sample.js create mode 100644 src/array/shuffle.js diff --git a/CHANGELOG.md b/CHANGELOG.md index c90105057..51a6ac7d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,9 @@ call `Function#lock` first in the chain to achieve the same effect. `filterFromIndex`, `someFromIndex`, `everyFromIndex`, `reduceFromIndex`, `reduceRightFromIndex`, `findFromIndex`, `findIndexFromIndex`. Use `Array#slice` here instead for similar functionality. +- Removed `Array#clone`. +- Removed `Array#sample` ability to return multiple samples. Run the function + multiple times instead. TODO: diff --git a/src/array/define.js b/src/array/define.js index 264cd0264..10b63efe0 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -16,5 +16,7 @@ defineInstance('min', methods.min); defineInstance('median', methods.median); defineInstance('none', methods.none); defineInstance('remove', methods.remove); +defineInstance('sample', methods.sample); +defineInstance('shuffle', methods.shuffle); defineInstance('some', methods.some); defineInstance('sum', methods.sum); diff --git a/src/array/methods.js b/src/array/methods.js index 383bfa158..ad3fa34ee 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -13,5 +13,7 @@ export { default as min } from './min'; export { default as median } from './median'; export { default as none } from './none'; export { default as remove } from './remove'; +export { default as sample } from './sample'; +export { default as shuffle } from './shuffle'; export { default as some } from './some'; export { default as sum } from './sum'; diff --git a/src/array/sample.js b/src/array/sample.js new file mode 100644 index 000000000..acf060388 --- /dev/null +++ b/src/array/sample.js @@ -0,0 +1,26 @@ +import { assertArray } from '../util/assertions'; + +/** + * Returns a random element from the array. + * + * @param {Array} arr - The array. + * @param {boolean} [remove = false] - When true the sampled element will be + * removed from the array. + * + * @returns {any} + * + * @example + * + * [1,2,3,4].sample() -> ? + * [1,2,3,4].sample(true) -> ? (returned value will be removed) + * + **/ +export default function sample(arr, remove = false) { + assertArray(arr); + const index = Math.floor(Math.random() * arr.length); + const el = arr[index]; + if (remove) { + arr.splice(index, 1); + } + return el; +} diff --git a/src/array/shuffle.js b/src/array/shuffle.js new file mode 100644 index 000000000..6aff5644f --- /dev/null +++ b/src/array/shuffle.js @@ -0,0 +1,29 @@ +import { assertArray } from '../util/assertions'; + +/** + * Returns a copy of the array with the elements randomized. + * + * @extra Uses Fisher-Yates algorithm. + * + * @param {Array} arr - The array. + * @returns {Array} + * + * @example + * + * [1,2,3,4].shuffle() -> [?,?,?,?] + * + **/ +export default function shuffle(arr) { + assertArray(arr); + arr = [...arr]; + let i = arr.length; + let j; + let x; + while(i) { + j = (Math.random() * i) | 0; + x = arr[--i]; + arr[i] = arr[j]; + arr[j] = x; + } + return arr; +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index cb0fd99d1..5ab778539 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -89,19 +89,6 @@ namespace('Array', function () { test([user1], [[user1, user2]], false, 'array of objects 1:2'); }); - method('clone', function() { - var arr = [1,2,3]; - var arr2 = run(arr, 'clone'); - equal(arr, arr2, 'should clone the array'); - arr2.splice(1, 1); - equal(arr, [1,2,3], 'original array should be untouched'); - - var arr = testGetSparseArray(5, 'a', 'b', 'c'); - arr[9] = 'd'; - test(arr, arr, 'should correctly clone a sparse array'); - - }); - method('add', function() { test([], [], [], 'nothing'); @@ -628,56 +615,6 @@ namespace('Array', function () { }); - method('shuffle', function() { - var arr = run([1,2,3,4,5,6,7,8,9,10], 'shuffle'); - var fn = function(i) { - return arr[i]; - } - assertRandomized(arr, fn); - }); - - method('sample', function() { - var arr = [1,2,3,4,5,6,7,8,9,10]; - var fn = function(i) { - return run(arr, 'sample'); - } - assertRandomized(arr, fn); - - equal(typeof run(arr, 'sample'), 'number', 'no params'); - equal(run(arr, 'sample', [1]).length, 1, '1'); - equal(run(arr, 'sample', [2]).length, 2, '2'); - equal(run(arr, 'sample', [3]).length, 3, '3'); - equal(run(arr, 'sample', [4]).length, 4, '4'); - equal(run(arr, 'sample', [11]).length, 10, "can't sample more than the length of the array"); - - var arr2 = run(run(arr, 'sample', [10]), 'unique'); - equal(arr2.length, arr.length, "should not sample the same element twice"); - - equal(run(arr, 'sample', [0]).length, 0, '0'); - - - var arr = [1,2,3,4]; - var result = run(arr, 'sample', [true]) - equal(typeof result , 'number', 'should have returned single number'); - equal(arr.length, 3, 'should have removed 1 element'); - - var arr = [1,2,3,4]; - var result = run(arr, 'sample', [0, true]) - equal(result.length, 0, 'should have returned 0 sampled elements'); - equal(arr.length, 4, 'should have removed 0 elements'); - - var arr = [1,2,3,4]; - var result = run(arr, 'sample', [1, true]) - equal(result.length, 1, 'should have returned 1 sampled element'); - equal(arr.length, 3, 'should have removed 1 element'); - - var arr = [1,2,3,4]; - var result = run(arr, 'sample', [2, true]) - equal(result.length, 2, 'should have returned 2 sampled elements'); - equal(arr.length, 2, 'should have removed 2 elements'); - - }); - method('zip', function() { test([1, 2, 3], [[1], [2], [3]], 'one array'); test([1, 2, 3], [[4, 5, 6]], [[1, 4], [2, 5], [3, 6]], 'two arrays'); diff --git a/test/tests/array.js b/test/tests/array.js index 1689160cd..f92a502b3 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1262,4 +1262,69 @@ namespace('Array', function() { }); + describeInstance('shuffle', function(shuffle) { + + function assertRandomized(arr, fn) { + var result = fn(arr); + assertTrue(result.some(function(el, i) { + return el !== arr[i]; + })); + } + + it('should randomize a basic array', function() { + assertRandomized([1,2,3,4,5,6,7,8,9,10], function (arr) { + return shuffle(arr); + }); + }); + + it('should handle irregular input', function() { + assertArrayEqual(shuffle([]), []); + assertError(function() { shuffle(); }); + assertError(function() { shuffle(null); }); + assertError(function() { shuffle(1); }); + assertError(function() { shuffle('a'); }); + }); + + }); + + describeInstance('sample', function(sample) { + + function assertRandom(arr, fn) { + var last; + var equal = true; + for (var i = 0; i < 10; i++) { + var result = fn(arr); + if (i === 0) { + last = result; + } else if (result !== last) { + equal = false; + } + } + assertFalse(equal); + } + + it('should sample from a basic array', function() { + assertRandom([1,2,3,4,5,6,7,8,9,10], function (arr) { + return sample(arr); + }); + }); + + it('should optionally allow removal from the array', function() { + var arr = [1,2,3,4,5,6,7,8,9,10]; + var len = arr.length; + var sampled = sample(arr, true); + assertFalse(arr.some(function(el) { return el === sampled; })); + assertEqual(arr.length, len - 1); + }); + + it('should handle irregular input', function() { + assertEqual(sample([]), undefined); + assertError(function() { sample(); }); + assertError(function() { sample(null); }); + assertError(function() { sample(1); }); + assertError(function() { sample('a'); }); + }); + + }); + }); From befff8f42529dc0a877e7d70ff515be8b0b85e94 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 1 Sep 2020 14:55:38 +0900 Subject: [PATCH 076/191] Removed Array#least/most and Object.least/most --- CHANGELOG.md | 1 + test/OLD/tests/enumerable.js | 139 ----------------------------------- 2 files changed, 1 insertion(+), 139 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51a6ac7d7..7f1c46cf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,7 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `Array#clone`. - Removed `Array#sample` ability to return multiple samples. Run the function multiple times instead. +- Removed `Array#least` and `Array#most`. TODO: diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 3df302ca0..5bda0e95a 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -1,118 +1,3 @@ -namespace('Array', function() { - 'use strict'; - - - method('least', function() { - - var fn, arr; - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' } - ]; - - test([1,2,3], [], 1, 'null'); - test([1,2,3], [null], 1, 'null'); - test([1,2,3], oneUndefined, 1, 'undefined'); - test([1,2,3], [4], 1, 'number'); - - test(people, people[0], 'contains mary | does not return most'); - - fn = function(person) { - return person.age; - } - arr = run(people, 'least', [true, fn]); - arr.sort(function(a, b) { - return a.name > b.name; - }); - assertArrayEquivalent(arr, [people[1], people[2]], 'contains mary and ronnie'); - - arr.sort(function(a, b) { - return a.age - b.age; - }); - equal(arr, [{name:'ronnie',age:13,hair:'brown'}, {name:'mary',age:52,hair:'blonde'}], 'age and sorted by age'); - - test(people, [function(person) { return person.hair; }], people[0], 'hair'); - notEqual(run(people, 'least', [function(person) { return person.age; }]).age, 27, 'map age | does not return most'); - - test([], undefined, 'empty array'); - test([1,2,3], 1, '1,2,3'); - test([1,2,3,3], 1, '1,2,3,3'); - test([1,2,3,3], [true, function(n){ return n; }], [1,2], '1,2,3,3 | all'); - test([1,1,2,3,3], 2, '1,1,2,3,3'); - test([1,1,1,2,2,3,3,3], 2, '1,1,1,2,2,3,3,3'); - test(['a','b','c'], 'a', 'a,b,c'); - test(['a','b','c','c'], 'a', 'a,b,c,c'); - test(['a','b','c','c'], [true, function(n) { return n; }], ['a','b'], 'a,b,c,c | all'); - test(['a','a','b','c','c'], 'b', 'a,a,b,c,c'); - - fn = function(el,i,a) { - equal(this, [1], 'scope should be the array'); - equal(i, 0, 'second param should be the index'); - equal(a, [1], 'third param should also be the array'); - return el; - }; - run([1], 'least', [fn]); - - var arr = [ - {id:1,a:{b:{c:6}}}, - {id:2,a:{b:{c:4}}}, - {id:3,a:{b:{c:4}}}, - {id:4,a:{b:{c:4}}} - ]; - test(arr, ['a.b.c'], {id:1,a:{b:{c:6}}}, 'by deep dot operator'); - test(arr, [true, 'a.b.c'], [{id:1,a:{b:{c:6}}}], 'by deep dot operator multiple'); - - }); - - method('most', function() { - var people = [ - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'ronnie', age: 13, hair: 'brown' }, - { name: 'edmund', age: 27, hair: 'blonde' } - ]; - - test([1,2,3], [null], 1, 'null | returns first'); - test([1,2,3], oneUndefined, 1, 'undefined | returns first'); - test([1,2,3], [4], 1, 'number | returns first'); - - equal(run(people, 'most', [function(person) { return person.age; }]).age, 27, 'age | age is 27'); - test(people, [true, function(person) { return person.age; }], [{name:'jim',age:27,hair:'brown'},{name:'edmund',age:27,hair:'blonde'}], 'age | returns all'); - test(people, [function(person) { return person.hair; }], {name:'jim',age:27,hair:'brown'}, 'hair'); - - test([], undefined, 'empty array'); - test([1,2,3], 1, '1,2,3'); - test([1,2,3,3], 3, '1,2,3,3'); - test([1,1,2,3,3], 1, '1,1,2,3,3 | first'); - test([1,1,2,3,3], [true, function(n) { return n; }], [1,1,3,3], '1,1,2,3,3 | all'); - test(['a','b','c'], 'a', 'a,b,c'); - test(['a','b','c','c'], 'c', 'a,b,c,c'); - test(['a','a','b','c','c'], 'a', 'a,a,b,c,c | first'); - test(['a','a','b','c','c'], [true, function(s){ return s; }], ['a','a','c','c'], 'a,a,b,c,c | all'); - - var fn = function(el,i,a) { - equal(this, [1], 'scope should be the array'); - equal(i, 0, 'second param should be the index'); - equal(a, [1], 'third param should also be the array'); - return el; - }; - run([1], 'most', [fn]); - - var arr = [ - {id:1,a:{b:{c:6}}}, - {id:2,a:{b:{c:4}}}, - {id:3,a:{b:{c:4}}}, - {id:4,a:{b:{c:4}}} - ]; - test(arr, ['a.b.c'], {id:2,a:{b:{c:4}}}, 'by deep dot operator'); - test(arr, [true, 'a.b.c'], [{id:2,a:{b:{c:4}}},{id:3,a:{b:{c:4}}},{id:4,a:{b:{c:4}}}], 'by deep dot operator multiple'); - - }); - -}); - namespace('Object', function() { 'use strict'; @@ -336,30 +221,6 @@ namespace('Object', function() { test([{age:2},{age:4}], [true, 'age'], {'1':{age:4}}, 'all | called on arrays returns object'); }); - method('least', function() { - test(obj3, [], 'foo', 'no args is least of values'); - test(obj3, [function(val, key) { return val; }], 'foo', 'return value'); - test(obj3, [function(val, key) { return key.length; }], 'blue', 'return key.length'); - test(obj4, ['age'], 'bar', 'accepts a string shortcut'); - test(obj3, [true, function(val, key) { return val; }], {foo:2}, 'all | return value'); - test(obj3, [true, function(val, key) { return key.length; }], {blue:4}, 'all | return key.length'); - test(obj4, [true, 'age'], {bar: {age:22},moo:{age:33},car:{age:44}}, 'all | accepts a string shortcut'); - test(deepObj4, [true, 'user.age'], {bar:{user:{age:22}},moo:{user:{age:33}},car:{user:{age:44}}}, 'all | accepts a deep string shortcut'); - }); - - method('most', function() { - test(obj3, [], 'bar', 'no args is most of values'); - test(obj3, [function(val, key) { return val; }], 'bar', 'return value'); - test(obj3, [function(val, key) { return key.length; }], 'foo', 'return key.length'); - test(obj3, [function(val, key) { return key.charCodeAt(0); }], 'bar', 'return the char code of first letter'); - test(obj4, ['age'], 'foo', 'accepts a string shortcut'); - test(obj3, [true, function(val, key) { return val; }], {bar:4,blue:4,moo:6,car:6}, 'all | return value'); - test(obj3, [true, function(val, key) { return key.length; }], {foo:2,bar:4,moo:6,car:6}, 'all | return key.length'); - test(obj3, [true, function(val, key) { return key.charCodeAt(0); }], {bar: 4,blue:4}, 'all | return the char code of first letter'); - test(obj4, [true, 'age'], {foo: {age:11},blue:{age:11}}, 'all | accepts a string shortcut'); - test(deepObj4, [true, 'user.age'], {foo:{user:{age:11}},blue:{user:{age:11}}}, 'all | accepts a deep string shortcut'); - }); - method('count', function() { test(obj1, [function(val, key) { return key == 'foo'; }], 1, 'key is foo'); test(obj1, [function(val, key) { return key.length > 3; }], 0, 'key length is greater than 3'); From b86bdae6ee8417d10e372a2da9d579244f4d5f57 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 1 Sep 2020 16:27:25 +0900 Subject: [PATCH 077/191] Added Object.mapKeys and Object.mapValues. --- CHANGELOG.md | 2 + src/object/define.js | 5 ++ src/object/index.js | 2 + src/object/mapKeys.js | 39 +++++++++ src/object/mapValues.js | 38 +++++++++ src/object/methods.js | 2 + src/util/assertions.js | 7 ++ src/util/deepProperties.js | 4 +- src/util/mappers.js | 32 +++++-- src/util/matchers.js | 10 ++- src/util/object.js | 4 +- src/util/serialize.js | 4 +- src/util/typeChecks.js | 3 +- test/OLD/tests/enumerable.js | 32 ------- test/index.html | 1 + test/index.js | 1 + test/tests/array.js | 26 +++--- test/tests/object.js | 158 +++++++++++++++++++++++++++++++++++ 18 files changed, 311 insertions(+), 59 deletions(-) create mode 100644 src/object/define.js create mode 100644 src/object/mapKeys.js create mode 100644 src/object/mapValues.js create mode 100644 src/object/methods.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f1c46cf2..be27af867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,8 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `Array#sample` ability to return multiple samples. Run the function multiple times instead. - Removed `Array#least` and `Array#most`. +- Changed `Object.map` to be `Object.mapValues` with an equivalent `Objecxt.mapKeys`. +- Changed `Object` method callbacks to pass key first. TODO: diff --git a/src/object/define.js b/src/object/define.js new file mode 100644 index 000000000..fa903cb7a --- /dev/null +++ b/src/object/define.js @@ -0,0 +1,5 @@ +import { defineInstance } from '../core/object'; +import * as methods from './methods'; + +defineInstance('mapKeys', methods.mapKeys); +defineInstance('mapValues', methods.mapValues); diff --git a/src/object/index.js b/src/object/index.js index 5732819a8..88a18beef 100644 --- a/src/object/index.js +++ b/src/object/index.js @@ -1 +1,3 @@ export * from '../core/object'; +export * from './methods'; +import './define'; diff --git a/src/object/mapKeys.js b/src/object/mapKeys.js new file mode 100644 index 000000000..2d4287583 --- /dev/null +++ b/src/object/mapKeys.js @@ -0,0 +1,39 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getObjectMapper } from '../util/mappers'; + +/** + * Creates a new object with keys that are the result of each enumerable + * property running against a mapping function. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the keys to be mapped. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {Object} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.mapKeys({1:{name:'John'},2:{name:'Frank'}}, (key, val) => val.name) + * Object.mapKeys({1:{name:'John'},2:{name:'Frank'}}, 'name') + * + **/ +export default function mapKeys(obj, map) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Map parameter required'); + } + const mapper = getObjectMapper(map); + const result = {}; + forEachProperty(obj, (key, val) => { + key = mapper(key, val, obj); + result[key] = val; + }); + return result; +} diff --git a/src/object/mapValues.js b/src/object/mapValues.js new file mode 100644 index 000000000..20b4b0918 --- /dev/null +++ b/src/object/mapValues.js @@ -0,0 +1,38 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getObjectMapper } from '../util/mappers'; + +/** + * Creates a new object with values that are the result of each enumerable + * property running against a mapping function. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the values to be mapped. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {Object} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.mapValues({1:{name:'John'},2:{name:'Frank'}}, (key, val) => val.name) + * Object.mapValues({1:{name:'John'},2:{name:'Frank'}}, 'name') + * + **/ +export default function mapValues(obj, map) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Map parameter required'); + } + const mapper = getObjectMapper(map); + const result = {}; + forEachProperty(obj, (key, val) => { + result[key] = mapper(key, val, obj); + }); + return result; +} diff --git a/src/object/methods.js b/src/object/methods.js new file mode 100644 index 000000000..8d575a90c --- /dev/null +++ b/src/object/methods.js @@ -0,0 +1,2 @@ +export { default as mapKeys } from './mapKeys'; +export { default as mapValues } from './mapValues'; diff --git a/src/util/assertions.js b/src/util/assertions.js index 92416e8eb..2ac8b95b8 100644 --- a/src/util/assertions.js +++ b/src/util/assertions.js @@ -1,5 +1,6 @@ import { isArray, + isObject, isString, isNumber, isFunction, @@ -89,6 +90,12 @@ export function assertArray(obj) { } } +export function assertObject(obj) { + if (!isObject(obj)) { + throw new TypeError('Object required'); + } +} + export function assertWritable(obj) { if (isPrimitive(obj)) { // If strict mode is active then primitives will throw an diff --git a/src/util/deepProperties.js b/src/util/deepProperties.js index e1d75558a..58c3cf18a 100644 --- a/src/util/deepProperties.js +++ b/src/util/deepProperties.js @@ -1,4 +1,4 @@ -import { isString, isObjectType } from './typeChecks'; +import { isString, isObject } from './typeChecks'; import { isDefined, hasOwnProperty } from './helpers'; import { assertArray, assertWritable } from './assertions'; @@ -23,7 +23,7 @@ function handleDeepProperty(obj, key, has, fill, fillLast, val) { ns = obj; if (key == null) return; - if (isObjectType(key)) { + if (isObject(key)) { // Allow array and array-like accessors bs = [key]; } else { diff --git a/src/util/mappers.js b/src/util/mappers.js index 48fd378d8..c69883b19 100644 --- a/src/util/mappers.js +++ b/src/util/mappers.js @@ -1,17 +1,33 @@ import { isFunction, isArray } from './typeChecks'; import { deepGetProperty } from './deepProperties'; +export function getObjectMapper(obj) { + if (isFunction(obj)) { + return getFunctionMapper(obj); + } else if (obj) { + return getObjectPropertyMapper(String(obj)); + } + return defaultMapper; +} + export function getMapper(obj, context) { if (isFunction(obj)) { - return obj.bind(context); + return getFunctionMapper(obj, context); } else if (isArray(obj)) { return getArrayMapper(obj); } else if (obj) { - return getPropertyMapper(obj); + return getArrayPropertyMapper(String(obj)); } return defaultMapper; } +function getFunctionMapper(fn, context = null) { + if (context) { + fn = fn.bind(context); + } + return fn; +} + function getArrayMapper(obj) { const mappers = obj.map((el) => { return getMapper(el); @@ -23,12 +39,18 @@ function getArrayMapper(obj) { }; } -function getPropertyMapper(str) { +function getArrayPropertyMapper(str) { return (el) => { return deepGetProperty(el, str); }; } -function defaultMapper(el) { - return el; +function getObjectPropertyMapper(str) { + return (key, val) => { + return deepGetProperty(val, str); + }; +} + +function defaultMapper(obj) { + return obj; } diff --git a/src/util/matchers.js b/src/util/matchers.js index ef93cec83..d1c69f415 100644 --- a/src/util/matchers.js +++ b/src/util/matchers.js @@ -1,4 +1,10 @@ -import { isPrimitive, isRegExp, isDate, isFunction, isObjectType } from './typeChecks'; +import { + isPrimitive, + isObject, + isDate, + isRegExp, + isFunction, +} from './typeChecks'; import { forEachProperty } from './helpers'; export function getMatcher(obj, context) { @@ -45,7 +51,7 @@ function getDefaultMatcher(obj) { function getFuzzyMatcher(obj) { const matchers = new Map(); return (el, i, arr) => { - if (!isObjectType(el)) { + if (!isObject(el)) { return false; } let matched = true; diff --git a/src/util/object.js b/src/util/object.js index 853eb0626..96d940e2b 100644 --- a/src/util/object.js +++ b/src/util/object.js @@ -1,9 +1,9 @@ -import { isObjectType } from './typeChecks'; +import { isObject } from './typeChecks'; import { hasOwnProperty, forEachProperty } from './helpers'; import { isClass } from './class'; export function isPlainObject(obj, classTag) { - return isObjectType(obj) + return isObject(obj) && isClass(obj, 'Object', classTag) && hasValidPlainObjectPrototype(obj) && hasOwnEnumeratedProperties(obj); diff --git a/src/util/serialize.js b/src/util/serialize.js index e09d99c69..c74deedb4 100644 --- a/src/util/serialize.js +++ b/src/util/serialize.js @@ -1,4 +1,4 @@ -import { isPrimitive, isObjectType, isRealNaN } from '../typeChecks'; +import { isPrimitive, isObject, isRealNaN } from '../typeChecks'; import { isSerializable, iterateWithCyclicCheck } from './object'; import { classToString } from './class'; @@ -30,7 +30,7 @@ export function serialize(obj, refs, stack) { refs.push(obj); } return ref; - } else if (isObjectType(obj)) { + } else if (isObject(obj)) { value = serializeDeep(obj, refs, stack) + obj.toString(); } else if (obj.valueOf) { value = obj.valueOf(); diff --git a/src/util/typeChecks.js b/src/util/typeChecks.js index c206a3a23..3689c8bef 100644 --- a/src/util/typeChecks.js +++ b/src/util/typeChecks.js @@ -35,7 +35,8 @@ export function isRealNaN(obj) { return obj != null && obj !== obj; } -export function isObjectType(obj, type) { +export function isObject(obj, type) { + // Protect against null. return !!obj && (type || typeof obj) === 'object'; } diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 5bda0e95a..464d28f83 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -26,38 +26,6 @@ namespace('Object', function() { var obj4 = testClone(obj2); obj4['blue'] = {age:11}; var deepObj4 = testClone(deepObj2); deepObj4['blue'] = {user:{age:11}}; - method('map', function() { - var obj1 = { - foo: 3, - bar: 4, - moo: 5, - car: 6 - } - - var obj2 = { - foo: { age: 11 }, - bar: { age: 22 }, - moo: { age: 33 }, - car: { age: 44 } - } - - test(obj1, [function(val, key) { return val * 2; }], {foo:6,bar:8,moo:10,car:12}, 'function'); - test(obj1, ['toString'], {foo:'3',bar:'4',moo:'5',car:'6'}, 'string shortcut'); - test(obj1, [], obj1, 'no args'); - test(obj2, [function(val, key) { return val.age; }], {foo:11,bar:22,moo:33,car:44}, 'mapping nested properties'); - test(obj2, ['age'], {foo:11,bar:22,moo:33,car:44}, 'mapping nested properties with string shortcut'); - - var obj = { - foo:{a:{b:{c:11}}}, - bar:{a:{b:{c:22}}}, - moo:{a:{b:{c:33}}}, - car:{a:{b:{c:44}}} - } - - test(obj, ['a.b.c'], {foo:11,bar:22,moo:33,car:44}, 'mapping shortcut can go deep with dot syntax'); - - }); - method('forEach', function() { var fn = function() {}; diff --git a/test/index.html b/test/index.html index a656d35cf..61e67a86e 100644 --- a/test/index.html +++ b/test/index.html @@ -22,6 +22,7 @@ + diff --git a/test/index.js b/test/index.js index e8a5fa63d..1607bdbea 100644 --- a/test/index.js +++ b/test/index.js @@ -26,6 +26,7 @@ require('./tests/chainable'); require('./tests/extended'); require('./tests/array'); require('./tests/number'); +require('./tests/object'); require('./tests/string'); require('./tests/regexp'); require('./tests/function'); diff --git a/test/tests/array.js b/test/tests/array.js index f92a502b3..b5de401f5 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -233,7 +233,7 @@ namespace('Array', function() { assertArrayEqual(remove([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'James'}]); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { remove(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -305,7 +305,7 @@ namespace('Array', function() { assertArrayEqual(exclude([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'James'}]); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { exclude(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -414,7 +414,7 @@ namespace('Array', function() { ); }); - it('should be able to pass context', function() { + it('should pass correct params', function() { map(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -480,7 +480,7 @@ namespace('Array', function() { assertEqual(some([{name:'Frank'},{name:'James'}], {name: /^[N-Z]/}), false); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { some(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -553,7 +553,7 @@ namespace('Array', function() { assertEqual(none([{name:'Frank'},{name:'James'}], {name: /^[N-Z]/}), true); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { none(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -627,7 +627,7 @@ namespace('Array', function() { assertEqual(every([{name:'Frank'},{name:'James'}], {name: /^[A-J]/}), true); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { every(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -703,7 +703,7 @@ namespace('Array', function() { assertArrayEqual(filter([{a:'a'},{a:'b'}], new Foo(/b/)), [{a:'b'}]); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { filter(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -768,7 +768,7 @@ namespace('Array', function() { assertObjectEqual(find([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), {name:'Frank'}); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { find(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -833,7 +833,7 @@ namespace('Array', function() { assertEqual(findIndex([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), 0); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { findIndex(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -903,7 +903,7 @@ namespace('Array', function() { assertEqual(count([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), 1); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { count(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -969,7 +969,7 @@ namespace('Array', function() { ], 'posts.0.views'), 189); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { sum(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -1161,7 +1161,7 @@ namespace('Array', function() { assertEqual(min([-Infinity]), -Infinity); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { min(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -1231,7 +1231,7 @@ namespace('Array', function() { assertEqual(max([-Infinity]), -Infinity); }); - it('should pass correct params to callback', function() { + it('should pass correct params', function() { max(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); diff --git a/test/tests/object.js b/test/tests/object.js index e69de29bb..6fd26bdb1 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -0,0 +1,158 @@ +'use strict'; + +namespace('Object', function () { + + describeInstance('mapKeys', function (mapKeys) { + + it('should map basic object keys', () => { + assertObjectEqual( + mapKeys({ a: 1, b: 2 }, (key) => key + '1'), + { a1: 1, b1: 2 } + ); + }); + + it('should be able to map by string shortcut', () => { + assertObjectEqual( + mapKeys( + { + a: { name: 'John' }, + b: { name: 'Fred' }, + }, + 'name' + ), + { + John: { name: 'John' }, + Fred: { name: 'Fred' }, + } + ); + }); + + it('should handle deep properties', () => { + assertObjectEqual( + mapKeys( + { + a: { profile: { name: 'John' } }, + b: { profile: { name: 'Fred' } }, + }, + 'profile.name' + ), + { + John: { profile: { name: 'John' } }, + Fred: { profile: { name: 'Fred' } }, + } + ); + }); + + it('should handle empty objects', () => { + const obj = {}; + const empty = mapKeys(obj, () => {}); + assertFalse(obj === empty); + assertObjectEqual(obj, empty); + }); + + it('should pass correct params', function () { + mapKeys({ a: 1 }, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, { a: 1 }); + }); + }); + + it('should handle irregular input', () => { + assertError(() => { + mapKeys({ a: 1 }); + }); + assertError(() => { + mapKeys(null); + }); + assertError(() => { + mapKeys(NaN); + }); + assertError(() => { + mapKeys(1); + }); + assertError(() => { + mapKeys('1'); + }); + }); + }); + + describeInstance('mapValues', function (mapValues) { + + it('should map basic object values', () => { + assertObjectEqual( + mapValues({ a: 1, b: 2 }, (key) => key), + { a: 'a', b: 'b' } + ); + assertObjectEqual( + mapValues({ a: 1, b: 2 }, (key, val) => val * 2), + { a: 2, b: 4 } + ); + }); + + it('should be able to map by string shortcut', () => { + assertObjectEqual( + mapValues( + { + a: { name: 'John' }, + b: { name: 'Fred' }, + }, + 'name' + ), + { + a: 'John', + b: 'Fred', + } + ); + }); + + it('should handle deep properties', () => { + assertObjectEqual( + mapValues( + { + a: { profile: { name: 'John' } }, + b: { profile: { name: 'Fred' } }, + }, + 'profile.name' + ), + { + a: 'John', + b: 'Fred', + } + ); + }); + + it('should handle empty objects', () => { + const obj = {}; + const empty = mapValues(obj, () => {}); + assertFalse(obj === empty); + assertObjectEqual(obj, empty); + }); + + it('should pass correct params', function () { + mapValues({ a: 1 }, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, { a: 1 }); + }); + }); + + it('should handle irregular input', () => { + assertError(() => { + mapValues({ a: 1 }); + }); + assertError(() => { + mapValues(null); + }); + assertError(() => { + mapValues(NaN); + }); + assertError(() => { + mapValues(1); + }); + assertError(() => { + mapValues('1'); + }); + }); + }); +}); From ef50d1d73e80be58da344740140f5eba6c1d56d1 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 1 Sep 2020 16:36:57 +0900 Subject: [PATCH 078/191] Added Object.forEach --- src/object/define.js | 1 + src/object/forEach.js | 29 +++++++++++++++++++++++ src/object/methods.js | 1 + test/OLD/tests/enumerable.js | 42 --------------------------------- test/tests/object.js | 45 ++++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 42 deletions(-) create mode 100644 src/object/forEach.js diff --git a/src/object/define.js b/src/object/define.js index fa903cb7a..917c245bf 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -1,5 +1,6 @@ import { defineInstance } from '../core/object'; import * as methods from './methods'; +defineInstance('forEach', methods.forEach); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); diff --git a/src/object/forEach.js b/src/object/forEach.js new file mode 100644 index 000000000..67bfbef54 --- /dev/null +++ b/src/object/forEach.js @@ -0,0 +1,29 @@ +import { assertObject, assertFunction } from '../util/assertions'; + +/** + * Iterates over each enumerable, non-inherited property of the object. + * + * @param {Object} obj - The object. + * @param {eachFn} fn - The function to be called for each iteration. + * + * @returns {undefined} + * + * @callback eachFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.forEach({a:1,b:2}); -> Iterates over each property. + * + **/ +export default function forEach(obj, fn) { + assertObject(obj); + assertFunction(fn); + for (let [key, val] of Object.entries(obj)) { + fn(key, val, obj); + } +} + diff --git a/src/object/methods.js b/src/object/methods.js index 8d575a90c..f42e103d5 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -1,2 +1,3 @@ +export { default as forEach } from './forEach'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 464d28f83..dc10772db 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -26,48 +26,6 @@ namespace('Object', function() { var obj4 = testClone(obj2); obj4['blue'] = {age:11}; var deepObj4 = testClone(deepObj2); deepObj4['blue'] = {user:{age:11}}; - method('forEach', function() { - - var fn = function() {}; - var d = new Date(); - var obj = { - number: 3, - person: 'jim', - date: d, - func: fn - }; - - var keys = ['number','person','date','func']; - var values = [3, 'jim', d, fn]; - var count = 0; - var callback = function(val, key, o) { - equal(key, keys[count], 'accepts a function'); - equal(val, values[count], 'accepts a function'); - equal(o, obj, 'accepts a function | object is third param'); - count++; - } - var result = run(obj, 'forEach', [callback]); - equal(count, 4, 'accepts a function | iterated properly'); - equal(result, obj, 'accepts a function | result should equal object passed in'); - - raisesError(function(){ - run({foo:'bar'}, 'forEach', []); - }, 'no iterator raises an error'); - - test(obj, [function() {}], obj, 'each returns itself'); - - var count = 0; - var callback = function() { count++; return false; } - run({foo:'bar',moo:'bap'}, 'forEach', [callback]); - equal(count, 2, 'returning false should not break the loop'); - - var count = 0; - var callback = function() { count++; return false; } - run({toString:1,valueOf:2,hasOwnProperty:3}, 'forEach', [callback]); - equal(count, 3, 'returning false with dontenum properties'); - - }); - method('some', function() { var xyz = {x:'x',y:'y',z:'z'}; diff --git a/test/tests/object.js b/test/tests/object.js index 6fd26bdb1..9c9b8c55d 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -155,4 +155,49 @@ namespace('Object', function () { }); }); }); + + describeInstance('forEach', function (forEach) { + + it('should iterate over an object', () => { + let count = 0; + forEach({ a: 1, b: 2, c: 3 }, (key, val) => { + count += val; + }); + assertEqual(count, 6); + }); + + it('should handle empty objects', () => { + let iterated = false; + forEach({}, (key, val) => { + iterated = true; + }); + assertFalse(iterated); + }); + + it('should pass correct params', function () { + forEach({ a: 1 }, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, { a: 1 }); + }); + }); + + it('should handle irregular input', () => { + assertError(() => { + forEach({ a: 1 }); + }); + assertError(() => { + forEach(null); + }); + assertError(() => { + forEach(NaN); + }); + assertError(() => { + forEach(1); + }); + assertError(() => { + forEach('1'); + }); + }); + }); }); From 97af3c3b1232529536febcd30784854809954d12 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 1 Sep 2020 17:32:13 +0900 Subject: [PATCH 079/191] Added Object.some --- src/array/exclude.js | 1 - src/array/some.js | 4 +- src/object/define.js | 1 + src/object/mapKeys.js | 6 +-- src/object/mapValues.js | 6 +-- src/object/methods.js | 1 + src/object/some.js | 39 +++++++++++++++++++ src/util/mappers.js | 39 +++++++------------ src/util/matchers.js | 57 +++++++++++++++------------ test/tests/object.js | 86 ++++++++++++++++++++++++++++++++++++++++- 10 files changed, 180 insertions(+), 60 deletions(-) create mode 100644 src/object/some.js diff --git a/src/array/exclude.js b/src/array/exclude.js index 769b583dd..6d524f9de 100644 --- a/src/array/exclude.js +++ b/src/array/exclude.js @@ -37,7 +37,6 @@ import { assertArray } from '../util/assertions'; **/ export default function exclude(arr, match, context) { assertArray(arr); - const result = []; const matcher = getMatcher(match, context); return arr.filter((el, i) => { return !matcher(el, i, arr); diff --git a/src/array/some.js b/src/array/some.js index 7f0b5fabf..069b0560c 100644 --- a/src/array/some.js +++ b/src/array/some.js @@ -7,7 +7,7 @@ const nativeFn = Array.prototype.some; * Returns true if any element in the array matches input. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to determine elements that will be + * @param {any|searchFn} match - A matcher to determine how elements are * checked. When a function is passed a truthy return value will match the * element. Primitives will directly match elements. Can also be a Date object * to match dates, a RegExp which will test against strings, or a plain object @@ -22,7 +22,7 @@ const nativeFn = Array.prototype.some; * * ['a','b','c'].some('a') -> true * ['a','b','c'].some('d') -> false - * ['a','b','c'].some(/a-f/) -> true + * ['a','b','c'].some(/[a-f]/) -> true * users.some(function(user) { * return user.age > 30; * }); -> true if any user is older than 30 diff --git a/src/object/define.js b/src/object/define.js index 917c245bf..f4c4c13ad 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -4,3 +4,4 @@ import * as methods from './methods'; defineInstance('forEach', methods.forEach); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); +defineInstance('some', methods.some); diff --git a/src/object/mapKeys.js b/src/object/mapKeys.js index 2d4287583..f4f5dbbf2 100644 --- a/src/object/mapKeys.js +++ b/src/object/mapKeys.js @@ -1,6 +1,6 @@ import { assertObject } from '../util/assertions'; import { forEachProperty } from '../util/helpers'; -import { getObjectMapper } from '../util/mappers'; +import { getMapper } from '../util/mappers'; /** * Creates a new object with keys that are the result of each enumerable @@ -29,10 +29,10 @@ export default function mapKeys(obj, map) { if (arguments.length === 1) { throw new Error('Map parameter required'); } - const mapper = getObjectMapper(map); + const mapper = getMapper(map); const result = {}; forEachProperty(obj, (key, val) => { - key = mapper(key, val, obj); + key = mapper(val, key, obj); result[key] = val; }); return result; diff --git a/src/object/mapValues.js b/src/object/mapValues.js index 20b4b0918..64124d927 100644 --- a/src/object/mapValues.js +++ b/src/object/mapValues.js @@ -1,6 +1,6 @@ import { assertObject } from '../util/assertions'; import { forEachProperty } from '../util/helpers'; -import { getObjectMapper } from '../util/mappers'; +import { getMapper } from '../util/mappers'; /** * Creates a new object with values that are the result of each enumerable @@ -29,10 +29,10 @@ export default function mapValues(obj, map) { if (arguments.length === 1) { throw new Error('Map parameter required'); } - const mapper = getObjectMapper(map); + const mapper = getMapper(map); const result = {}; forEachProperty(obj, (key, val) => { - result[key] = mapper(key, val, obj); + result[key] = mapper(val, key, obj); }); return result; } diff --git a/src/object/methods.js b/src/object/methods.js index f42e103d5..8c07641d4 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -1,3 +1,4 @@ export { default as forEach } from './forEach'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; +export { default as some } from './some'; diff --git a/src/object/some.js b/src/object/some.js new file mode 100644 index 000000000..b463a56e0 --- /dev/null +++ b/src/object/some.js @@ -0,0 +1,39 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Returns true if any value in the object matches input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match the value. + * Primitives will directly match values. Can also be a Date object to match + * dates, a RegExp which will test against strings, or a plain object which will + * perform a "fuzzy match" on specific properties. Values of a fuzzy match can + * be any of the matcher types listed above. + * + * @returns {boolean} + * + * @example + * + * Object.some({a:1,b:2}, 1) -> true + * Object.some({a:1,b:2}, 3) -> false + * Object.some({a:'a',b:'b'}, /[a-f]) -> true + * Object.some(usersById, user => { + * return user.age > 30; + * }); -> true if any user is older than 30 + * + **/ +export default function some(obj, match) { + assertObject(obj); + const matcher = getMatcher(match); + let result = false; + forEachProperty(obj, (key, val) => { + if (matcher(val, key, obj)) { + result = true; + } + return !result; + }); + return result; +} diff --git a/src/util/mappers.js b/src/util/mappers.js index c69883b19..74f0279b5 100644 --- a/src/util/mappers.js +++ b/src/util/mappers.js @@ -1,52 +1,41 @@ import { isFunction, isArray } from './typeChecks'; import { deepGetProperty } from './deepProperties'; -export function getObjectMapper(obj) { - if (isFunction(obj)) { - return getFunctionMapper(obj); - } else if (obj) { - return getObjectPropertyMapper(String(obj)); - } - return defaultMapper; -} - export function getMapper(obj, context) { if (isFunction(obj)) { return getFunctionMapper(obj, context); } else if (isArray(obj)) { return getArrayMapper(obj); } else if (obj) { - return getArrayPropertyMapper(String(obj)); + return getPropertyMapper(String(obj)); } return defaultMapper; } -function getFunctionMapper(fn, context = null) { - if (context) { - fn = fn.bind(context); - } - return fn; +function getFunctionMapper(fn, context) { + return (val, key, obj) => { + if (isArray(obj)) { + return fn.call(context || obj, val, key, obj); + } else { + return fn.call(context || obj, key, val, obj); + } + }; } + function getArrayMapper(obj) { const mappers = obj.map((el) => { return getMapper(el); }); - return (el) => { + return (val) => { return mappers.map((mapper) => { - return mapper(el); + return mapper(val); }); }; } -function getArrayPropertyMapper(str) { - return (el) => { - return deepGetProperty(el, str); - }; -} - -function getObjectPropertyMapper(str) { - return (key, val) => { +function getPropertyMapper(str) { + return (val) => { return deepGetProperty(val, str); }; } diff --git a/src/util/matchers.js b/src/util/matchers.js index d1c69f415..ac1515251 100644 --- a/src/util/matchers.js +++ b/src/util/matchers.js @@ -1,63 +1,70 @@ import { - isPrimitive, + isArray, isObject, isDate, isRegExp, isFunction, + isPrimitive, } from './typeChecks'; import { forEachProperty } from './helpers'; -export function getMatcher(obj, context) { - if (!isPrimitive(obj)) { - if (isRegExp(obj)) { - return getRegexMatcher(obj); - } else if (isDate(obj)) { - return getDateMatcher(obj); - } else if (isFunction(obj)) { - return getFunctionMatcher(obj, context); +export function getMatcher(arg, context) { + if (!isPrimitive(arg)) { + if (isRegExp(arg)) { + return getRegexMatcher(arg); + } else if (isDate(arg)) { + return getDateMatcher(arg); + } else if (isFunction(arg)) { + return getFunctionMatcher(arg, context); } else { - return getFuzzyMatcher(obj); + return getFuzzyMatcher(arg); } } - return getDefaultMatcher(obj); + return getDefaultMatcher(arg); } function getRegexMatcher(reg) { - return (el) => { - return reg.test(el); + return (val) => { + return reg.test(val); }; } function getDateMatcher(date) { const time = date.getTime(); - return (el) => { - return isDate(el) && el.getTime() == time; + return (val) => { + return isDate(val) && val.getTime() == time; }; } function getFunctionMatcher(fn, context) { - return (el, i, arr) => { + return (val, key, obj) => { // Return true up front if match by reference - return el === fn || fn.call(context || arr, el, i, arr); + if (val === fn) { + return true; + } else if (isArray(obj)) { + return fn.call(context || obj, val, key, obj); + } else { + return fn.call(context || obj, key, val, obj); + } }; } function getDefaultMatcher(obj) { - return (el) => { - return el === obj; + return (val) => { + return val === obj; }; } -function getFuzzyMatcher(obj) { +function getFuzzyMatcher(matcher) { const matchers = new Map(); - return (el, i, arr) => { - if (!isObject(el)) { + return (val, key, obj) => { + if (!isObject(val)) { return false; } let matched = true; - forEachProperty(obj, (key, val) => { - matchers[key] = matchers[key] || getMatcher(val); - if (matchers[key].call(arr, el[key], i, arr) === false) { + forEachProperty(matcher, (mKey, mVal) => { + matchers[mKey] = matchers[mKey] || getMatcher(mVal); + if (matchers[mKey](val[mKey], mKey, obj) === false) { matched = false; } return matched; diff --git a/test/tests/object.js b/test/tests/object.js index 9c9b8c55d..ed0afb734 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -168,7 +168,7 @@ namespace('Object', function () { it('should handle empty objects', () => { let iterated = false; - forEach({}, (key, val) => { + forEach({}, () => { iterated = true; }); assertFalse(iterated); @@ -200,4 +200,88 @@ namespace('Object', function () { }); }); }); + + describeInstance('some', function(some) { + + it('should match by primitive matchers', function() { + assertEqual(some({a:'a',b:'b'}, 'a'), true); + assertEqual(some({a:'a',b:'b'}, 'd'), false); + assertEqual(some({a:1,b:2}, 7), false); + assertEqual(some({a:true,b:false}, true), true); + assertEqual(some({a:false,b:false}, true), false); + }); + + it('should match by regex', function() { + assertEqual(some({a:'a',b:'b'}, /[ac]/), true); + assertEqual(some({a:'a',b:'b'}, /[AC]/), false); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(some({a:d1,b:d2}, new Date(2020, 7, 28)), true); + assertEqual(some({a:d1,b:d2}, new Date(2020, 7, 30)), false); + }); + + it('should match by function', function() { + assertEqual(some({a:1,b:2}, (key, n) => n % 2 === 0), true); + assertEqual(some({a:2,b:4}, (key, n) => n % 2 === 1), false); + assertEqual(some({a:1,b:2}, (key, n) => n > 5), false); + assertEqual(some({a:1,b:2}, (key, n) => n > 1), true); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(some({a:fn1, b:fn2}, fn2), true); + assertEqual(some({a:fn1}, fn2), false); + }); + + it('should match by fuzzy matching', function() { + assertEqual( + some({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + true + ); + assertEqual(some({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Bob'}), + false + ); + assertEqual(some({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-F]/}), + true + ); + assertEqual(some({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[N-Z]/}), + false + ); + }); + + it('should pass correct params', function() { + some({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(some({a:1}, null), false); + assertEqual(some({a:1}, NaN), false); + assertError(function() { some(null); }); + assertError(function() { some('a'); }); + assertError(function() { some(1); }); + }); + + }); }); From 46436df1f1b3aeb70e414e6207ddcc8c63d7c778 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Wed, 2 Sep 2020 13:12:49 +0900 Subject: [PATCH 080/191] Added Object.every --- src/object/define.js | 1 + src/object/every.js | 42 +++++++++++++++++ src/object/methods.js | 1 + src/object/some.js | 3 ++ test/OLD/tests/enumerable.js | 39 ---------------- test/tests/object.js | 90 ++++++++++++++++++++++++++++++++++++ 6 files changed, 137 insertions(+), 39 deletions(-) create mode 100644 src/object/every.js diff --git a/src/object/define.js b/src/object/define.js index f4c4c13ad..e2b52abfc 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -1,6 +1,7 @@ import { defineInstance } from '../core/object'; import * as methods from './methods'; +defineInstance('every', methods.every); defineInstance('forEach', methods.forEach); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); diff --git a/src/object/every.js b/src/object/every.js new file mode 100644 index 000000000..17381b9f1 --- /dev/null +++ b/src/object/every.js @@ -0,0 +1,42 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Returns true if all values in the object match input. + * + * @param {Array} arr - The array. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match the value. + * Primitives will directly match values. Can also be a Date object to match + * dates, a RegExp which will test against strings, or a plain object which will + * perform a "fuzzy match" on specific properties. Values of a fuzzy match can + * be any of the matcher types listed above. + * + * @returns {boolean} + * + * @example + * + * Object.every({a:1,b:2}, 1) -> false + * Object.every({a:1,b:1}, 1) -> true + * Object.every({a:'a',b:'b'}, /[a-f]) -> true + * Object.every(usersById, user => { + * return user.age > 30; + * }); -> true if all users are older than 30 + * + **/ +export default function every(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + const matcher = getMatcher(match); + let result = true; + forEachProperty(obj, (key, val) => { + if (!matcher(val, key, obj)) { + result = false; + } + return result; + }); + return result; +} diff --git a/src/object/methods.js b/src/object/methods.js index 8c07641d4..e8174091f 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -1,3 +1,4 @@ +export { default as every } from './every'; export { default as forEach } from './forEach'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; diff --git a/src/object/some.js b/src/object/some.js index b463a56e0..fafc7d25a 100644 --- a/src/object/some.js +++ b/src/object/some.js @@ -27,6 +27,9 @@ import { getMatcher } from '../util/matchers'; **/ export default function some(obj, match) { assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } const matcher = getMatcher(match); let result = false; forEachProperty(obj, (key, val) => { diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index dc10772db..cbd3a39af 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -26,45 +26,6 @@ namespace('Object', function() { var obj4 = testClone(obj2); obj4['blue'] = {age:11}; var deepObj4 = testClone(deepObj2); deepObj4['blue'] = {user:{age:11}}; - method('some', function() { - - var xyz = {x:'x',y:'y',z:'z'}; - - test(obj1, [function(val, key) { return key == 'foo'; }], true, 'key is foo'); - test(obj1, [function(val, key, o) { - equal(val, obj1[key], 'first argument is the value'); - equal(typeof key, 'string', 'second argument is the key'); - equal(o, obj1, 'third argument is the original object'); - equal(this, obj1, '"this" is the original object'); - return true; - }], true, 'placeholder for callback arguments'); - test(obj1, [function(val, key) { return key == 'foo'; }], true, 'key is foo'); - test(obj1, [function(val, key) { return key.length > 3; }], false, 'key length is greater than 3'); - test(obj1, [function(val, key) { return key.length > 0; }], true, 'key length is greater than 0'); - test(obj1, [function(val, key) { return val > 0; }], true, 'value is greater than 0'); - test(obj1, [function(val, key) { return val > 5; }], true, 'value is greater than 5'); - test(obj1, [function(val, key) { return val > 6; }], false, 'value is greater than 6'); - test(obj1, [2], true, 'shortcut | 2'); - test(obj1, [7], false, 'shortcut | 7'); - - var count = 0; - var callback = function() { count++; return true; } - run(xyz, 'some', [callback]); - equal(count, 1, 'using return value to break out of the loop'); - - }); - - method('every', function() { - test(obj1, [function(val, key) { return key == 'foo'; }], false, 'key is foo'); - test(obj1, [function(val, key) { return key.length > 3; }], false, 'key length is greater than 3'); - test(obj1, [function(val, key) { return key.length > 0; }], true, 'key length is greater than 0'); - test(obj1, [function(val, key) { return val > 0; }], true, 'value is greater than 0'); - test(obj1, [function(val, key) { return val > 5; }], false, 'value is greater than 5'); - test(obj1, [function(val, key) { return val > 6; }], false, 'value is greater than 6'); - test(obj1, [2], false, 'shortcut | 2'); - test(obj1, [7], false, 'shortcut | 7'); - }); - method('find', function() { test(obj1, [function(val, key) { return key == 'foo'; }], 'foo', 'key is foo'); test(obj1, [function(val, key) { return key.length > 3; }], undefined, 'key length is greater than 3'); diff --git a/test/tests/object.js b/test/tests/object.js index ed0afb734..8430ccfd5 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -278,10 +278,100 @@ namespace('Object', function () { it('should handle irregular input', function() { assertEqual(some({a:1}, null), false); assertEqual(some({a:1}, NaN), false); + assertError(function() { some({}); }); assertError(function() { some(null); }); assertError(function() { some('a'); }); assertError(function() { some(1); }); }); }); + + describeInstance('every', function(every) { + + it('should match by primitive matchers', function() { + assertEqual(every({a:'a',b:'b'}, 'c'), false); + assertEqual(every({a:'a',b:'b'}, 'a'), false); + assertEqual(every({a:'a',b:'a'}, 'a'), true); + assertEqual(every({a:1,b:2}, 3), false); + assertEqual(every({a:1,b:2}, 2), false); + assertEqual(every({a:1,b:1}, 1), true); + assertEqual(every({a:true,b:false}, true), false); + assertEqual(every({a:true,b:true}, true), true); + }); + + it('should match by regex', function() { + assertEqual(every({a:'a',b:'b'}, /[ac]/), false); + assertEqual(every({a:'a',b:'b'}, /[a-c]/), true); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(every({a:d1,b:d2}, new Date(2020, 7, 28)), false); + assertEqual(every({a:d1,b:d1}, new Date(2020, 7, 28)), true); + }); + + it('should match by function', function() { + assertEqual(every({a:1,b:2}, (key, n) => n % 2 === 0), false); + assertEqual(every({a:2,b:4}, (key, n) => n % 2 === 0), true); + assertEqual(every({a:1,b:2}, (key, n) => n > 5), false); + assertEqual(every({a:1,b:2}, (key, n) => n > 0), true); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(every({a:fn1, b:fn2}, fn2), false); + assertEqual(every({a:fn1, b:fn1}, fn1), true); + }); + + it('should match by fuzzy matching', function() { + assertEqual( + every({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + false + ); + assertEqual(every({ + 1:{ name:'Frank'}, + 2:{ name:'Frank'}, + }, {name:'Frank'}), + true + ); + assertEqual(every({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-J]/}), + true + ); + assertEqual(every({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[G-Z]/}), + false + ); + }); + + it('should pass correct params', function() { + every({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(every({a:1}, null), false); + assertEqual(every({a:1}, NaN), false); + assertError(function() { every({}); }); + assertError(function() { every(null); }); + assertError(function() { every('a'); }); + assertError(function() { every(1); }); + }); + + }); + }); From 2e393897cce1159fa9a231b3a7d9954590b01ebf Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Wed, 2 Sep 2020 14:19:00 +0900 Subject: [PATCH 081/191] Added: Object.findKey Object.exclude Object.excludeValues Object.remove Object.removeValues Object.filter Object.filterValues --- CHANGELOG.md | 4 + src/object/define.js | 7 + src/object/every.js | 12 +- src/object/exclude.js | 29 +++ src/object/excludeValues.js | 41 +++ src/object/filter.js | 29 +++ src/object/filterValues.js | 41 +++ src/object/findKey.js | 42 ++++ src/object/methods.js | 7 + src/object/remove.js | 31 +++ src/object/removeValues.js | 44 ++++ src/object/some.js | 12 +- test/OLD/tests/enumerable.js | 25 -- test/OLD/tests/object.js | 70 ------ test/tests/object.js | 471 +++++++++++++++++++++++++++++++++++ 15 files changed, 758 insertions(+), 107 deletions(-) create mode 100644 src/object/exclude.js create mode 100644 src/object/excludeValues.js create mode 100644 src/object/filter.js create mode 100644 src/object/filterValues.js create mode 100644 src/object/findKey.js create mode 100644 src/object/remove.js create mode 100644 src/object/removeValues.js diff --git a/CHANGELOG.md b/CHANGELOG.md index be27af867..6b73ce664 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,10 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `Array#least` and `Array#most`. - Changed `Object.map` to be `Object.mapValues` with an equivalent `Objecxt.mapKeys`. - Changed `Object` method callbacks to pass key first. +- Renamed `Object.find` to `Object.findKey`. +- `Object.filter` now filters by key. Equivalent is now `Object.filterValues`. +- `Object.remove` now removes by key. Equivalent is now `Object.removeValues`. +- `Object.exclude` now excludes by key. Equivalent is now `Object.excludeValues`. TODO: diff --git a/src/object/define.js b/src/object/define.js index e2b52abfc..9bddbb502 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -2,7 +2,14 @@ import { defineInstance } from '../core/object'; import * as methods from './methods'; defineInstance('every', methods.every); +defineInstance('exclude', methods.exclude); +defineInstance('excludeValues', methods.excludeValues); +defineInstance('filter', methods.filter); +defineInstance('filterValues', methods.filterValues); +defineInstance('findKey', methods.findKey); defineInstance('forEach', methods.forEach); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); +defineInstance('remove', methods.remove); +defineInstance('removeValues', methods.removeValues); defineInstance('some', methods.some); diff --git a/src/object/every.js b/src/object/every.js index 17381b9f1..583fa50ec 100644 --- a/src/object/every.js +++ b/src/object/every.js @@ -5,13 +5,13 @@ import { getMatcher } from '../util/matchers'; /** * Returns true if all values in the object match input. * - * @param {Array} arr - The array. + * @param {Object} obj - The object. * @param {any|searchFn} match - A matcher to determine how values are checked. - * When a function is passed a truthy return value will match the value. - * Primitives will directly match values. Can also be a Date object to match - * dates, a RegExp which will test against strings, or a plain object which will - * perform a "fuzzy match" on specific properties. Values of a fuzzy match can - * be any of the matcher types listed above. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. * * @returns {boolean} * diff --git a/src/object/exclude.js b/src/object/exclude.js new file mode 100644 index 000000000..677000445 --- /dev/null +++ b/src/object/exclude.js @@ -0,0 +1,29 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; + +/** + * Returns a new object with keys not matching input. + * + * @param {Object} obj - The object. + * @param {...string|Array} - The keys to be excluded. May be an array. + * + * @returns {Object} + * + * @example + * + * Object.exclude({a:1,b:2}, 'a') -> {b:2} + * Object.exclude({a:1,b:2}, 'a', 'b') -> {} + * Object.exclude({a:1,b:1}, ['a', 'b']) -> {} + * + **/ +export default function exclude(obj, ...args) { + assertObject(obj); + args = args.flat(); + const result = {}; + forEachProperty(obj, (key, val) => { + if (!args.includes(key)) { + result[key] = val; + } + }); + return result; +} diff --git a/src/object/excludeValues.js b/src/object/excludeValues.js new file mode 100644 index 000000000..3404f27aa --- /dev/null +++ b/src/object/excludeValues.js @@ -0,0 +1,41 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Returns a new object without properties matching input. + * + * @param {Object} obj - The object. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {Object} + * + * @example + * + * Object.excludeValues({a:1,b:2}, 1) -> {b:2} + * Object.excludeValues({a:1,b:1}, 3) -> {a:1,b:1} + * Object.excludeValues({a:'a',b:'b'}, /[a-f]) -> {} + * Object.excludeValues(usersById, user => { + * return user.age > 30; + * }); -> an object with all users under 30 + * + **/ +export default function excludeValues(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + const matcher = getMatcher(match); + const result = {}; + forEachProperty(obj, (key, val) => { + if (!matcher(val, key, obj)) { + result[key] = val; + } + }); + return result; +} diff --git a/src/object/filter.js b/src/object/filter.js new file mode 100644 index 000000000..b20075d46 --- /dev/null +++ b/src/object/filter.js @@ -0,0 +1,29 @@ +import { assertObject } from '../util/assertions'; +import { hasOwnProperty } from '../util/helpers'; + +/** + * Returns a new object with keys matching input. + * + * @param {Object} obj - The object. + * @param {...string|Array} - The keys to be included. May be an array. + * + * @returns {Object} + * + * @example + * + * Object.filter({a:1,b:2}, 'a') -> {a:1} + * Object.filter({a:1,b:2}, 'a', 'b') -> {a:1,b:2} + * Object.filter({a:1,b:1}, ['a', 'b']) -> {a:1,b:2} + * + **/ +export default function filter(obj, ...args) { + assertObject(obj); + args = args.flat(); + const result = {}; + for (let arg of args) { + if (hasOwnProperty(obj, arg)) { + result[arg] = obj[arg]; + } + } + return result; +} diff --git a/src/object/filterValues.js b/src/object/filterValues.js new file mode 100644 index 000000000..f42278403 --- /dev/null +++ b/src/object/filterValues.js @@ -0,0 +1,41 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Returns a new object with properties matching input. + * + * @param {Object} obj - The object. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {Object} + * + * @example + * + * Object.filterValues({a:1,b:2}, 1) -> {a:1} + * Object.filterValues({a:1,b:1}, 3) -> {} + * Object.filterValues({a:'a',b:'b'}, /[a-f]) -> {a:'a',b:'b'} + * Object.filterValues(usersById, user => { + * return user.age > 30; + * }); -> an object with all users over 30 + * + **/ +export default function filterValues(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + const matcher = getMatcher(match); + const result = {}; + forEachProperty(obj, (key, val) => { + if (matcher(val, key, obj)) { + result[key] = val; + } + }); + return result; +} diff --git a/src/object/findKey.js b/src/object/findKey.js new file mode 100644 index 000000000..c91b25fab --- /dev/null +++ b/src/object/findKey.js @@ -0,0 +1,42 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Returns the first key whose value matches input. + * + * @param {Object} obj - The object. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {string|undefined} + * + * @example + * + * Object.findKey({a:1,b:2}, 1) -> 'a' + * Object.findKey({a:1,b:1}, 3) -> undefined + * Object.findKey({a:'a',b:'b'}, /[a-f]) -> 'a' + * Object.findKey(usersById, user => { + * return user.age > 30; + * }); -> the id of the first user older than 30 + * + **/ +export default function findKey(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + const matcher = getMatcher(match); + let found; + forEachProperty(obj, (key, val) => { + if (matcher(val, key, obj)) { + found = key; + } + return !found; + }); + return found; +} diff --git a/src/object/methods.js b/src/object/methods.js index e8174091f..8209a6e59 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -1,5 +1,12 @@ export { default as every } from './every'; +export { default as exclude } from './exclude'; +export { default as excludeValues } from './excludeValues'; +export { default as filter } from './filter'; +export { default as filterValues } from './filterValues'; +export { default as findKey } from './findKey'; export { default as forEach } from './forEach'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; +export { default as remove } from './remove'; +export { default as removeValues } from './removeValues'; export { default as some } from './some'; diff --git a/src/object/remove.js b/src/object/remove.js new file mode 100644 index 000000000..eb91cbcc2 --- /dev/null +++ b/src/object/remove.js @@ -0,0 +1,31 @@ +import { assertObject } from '../util/assertions'; +import { hasOwnProperty } from '../util/helpers'; + +/** + * Returns a new object with keys not matching input. + * + * @extra This method will modify the object! For a non-destructive alias, use + * `exclude`. + * + * @param {Object} obj - The object. + * @param {...string|Array} - The keys to be removed. May be an array. + * + * @returns {Object} + * + * @example + * + * Object.remove({a:1,b:2}, 'a') -> {b:2} + * Object.remove({a:1,b:2}, 'a', 'b') -> {} + * Object.remove({a:1,b:1}, ['a', 'b']) -> {} + * + **/ +export default function remove(obj, ...args) { + assertObject(obj); + args = args.flat(); + for (let arg of args) { + if (hasOwnProperty(obj, arg)) { + delete obj[arg]; + } + } + return obj; +} diff --git a/src/object/removeValues.js b/src/object/removeValues.js new file mode 100644 index 000000000..73422b3ee --- /dev/null +++ b/src/object/removeValues.js @@ -0,0 +1,44 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Returns a new object without properties matching input. + * + * @extra This method will modify the object! For a non-destructive alias, use + * `excludeValues`. + * + * @param {Object} obj - The object. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {Object} + * + * @example + * + * Object.removeValues({a:1,b:2}, 1) -> {b:2} + * Object.removeValues({a:1,b:1}, 3) -> {a:1,b:1} + * Object.removeValues({a:'a',b:'b'}, /[a-f]) -> {} + * Object.removeValues(usersById, user => { + * return user.age > 30; + * }); -> an object with all users under 30 + * + **/ +export default function removeValues(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + const matcher = getMatcher(match); + forEachProperty(obj, (key, val) => { + if (matcher(val, key, obj)) { + delete obj[key]; + } + }); + return obj; +} + diff --git a/src/object/some.js b/src/object/some.js index fafc7d25a..14acd50fb 100644 --- a/src/object/some.js +++ b/src/object/some.js @@ -5,13 +5,13 @@ import { getMatcher } from '../util/matchers'; /** * Returns true if any value in the object matches input. * - * @param {Array} arr - The array. + * @param {Object} obj - The object. * @param {any|searchFn} match - A matcher to determine how values are checked. - * When a function is passed a truthy return value will match the value. - * Primitives will directly match values. Can also be a Date object to match - * dates, a RegExp which will test against strings, or a plain object which will - * perform a "fuzzy match" on specific properties. Values of a fuzzy match can - * be any of the matcher types listed above. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. * * @returns {boolean} * diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index cbd3a39af..4711efd85 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -26,31 +26,6 @@ namespace('Object', function() { var obj4 = testClone(obj2); obj4['blue'] = {age:11}; var deepObj4 = testClone(deepObj2); deepObj4['blue'] = {user:{age:11}}; - method('find', function() { - test(obj1, [function(val, key) { return key == 'foo'; }], 'foo', 'key is foo'); - test(obj1, [function(val, key) { return key.length > 3; }], undefined, 'key length is greater than 3'); - test(obj1, [function(val, key) { return key.length > 0; }], 'foo', 'key length is greater than 0'); - test(obj1, [function(val, key) { return val > 0; }], 'foo', 'value is greater than 0'); - test(obj1, [function(val, key) { return val > 5; }], 'moo', 'value is greater than 5'); - test(obj1, [function(val, key) { return val > 6; }], undefined, 'value is greater than 6'); - test(obj1, [2], 'foo', 'shortcut | 2'); - test(obj1, [7], undefined, 'shortcut | 7'); - test({foo:'bar'}, [/b/], 'foo', 'uses multi-match'); - }); - - method('filter', function() { - test(obj1, [function(val, key) { return key == 'foo'; }], {foo:2}, 'key is foo'); - test(obj1, [function(val, key) { return key.length > 3; }], {}, 'key length is greater than 3'); - test(obj1, [function(val, key) { return key.length > 0; }], obj1, 'key length is greater than 0'); - test(obj1, [function(val, key) { return val > 0; }], obj1, 'value is greater than 0'); - test(obj1, [function(val, key) { return val > 5; }], {moo:6,car:6}, 'value is greater than 5'); - test(obj1, [function(val, key) { return val > 6; }], {}, 'value is greater than 6'); - test(obj1, [2], {foo:2}, 'shortcut | 2'); - test(obj1, [7], {}, 'shortcut | 7'); - test({foo:'bar',moo:'car'}, [/a/], {foo:'bar',moo:'car'}, 'uses multi-match'); - test(obj2, [{age:11}], {foo:{age:11}}, 'shortcut | object matcher'); - }); - method('sum', function() { test(obj1, [], 18, 'no args is sum of values'); test(obj1, [function(val, key) { return val; }], 18, 'should sum values'); diff --git a/test/OLD/tests/object.js b/test/OLD/tests/object.js index 7cf4fd828..afc0180b0 100644 --- a/test/OLD/tests/object.js +++ b/test/OLD/tests/object.js @@ -2066,76 +2066,6 @@ namespace('Object', function () { }); - method('remove', function() { - - var obj = {foo:1,bar:2}; - var result = run(obj, 'remove', [1]); - equal(obj, {bar:2}, 'Property should have been deleted'); - equal(result === obj, true, 'Should have returned the object'); - - test({a:'a'}, [], {a:'a'}, 'no argument should do nothing'); - test({one:'a',two:'a'}, ['a'], {}, 'should remove multiple'); - - var obj = {a:1,b:2,c:3,d:4,e:5}; - var fn = function(val, key, o) { - return val % 2 === 0; - } - test(obj, [fn], {a:1,c:3,e:5}, 'allows function matcher'); - - var obj = {a:1}; - var fn = function(val, key, o) { - equal(val, 1, 'first argument should be value'); - equal(key, 'a', 'second argument should be the key'); - equal(o, obj, 'third param should be the object'); - } - run(obj, 'remove', [fn]); - - var fn = function() {}; - test({foo:fn}, [fn], {}, 'can remove by reference'); - - var obj = {a:['a','b'],b:['b','c']}; - test(obj, [['a','b']], {b:['b','c']}, 'allows nested arrays as equal match'); - - var obj = {foo:{a:'a'},bar:{a:'z'}}; - test(obj, [{a:/[a-f]/}], {bar:{a:'z'}}, 'allows nested fuzzy matchers'); - - }); - - method('exclude', function() { - - var obj = {foo:1,bar:2}; - var result = run(obj, 'exclude', [1]); - equal(obj, {foo:1,bar:2}, 'Original object should be untouched'); - equal(result, {bar:2}, 'Property should have been deleted'); - - test({a:'a'}, [], {a:'a'}, 'no argument should do nothing'); - test({one:'a',two:'a'}, ['a'], {}, 'should remove multiple'); - - var obj = {a:1,b:2,c:3,d:4,e:5}; - var fn = function(val, key, o) { - return val % 2 === 0; - } - test(obj, [fn], {a:1,c:3,e:5}, 'allows function matcher'); - - var obj = {a:1}; - var fn = function(val, key, o) { - equal(val, 1, 'first argument should be value'); - equal(key, 'a', 'second argument should be the key'); - equal(o, obj, 'third param should be the object'); - } - run(obj, 'exclude', [fn]); - - var fn = function() {}; - test({foo:fn}, [fn], {}, 'can remove by reference'); - - var obj = {a:['a','b'],b:['b','c']}; - test(obj, [['a','b']], {b:['b','c']}, 'allows nested arrays as equal match'); - - var obj = {foo:{a:'a'},bar:{a:'z'}}; - test(obj, [{a:/[a-f]/}], {bar:{a:'z'}}, 'allows nested fuzzy matchers'); - - }); - method('intersect', function() { test({foo:'bar',moo:'car'}, [{foo:'bar',moo:'mar'}], {foo:'bar'}, 'One key'); test({foo:'bar',moo:'car'}, [{foo:'bar',moo:'car'}], {foo:'bar',moo:'car'}, 'Both keys'); diff --git a/test/tests/object.js b/test/tests/object.js index 8430ccfd5..8aba1f33f 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -374,4 +374,475 @@ namespace('Object', function () { }); + describeInstance('findKey', function(findKey) { + + it('should match by primitive matchers', function() { + assertEqual(findKey({a:'a',b:'b'}, 'a'), 'a'); + assertEqual(findKey({a:'a',b:'b'}, 'c'), undefined); + assertEqual(findKey({a:1,b:2}, 2), 'b'); + assertEqual(findKey({a:1,b:2}, 3), undefined); + assertEqual(findKey({a:true,b:false}, true), 'a'); + assertEqual(findKey({a:true,b:true}, false), undefined); + }); + + it('should match by regex', function() { + assertEqual(findKey({a:'a',b:'b'}, /[a-c]/), 'a'); + assertEqual(findKey({a:'a',b:'b'}, /[c-z]/), undefined); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(findKey({a:d1,b:d2}, new Date(2020, 7, 28)), 'a'); + assertEqual(findKey({a:d1,b:d1}, new Date(2020, 7, 29)), undefined); + }); + + it('should match by function', function() { + assertEqual(findKey({a:1,b:2}, (key, n) => n % 2 === 0), 'b'); + assertEqual(findKey({a:1,b:3}, (key, n) => n % 2 === 0), undefined); + assertEqual(findKey({a:1,b:2}, (key, n) => n > 5), undefined); + assertEqual(findKey({a:1,b:2}, (key, n) => n > 0), 'a'); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(findKey({a:fn1, b:fn2}, fn2), 'b'); + assertEqual(findKey({a:fn1, b:fn1}, fn2), undefined); + }); + + it('should match by fuzzy matching', function() { + assertEqual( + findKey({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + '1' + ); + assertEqual(findKey({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Robert'}), + undefined + ); + assertEqual(findKey({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-J]/}), + '1' + ); + assertEqual(findKey({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[K-Z]/}), + undefined + ); + }); + + it('should pass correct params', function() { + findKey({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(findKey({a:1}, null), undefined); + assertEqual(findKey({a:1}, NaN), undefined); + assertError(function() { findKey({}); }); + assertError(function() { findKey(null); }); + assertError(function() { findKey('a'); }); + assertError(function() { findKey(1); }); + }); + + }); + + describeInstance('filterValues', function(filterValues) { + + it('should match by primitive matchers', function() { + assertObjectEqual(filterValues({a:'a',b:'b'}, 'a'), {a:'a'}); + assertObjectEqual(filterValues({a:'a',b:'b'}, 'c'), {}); + assertObjectEqual(filterValues({a:1,b:2}, 2), {b:2}); + assertObjectEqual(filterValues({a:1,b:2}, 3), {}); + assertObjectEqual(filterValues({a:true,b:false}, true), {a:true}); + assertObjectEqual(filterValues({a:true,b:true}, false), {}); + }); + + it('should match by regex', function() { + assertObjectEqual(filterValues({a:'a',b:'b'}, /[a-c]/), {a:'a',b:'b'}); + assertObjectEqual(filterValues({a:'a',b:'b'}, /[c-z]/), {}); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertObjectEqual(filterValues({a:d1,b:d2}, new Date(2020, 7, 28)), {a:d1}); + assertObjectEqual(filterValues({a:d1,b:d1}, new Date(2020, 7, 29)), {}); + }); + + it('should match by function', function() { + assertObjectEqual(filterValues({a:1,b:2}, (key, n) => n % 2 === 0), {b:2}); + assertObjectEqual(filterValues({a:1,b:3}, (key, n) => n % 2 === 0), {}); + assertObjectEqual(filterValues({a:1,b:2}, (key, n) => n > 5), {}); + assertObjectEqual(filterValues({a:1,b:2}, (key, n) => n > 0), {a:1,b:2}); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertObjectEqual(filterValues({a:fn1, b:fn2}, fn2), {b:fn2}); + assertObjectEqual(filterValues({a:fn1, b:fn1}, fn2), {}); + }); + + it('should match by fuzzy matching', function() { + assertObjectEqual( + filterValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + { 1: { name:'Frank'} }, + ); + assertObjectEqual(filterValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Robert'}), + {}, + ); + assertObjectEqual(filterValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-J]/}), + { + 1: { name:'Frank'}, + 2: { name:'James'}, + }, + ); + assertObjectEqual(filterValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[K-Z]/}), + {} + ); + }); + + it('should pass correct params', function() { + filterValues({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should not modify the object', function() { + const obj = {}; + assertEqual(obj === filterValues(obj, 1), false); + }); + + it('should handle irregular input', function() { + assertObjectEqual(filterValues({a:1}, null), {}); + assertObjectEqual(filterValues({a:1}, NaN), {}); + assertError(function() { filterValues({}); }); + assertError(function() { filterValues(null); }); + assertError(function() { filterValues('a'); }); + assertError(function() { filterValues(1); }); + }); + + }); + + describeInstance('excludeValues', function(excludeValues) { + + it('should match by primitive matchers', function() { + assertObjectEqual(excludeValues({a:'a',b:'b'}, 'a'), {b:'b'}); + assertObjectEqual(excludeValues({a:'a',b:'b'}, 'c'), {a:'a',b:'b'}); + assertObjectEqual(excludeValues({a:1,b:2}, 2), {a:1}); + assertObjectEqual(excludeValues({a:1,b:2}, 3), {a:1,b:2}); + assertObjectEqual(excludeValues({a:true,b:false}, true), {b:false}); + assertObjectEqual(excludeValues({a:true,b:true}, false), {a:true,b:true}); + }); + + it('should match by regex', function() { + assertObjectEqual(excludeValues({a:'a',b:'b'}, /[a-c]/), {}); + assertObjectEqual(excludeValues({a:'a',b:'b'}, /[c-z]/), {a:'a',b:'b'}); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertObjectEqual(excludeValues({a:d1,b:d2}, new Date(2020, 7, 28)), {b:d2}); + assertObjectEqual(excludeValues({a:d1,b:d1}, new Date(2020, 7, 29)), {a:d1,b:d1}); + }); + + it('should match by function', function() { + assertObjectEqual(excludeValues({a:1,b:2}, (key, n) => n % 2 === 0), {a:1}); + assertObjectEqual(excludeValues({a:1,b:3}, (key, n) => n % 2 === 0), {a:1,b:3}); + assertObjectEqual(excludeValues({a:1,b:2}, (key, n) => n > 5), {a:1,b:2}); + assertObjectEqual(excludeValues({a:1,b:2}, (key, n) => n > 0), {}); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertObjectEqual(excludeValues({a:fn1, b:fn2}, fn2), {a:fn1}); + assertObjectEqual(excludeValues({a:fn1, b:fn1}, fn2), {a:fn1,b:fn1}); + }); + + it('should match by fuzzy matching', function() { + assertObjectEqual( + excludeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + { 2: { name:'James'} }, + ); + assertObjectEqual(excludeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Robert'}), + { + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + ); + assertObjectEqual(excludeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-J]/}), + {}, + ); + assertObjectEqual(excludeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[K-Z]/}), + { + 1:{ name:'Frank'}, + 2:{ name:'James'}, + } + ); + }); + + it('should pass correct params', function() { + excludeValues({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should not modify the object', function() { + const obj = {}; + assertEqual(obj === excludeValues(obj, 1), false); + }); + + it('should handle irregular input', function() { + assertObjectEqual(excludeValues({a:1}, null), {a:1}); + assertObjectEqual(excludeValues({a:1}, NaN), {a:1}); + assertError(function() { excludeValues({}); }); + assertError(function() { excludeValues(null); }); + assertError(function() { excludeValues('a'); }); + assertError(function() { excludeValues(1); }); + }); + + }); + + describeInstance('removeValues', function(removeValues) { + + it('should match by primitive matchers', function() { + assertObjectEqual(removeValues({a:'a',b:'b'}, 'a'), {b:'b'}); + assertObjectEqual(removeValues({a:'a',b:'b'}, 'c'), {a:'a',b:'b'}); + assertObjectEqual(removeValues({a:1,b:2}, 2), {a:1}); + assertObjectEqual(removeValues({a:1,b:2}, 3), {a:1,b:2}); + assertObjectEqual(removeValues({a:true,b:false}, true), {b:false}); + assertObjectEqual(removeValues({a:true,b:true}, false), {a:true,b:true}); + }); + + it('should match by regex', function() { + assertObjectEqual(removeValues({a:'a',b:'b'}, /[a-c]/), {}); + assertObjectEqual(removeValues({a:'a',b:'b'}, /[c-z]/), {a:'a',b:'b'}); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertObjectEqual(removeValues({a:d1,b:d2}, new Date(2020, 7, 28)), {b:d2}); + assertObjectEqual(removeValues({a:d1,b:d1}, new Date(2020, 7, 29)), {a:d1,b:d1}); + }); + + it('should match by function', function() { + assertObjectEqual(removeValues({a:1,b:2}, (key, n) => n % 2 === 0), {a:1}); + assertObjectEqual(removeValues({a:1,b:3}, (key, n) => n % 2 === 0), {a:1,b:3}); + assertObjectEqual(removeValues({a:1,b:2}, (key, n) => n > 5), {a:1,b:2}); + assertObjectEqual(removeValues({a:1,b:2}, (key, n) => n > 0), {}); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertObjectEqual(removeValues({a:fn1, b:fn2}, fn2), {a:fn1}); + assertObjectEqual(removeValues({a:fn1, b:fn1}, fn2), {a:fn1,b:fn1}); + }); + + it('should match by fuzzy matching', function() { + assertObjectEqual( + removeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + { 2: { name:'James'} }, + ); + assertObjectEqual(removeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Robert'}), + { + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + ); + assertObjectEqual(removeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-J]/}), + {}, + ); + assertObjectEqual(removeValues({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[K-Z]/}), + { + 1:{ name:'Frank'}, + 2:{ name:'James'}, + } + ); + }); + + it('should pass correct params', function() { + removeValues({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should modify the object', function() { + const obj1 = {a:1}; + const obj2 = removeValues(obj1, 1); + assertEqual(obj1, obj2); + assertObjectEqual(obj1, {}); + }); + + it('should handle irregular input', function() { + assertObjectEqual(removeValues({a:1}, null), {a:1}); + assertObjectEqual(removeValues({a:1}, NaN), {a:1}); + assertError(function() { removeValues({}); }); + assertError(function() { removeValues(null); }); + assertError(function() { removeValues('a'); }); + assertError(function() { removeValues(1); }); + }); + + }); + + describeInstance('filter', function(filter) { + + it('should filter by enumerated arguments', function() { + assertObjectEqual(filter({a:1,b:2}, 'a'), {a:1}); + assertObjectEqual(filter({a:1,b:2}, 'a', 'b'), {a:1,b:2}); + assertObjectEqual(filter({a:1,b:2}), {}); + assertObjectEqual(filter({a:1,b:2}, 'c'), {}); + }); + + it('should filter by array argument', function() { + assertObjectEqual(filter({a:1,b:2}, ['a']), {a:1}); + assertObjectEqual(filter({a:1,b:2}, ['a', 'b']), {a:1,b:2}); + assertObjectEqual(filter({a:1,b:2}, []), {}); + assertObjectEqual(filter({a:1,b:2}, ['c']), {}); + }); + + it('should not modify the object', function() { + const obj1 = {a:1}; + const obj2 = filter(obj1, 1); + assertFalse(obj1 === obj2); + }); + + it('should handle irregular input', function() { + assertObjectEqual(filter({a:1}, null), {}); + assertObjectEqual(filter({a:1}, NaN), {}); + assertError(function() { filter(null); }); + assertError(function() { filter('a'); }); + assertError(function() { filter(1); }); + }); + + }); + + describeInstance('exclude', function(exclude) { + + it('should exclude by enumerated arguments', function() { + assertObjectEqual(exclude({a:1,b:2}, 'a'), {b:2}); + assertObjectEqual(exclude({a:1,b:2}, 'a', 'b'), {}); + assertObjectEqual(exclude({a:1,b:2}), {a:1,b:2}); + assertObjectEqual(exclude({a:1,b:2}, 'c'), {a:1,b:2}); + }); + + it('should exclude by array argument', function() { + assertObjectEqual(exclude({a:1,b:2}, ['a']), {b:2}); + assertObjectEqual(exclude({a:1,b:2}, ['a', 'b']), {}); + assertObjectEqual(exclude({a:1,b:2}, []), {a:1,b:2}); + assertObjectEqual(exclude({a:1,b:2}, ['c']), {a:1,b:2}); + }); + + it('should not modify the object', function() { + const obj1 = {a:1}; + const obj2 = exclude(obj1, 1); + assertFalse(obj1 === obj2); + }); + + it('should handle irregular input', function() { + assertObjectEqual(exclude({a:1}, null), {a:1}); + assertObjectEqual(exclude({a:1}, NaN), {a:1}); + assertError(function() { exclude(null); }); + assertError(function() { exclude('a'); }); + assertError(function() { exclude(1); }); + }); + + }); + + describeInstance('remove', function(remove) { + + it('should remove by enumerated arguments', function() { + assertObjectEqual(remove({a:1,b:2}, 'a'), {b:2}); + assertObjectEqual(remove({a:1,b:2}, 'a', 'b'), {}); + assertObjectEqual(remove({a:1,b:2}), {a:1,b:2}); + assertObjectEqual(remove({a:1,b:2}, 'c'), {a:1,b:2}); + }); + + it('should remove by array argument', function() { + assertObjectEqual(remove({a:1,b:2}, ['a']), {b:2}); + assertObjectEqual(remove({a:1,b:2}, ['a', 'b']), {}); + assertObjectEqual(remove({a:1,b:2}, []), {a:1,b:2}); + assertObjectEqual(remove({a:1,b:2}, ['c']), {a:1,b:2}); + }); + + it('should modify the object', function() { + const obj1 = {a:1}; + const obj2 = remove(obj1, 1); + assertTrue(obj1 === obj2); + }); + + it('should handle irregular input', function() { + assertObjectEqual(remove({a:1}, null), {a:1}); + assertObjectEqual(remove({a:1}, NaN), {a:1}); + assertError(function() { remove(null); }); + assertError(function() { remove('a'); }); + assertError(function() { remove(1); }); + }); + + }); }); From e70c2449f54ecf6bda29a31a9f84947e22f3f98e Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 3 Sep 2020 13:09:21 +0900 Subject: [PATCH 082/191] mapKeys syntax update --- src/object/mapKeys.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/object/mapKeys.js b/src/object/mapKeys.js index f4f5dbbf2..7e54025cc 100644 --- a/src/object/mapKeys.js +++ b/src/object/mapKeys.js @@ -32,8 +32,7 @@ export default function mapKeys(obj, map) { const mapper = getMapper(map); const result = {}; forEachProperty(obj, (key, val) => { - key = mapper(val, key, obj); - result[key] = val; + result[mapper(val, key, obj)] = val; }); return result; } From fea71b9988ef19ad039a31d298dea389f1af0e26 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 3 Sep 2020 14:27:34 +0900 Subject: [PATCH 083/191] Added Object.none/count/sum/average/median/minKey/minKeys/maxKey/maxKeys. --- CHANGELOG.md | 3 + src/object/average.js | 41 +++ src/object/count.js | 41 +++ src/object/define.js | 9 + src/object/maxKey.js | 41 +++ src/object/maxKeys.js | 44 +++ src/object/median.js | 47 +++ src/object/methods.js | 9 + src/object/minKey.js | 41 +++ src/object/minKeys.js | 44 +++ src/object/none.js | 33 ++ src/object/sum.js | 36 +++ test/OLD/tests/enumerable.js | 79 ----- test/tests/object.js | 571 +++++++++++++++++++++++++++++++++++ 14 files changed, 960 insertions(+), 79 deletions(-) create mode 100644 src/object/average.js create mode 100644 src/object/count.js create mode 100644 src/object/maxKey.js create mode 100644 src/object/maxKeys.js create mode 100644 src/object/median.js create mode 100644 src/object/minKey.js create mode 100644 src/object/minKeys.js create mode 100644 src/object/none.js create mode 100644 src/object/sum.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b73ce664..149660466 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,6 +90,9 @@ call `Function#lock` first in the chain to achieve the same effect. - `Object.filter` now filters by key. Equivalent is now `Object.filterValues`. - `Object.remove` now removes by key. Equivalent is now `Object.removeValues`. - `Object.exclude` now excludes by key. Equivalent is now `Object.excludeValues`. +- `Object.min` and `Object.max` are now `Object.minKey` and `Object.maxKey`. +- `Object.min` and `Object.max` with `all` flag are now refactored to + `Object.minKeys` and `Object.maxKeys`. TODO: diff --git a/src/object/average.js b/src/object/average.js new file mode 100644 index 000000000..50e0ab8f7 --- /dev/null +++ b/src/object/average.js @@ -0,0 +1,41 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the mean average for values in the object. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the values to be averaged. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {number} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.average({a:1,b:2,c:3}) -> 2 + * Object.average({1:{likes:28},2:{likes:16}}, (key, val) => val.likes) -> 22 + * Object.average({1:{likes:28},2:{likes:16}}, 'likes') -> 22 + * Object.average(usersById, 'profile.likes') -> average of profile likes + * + **/ +export default function average(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + let sum = 0; + let count = 0; + forEachProperty(obj, (key, val) => { + sum += mapper(val, key, obj); + count += 1; + }); + if (count === 0) { + return 0; + } + return sum / count; +} diff --git a/src/object/count.js b/src/object/count.js new file mode 100644 index 000000000..04360aca5 --- /dev/null +++ b/src/object/count.js @@ -0,0 +1,41 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMatcher } from '../util/matchers'; + +/** + * Counts properties in the object matching input. + * + * @param {Object} obj - The object. + * @param {any|searchFn} match - A matcher to determine how values are counted. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {Object} + * + * @example + * + * Object.count({a:1,b:2}, 1) -> 1 + * Object.count({a:1,b:1}, 3) -> 0 + * Object.count({a:'a',b:'b'}, /[a-f]) -> 2 + * Object.count(usersById, user => { + * return user.age > 30; + * }); -> returns the number of users over 30 + * + **/ +export default function count(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + const matcher = getMatcher(match); + let count = 0; + forEachProperty(obj, (key, val) => { + if (matcher(val, key, obj)) { + count += 1; + } + }); + return count; +} diff --git a/src/object/define.js b/src/object/define.js index 9bddbb502..9e3925e94 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -1,6 +1,8 @@ import { defineInstance } from '../core/object'; import * as methods from './methods'; +defineInstance('average', methods.average); +defineInstance('count', methods.count); defineInstance('every', methods.every); defineInstance('exclude', methods.exclude); defineInstance('excludeValues', methods.excludeValues); @@ -10,6 +12,13 @@ defineInstance('findKey', methods.findKey); defineInstance('forEach', methods.forEach); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); +defineInstance('median', methods.median); +defineInstance('maxKey', methods.maxKey); +defineInstance('maxKeys', methods.maxKeys); +defineInstance('minKey', methods.minKey); +defineInstance('minKeys', methods.minKeys); +defineInstance('none', methods.none); defineInstance('remove', methods.remove); defineInstance('removeValues', methods.removeValues); defineInstance('some', methods.some); +defineInstance('sum', methods.sum); diff --git a/src/object/maxKey.js b/src/object/maxKey.js new file mode 100644 index 000000000..65ef321c2 --- /dev/null +++ b/src/object/maxKey.js @@ -0,0 +1,41 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the key of the property in the object with the maximum value. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the value to be checked. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {string} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.maxKey({a:1,b:79,c:80}) -> 'c' + * Object.maxKey({1:{likes:28},2:{likes:10},3:{likes:4}}, (key, val) => val.likes) -> '1' + * Object.maxKey({1:{likes:28},2:{likes:10},3:{likes:4}}, 'likes') -> '1' + * Object.maxKey(usersById, 'profile.likes') -> key of the user with the most profile likes + * + **/ +export default function maxKey(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + let maxVal; + let maxKey; + forEachProperty(obj, (key, val) => { + val = mapper(val, key, obj); + if (!maxKey || val > maxVal) { + maxVal = val; + maxKey = key; + } + }); + return maxKey; +} diff --git a/src/object/maxKeys.js b/src/object/maxKeys.js new file mode 100644 index 000000000..964ade89d --- /dev/null +++ b/src/object/maxKeys.js @@ -0,0 +1,44 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the keys of the properties in the object with the maximum value. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the value to be checked. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {Array} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.maxKeys({a:1,b:79,c:80}) -> ['c'] + * Object.maxKeys({a:1,b:2,c:2}) -> ['b','c'] + * Object.maxKeys({1:{likes:28},2:{likes:10},3:{likes:4}}, (key, val) => val.likes) -> ['1'] + * Object.maxKeys({1:{likes:28},2:{likes:10},3:{likes:4}}, 'likes') -> ['1'] + * Object.maxKeys(usersById, 'profile.likes') -> keys of the users with the most profile likes + * + **/ +export default function maxKeys(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + let maxVal; + let maxKeys; + forEachProperty(obj, (key, val) => { + val = mapper(val, key, obj); + if (!maxKeys || val > maxVal) { + maxVal = val; + maxKeys = [key]; + } else if (val === maxVal) { + maxKeys.push(key); + } + }); + return maxKeys || []; +} diff --git a/src/object/median.js b/src/object/median.js new file mode 100644 index 000000000..7272ffbad --- /dev/null +++ b/src/object/median.js @@ -0,0 +1,47 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the median average for values in the object. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the values to be averaged. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {number} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.median({a:1,b:79,c:80}) -> 79 + * Object.median({1:{likes:28},2:{likes:10},3:{likes:4}}, (key, val) => val.likes) -> 10 + * Object.median({1:{likes:28},2:{likes:10},3:{likes:4}}, 'likes') -> 10 + * Object.median(usersById, 'profile.likes') -> median average of profile likes + * + **/ +export default function median(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + const values = []; + forEachProperty(obj, (key, val) => { + values.push(mapper(val, key, obj)); + }); + if (values.length === 0) { + return 0; + } + values.sort((a, b) => { + return a - b; + }); + const mid = Math.trunc(values.length / 2); + if (values.length % 2 === 0) { + return (values[mid - 1] + values[mid]) / 2; + } else { + return values[mid]; + } +} diff --git a/src/object/methods.js b/src/object/methods.js index 8209a6e59..21652071b 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -1,3 +1,5 @@ +export { default as average } from './average'; +export { default as count } from './count'; export { default as every } from './every'; export { default as exclude } from './exclude'; export { default as excludeValues } from './excludeValues'; @@ -7,6 +9,13 @@ export { default as findKey } from './findKey'; export { default as forEach } from './forEach'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; +export { default as median } from './median'; +export { default as maxKey } from './maxKey'; +export { default as maxKeys } from './maxKeys'; +export { default as minKey } from './minKey'; +export { default as minKeys } from './minKeys'; +export { default as none } from './none'; export { default as remove } from './remove'; export { default as removeValues } from './removeValues'; export { default as some } from './some'; +export { default as sum } from './sum'; diff --git a/src/object/minKey.js b/src/object/minKey.js new file mode 100644 index 000000000..0a61f4192 --- /dev/null +++ b/src/object/minKey.js @@ -0,0 +1,41 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the key of the property in the object with the minimum value. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the value to be checked. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {string} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.minKey({a:1,b:79,c:80}) -> 'a' + * Object.minKey({1:{likes:28},2:{likes:10},3:{likes:4}}, (key, val) => val.likes) -> '3' + * Object.minKey({1:{likes:28},2:{likes:10},3:{likes:4}}, 'likes') -> '3' + * Object.minKey(usersById, 'profile.likes') -> key of the user with the fewest profile likes + * + **/ +export default function minKey(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + let minVal; + let minKey; + forEachProperty(obj, (key, val) => { + val = mapper(val, key, obj); + if (!minKey || val < minVal) { + minVal = val; + minKey = key; + } + }); + return minKey; +} diff --git a/src/object/minKeys.js b/src/object/minKeys.js new file mode 100644 index 000000000..16bb96fc2 --- /dev/null +++ b/src/object/minKeys.js @@ -0,0 +1,44 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Gets the keys of the properties in the object with the minimum value. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the value to be checked. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {Array} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.minKeys({a:1,b:79,c:80}) -> ['a'] + * Object.minKeys({a:1,b:1,c:2}) -> ['a','b'] + * Object.minKeys({1:{likes:28},2:{likes:10},3:{likes:4}}, (key, val) => val.likes) -> ['3'] + * Object.minKeys({1:{likes:28},2:{likes:10},3:{likes:4}}, 'likes') -> ['3'] + * Object.minKeys(usersById, 'profile.likes') -> keys of the users with the fewest profile likes + * + **/ +export default function minKeys(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + let minVal; + let minKeys; + forEachProperty(obj, (key, val) => { + val = mapper(val, key, obj); + if (!minKeys || val < minVal) { + minVal = val; + minKeys = [key]; + } else if (val === minVal) { + minKeys.push(key); + } + }); + return minKeys || []; +} diff --git a/src/object/none.js b/src/object/none.js new file mode 100644 index 000000000..74e89f874 --- /dev/null +++ b/src/object/none.js @@ -0,0 +1,33 @@ +import { assertObject } from '../util/assertions'; +import some from './some'; + +/** + * Returns true if no value in the object matches input. + * + * @param {Object} obj - The object. + * @param {any|searchFn} match - A matcher to determine how values are checked. + * When a function is passed a truthy return value will match. Primitives will + * directly match values. Can also be a Date object to match dates, a RegExp + * which will test against strings, or a plain object which will perform a + * "fuzzy match" on specific properties. Values of a fuzzy match can be any of + * the matcher types listed above. + * + * @returns {boolean} + * + * @example + * + * Object.none({a:1,b:2}, 1) -> false + * Object.none({a:1,b:2}, 3) -> true + * Object.none({a:'a',b:'b'}, /[a-f]) -> false + * Object.none(usersById, user => { + * return user.age > 30; + * }); -> true if no users are older than 30 + * + **/ +export default function none(obj, match) { + assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } + return !some(obj, match); +} diff --git a/src/object/sum.js b/src/object/sum.js new file mode 100644 index 000000000..03f60e8f0 --- /dev/null +++ b/src/object/sum.js @@ -0,0 +1,36 @@ +import { assertObject } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; +import { getMapper } from '../util/mappers'; + +/** + * Sums values in the object. + * + * @param {Object} obj - The object. + * @param {string|mapFn} [map] - Determines the values to be summed. `map` may + * be a string serving as a shortcut. Implements deep property mapping. + * + * @returns {number} + * + * @callback mapFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * + * @example + * + * Object.sum({a:1,b:2}) -> 3 + * Object.sum({1:{likes:28},2:{likes:15}}, (key, val) => val.likes) -> 43 + * Object.sum({1:{likes:28},2:{likes:15}}, 'likes') -> 43 + * Object.sum(usersById, 'profile.likes') -> sum of profile likes + * + **/ +export default function sum(obj, map) { + assertObject(obj); + const mapper = getMapper(map); + let sum = 0; + forEachProperty(obj, (key, val) => { + sum += mapper(val, key, obj); + }); + return sum; +} diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js index 4711efd85..0c4433933 100644 --- a/test/OLD/tests/enumerable.js +++ b/test/OLD/tests/enumerable.js @@ -26,85 +26,6 @@ namespace('Object', function() { var obj4 = testClone(obj2); obj4['blue'] = {age:11}; var deepObj4 = testClone(deepObj2); deepObj4['blue'] = {user:{age:11}}; - method('sum', function() { - test(obj1, [], 18, 'no args is sum of values'); - test(obj1, [function(val, key) { return val; }], 18, 'should sum values'); - test(obj1, [function(val, key) { return key === 'foo' ? 0 : val; }], 16, 'without foo'); - test(obj2, ['age'], 110, 'accepts a string shortcut'); - test(deepObj2, ['user.age'], 110, 'accepts a deep string shortcut'); - test([{age:2},{age:3}], ['age'], 5, 'called on arrays should still work'); - }); - - method('average', function() { - test(obj1, [], 4.5, 'no args is average of values'); - test(obj1, [function(val, key) { return val; }], 4.5, 'should average values'); - test(obj1, [function(val, key) { return key === 'foo' ? 0 : val; }], 4, 'without foo'); - test(obj2, ['age'], 27.5, 'accepts a string shortcut'); - test(deepObj2, ['user.age'], 27.5, 'accepts a deep string shortcut'); - test([{age:2},{age:4}], ['age'], 3, 'called on arrays should still work'); - }); - - method('median', function() { - test(obj1, [], 5, 'no args is average of values'); - test(obj1, [function(val, key) { return val; }], 5, 'should average values'); - test(obj1, [function(val, key) { return key === 'moo' ? 0 : val; }], 3, 'without moo'); - test(obj2, ['age'], 27.5, 'accepts a string shortcut'); - test(deepObj2, ['user.age'], 27.5, 'accepts a deep string shortcut'); - test([{age:2},{age:2},{age:4}], ['age'], 2, 'called on arrays should still work'); - }); - - method('min', function() { - test(obj3, [], 'foo', 'no args is min of values'); - test(obj3, [function(val, key) { return val; }], 'foo', 'return value'); - test(obj3, [function(val, key) { return key.length; }], 'foo', 'return key.length'); - test(obj3, [true, function(val, key) { return key.length; }], {foo:2,bar:4,moo:6,car:6}, 'return key.length'); - test(obj3, [true, function(val, key) { return key.charCodeAt(0); }], {bar: 4,blue:4}, 'all | return the char code of first letter'); - test(obj4, ['age'], 'foo', 'accepts a string shortcut'); - test(obj4, [true, 'age'], {foo: {age:11},blue:{age:11}}, 'all | accepts a string shortcut'); - test(deepObj2, ['user.age'], 'foo', 'accepts a deep string shortcut'); - - test([{age:2},{age:4}], ['age'], 0, 'called on arrays returns index'); - test([{age:2},{age:2}], [true, 'age'], {'0':{age:2},'1':{age:2}}, 'all | called on arrays returns object'); - }); - - method('max', function() { - test(obj3, [], 'moo', 'no args is first object'); - test(obj3, [function(val, key) { return val; }], 'moo', 'return value'); - test(obj3, [function(val, key) { return key.length; }], 'blue', 'return key.length'); - test(obj3, [function(val, key) { return key.charCodeAt(0); }], 'moo', 'return the char code of first letter'); - test(obj4, ['age'], 'car', 'accepts a string shortcut'); - test(obj3, [true, function(val, key) { return val; }], {moo:6,car:6}, 'all | return value'); - test(obj3, [true, function(val, key) { return key.length; }], {blue:4}, 'all | return key.length'); - test(obj3, [true, function(val, key) { return key.charCodeAt(0); }], {moo:6}, 'all | return the char code of first letter'); - test(obj4, [true, 'age'], {car:{age:44}}, 'all | accepts a string shortcut'); - test(deepObj2, ['user.age'], 'car', 'accepts a deep string shortcut'); - - test([{age:2},{age:4}], ['age'], 1, 'called on arrays returns index'); - test([{age:2},{age:4}], [true, 'age'], {'1':{age:4}}, 'all | called on arrays returns object'); - }); - - method('count', function() { - test(obj1, [function(val, key) { return key == 'foo'; }], 1, 'key is foo'); - test(obj1, [function(val, key) { return key.length > 3; }], 0, 'key length is greater than 3'); - test(obj1, [function(val, key) { return key.length > 0; }], 4, 'key length is greater than 0'); - test(obj1, [function(val, key) { return val > 0; }], 4, 'value is greater than 0'); - test(obj1, [function(val, key) { return val > 5; }], 2, 'value is greater than 5'); - test(obj1, [function(val, key) { return val > 6; }], 0, 'value is greater than 6'); - test(obj1, [2], 1, 'shortcut | 2'); - test(obj1, [7], 0, 'shortcut | 7'); - }); - - method('none', function() { - test(obj1, [function(val, key) { return key == 'foo'; }], false, 'key is foo'); - test(obj1, [function(val, key) { return key.length > 3; }], true, 'key length is greater than 3'); - test(obj1, [function(val, key) { return key.length > 0; }], false, 'key length is greater than 0'); - test(obj1, [function(val, key) { return val > 0; }], false, 'value is greater than 0'); - test(obj1, [function(val, key) { return val > 5; }], false, 'value is greater than 5'); - test(obj1, [function(val, key) { return val > 6; }], true, 'value is greater than 6'); - test(obj1, [2], false, 'shortcut | 2'); - test(obj1, [7], true, 'shortcut | 7'); - }); - method('reduce', function() { var fn = function(a, b) { return a * b; diff --git a/test/tests/object.js b/test/tests/object.js index 8aba1f33f..ee930a638 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -374,6 +374,91 @@ namespace('Object', function () { }); + describeInstance('none', function(none) { + + it('should match by primitive matchers', function() { + assertEqual(none({a:'a',b:'b'}, 'a'), false); + assertEqual(none({a:'a',b:'b'}, 'd'), true); + assertEqual(none({a:1,b:2}, 7), true); + assertEqual(none({a:true,b:false}, true), false); + assertEqual(none({a:false,b:false}, true), true); + }); + + it('should match by regex', function() { + assertEqual(none({a:'a',b:'b'}, /[ac]/), false); + assertEqual(none({a:'a',b:'b'}, /[AC]/), true); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(none({a:d1,b:d2}, new Date(2020, 7, 28)), false); + assertEqual(none({a:d1,b:d2}, new Date(2020, 7, 30)), true); + }); + + it('should match by function', function() { + assertEqual(none({a:1,b:2}, (key, n) => n % 2 === 0), false); + assertEqual(none({a:2,b:4}, (key, n) => n % 2 === 1), true); + assertEqual(none({a:1,b:2}, (key, n) => n > 5), true); + assertEqual(none({a:1,b:2}, (key, n) => n > 1), false); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(none({a:fn1, b:fn2}, fn2), false); + assertEqual(none({a:fn1}, fn2), true); + }); + + it('should match by fuzzy matching', function() { + assertEqual( + none({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + false + ); + assertEqual(none({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Bob'}), + true + ); + assertEqual(none({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-F]/}), + false + ); + assertEqual(none({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[N-Z]/}), + true + ); + }); + + it('should pass correct params', function() { + none({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(none({a:1}, null), true); + assertEqual(none({a:1}, NaN), true); + assertError(function() { none({}); }); + assertError(function() { none(null); }); + assertError(function() { none('a'); }); + assertError(function() { none(1); }); + }); + + }); + describeInstance('findKey', function(findKey) { it('should match by primitive matchers', function() { @@ -845,4 +930,490 @@ namespace('Object', function () { }); }); + + describeInstance('count', function(count) { + + it('should match by primitive matchers', function() { + assertEqual(count({a:'a',b:'b'}, 'a'), 1); + assertEqual(count({a:'a',b:'b'}, 'c'), 0); + assertEqual(count({a:1,b:2}, 2), 1); + assertEqual(count({a:1,b:2}, 3), 0); + assertEqual(count({a:true,b:false}, true), 1); + assertEqual(count({a:true,b:true}, false), 0); + }); + + it('should match by regex', function() { + assertEqual(count({a:'a',b:'b'}, /[a-c]/), 2); + assertEqual(count({a:'a',b:'b'}, /[c-z]/), 0); + }); + + it('should match by date', function() { + var d1 = new Date(2020, 7, 28); + var d2 = new Date(2020, 7, 29); + assertEqual(count({a:d1,b:d2}, new Date(2020, 7, 28)), 1); + assertEqual(count({a:d1,b:d1}, new Date(2020, 7, 29)), 0); + }); + + it('should match by function', function() { + assertEqual(count({a:1,b:2}, (key, n) => n % 2 === 0), 1); + assertEqual(count({a:1,b:3}, (key, n) => n % 2 === 0), 0); + assertEqual(count({a:1,b:2}, (key, n) => n > 5), 0); + assertEqual(count({a:1,b:2}, (key, n) => n > 0), 2); + }); + + it('should match by function when strictly equal', function() { + var fn1 = function(){}; + var fn2 = function(){}; + assertEqual(count({a:fn1, b:fn2}, fn2), 1); + assertEqual(count({a:fn1, b:fn1}, fn2), 0); + }); + + it('should match by fuzzy matching', function() { + assertEqual( + count({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, + {name:'Frank'} + ), + 1, + ); + assertEqual(count({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:'Robert'}), + 0, + ); + assertEqual(count({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[A-J]/}), + 2, + ); + assertEqual(count({ + 1:{ name:'Frank'}, + 2:{ name:'James'}, + }, {name:/^[K-Z]/}), + 0 + ); + }); + + it('should pass correct params', function() { + count({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(count({a:1}, null), 0); + assertEqual(count({a:1}, NaN), 0); + assertError(function() { count({}); }); + assertError(function() { count(null); }); + assertError(function() { count('a'); }); + assertError(function() { count(1); }); + }); + + }); + + describeInstance('sum', function(sum) { + + it('should sum all values with no arguments', function() { + assertEqual(sum({a:1,b:2}), 3); + assertEqual(sum({a:0,b:0}), 0); + assertEqual(sum({a:1}), 1); + assertEqual(sum({}), 0); + }); + + it('should sum with function mapper', function() { + assertEqual(sum({a:1,b:2}, (key, n) => n * 2), 6); + assertEqual(sum({a:1,b:2}, (key, n) => n % 2 === 0 ? n : 0), 2); + assertEqual(sum({a:1,b:2}, (key, n) => n > 5 ? n : 0), 0); + assertEqual(sum({a:1,b:2}, (key, n) => n > 1 ? n : 0), 2); + }); + + it('should sum with string mapper', function() { + assertEqual(sum({1:{age:2},2:{age:5}}, 'age'), 7); + assertNaN(sum({1:{age:2},2:{age:5}}, 'height')); + }); + + it('should handle deep properties', function() { + assertEqual(sum({ + 1: { profile: { likes: 20 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 36 } }, + }, 'profile.likes'), 73); + assertEqual(sum({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), 189); + assertEqual(sum({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), 189); + }); + + it('should pass correct params', function() { + sum({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(sum({a:null,b:false}), 0); + assertError(function() { sum(); }); + assertError(function() { sum(null); }); + assertError(function() { sum(1); }); + assertError(function() { sum('a'); }); + }); + + }); + + describeInstance('average', function(average) { + + it('should average all values with no arguments', function() { + assertEqual(average({a:1,b:2,c:3}), 2); + assertEqual(average({a:0,b:0,c:0}), 0); + assertEqual(average({}), 0); + }); + + it('should average with function mapper', function() { + assertEqual(average({a:1,b:2,c:3,d:4}, (key, n) => n * 2), 5); + assertEqual(average({a:1,b:2,c:3,d:4}, (key, n) => n % 2 === 0 ? n : 0), 1.5); + assertEqual(average({a:1,b:2,c:3,d:4}, (key, n) => n > 5 ? n : 0), 0); + assertEqual(average({a:1,b:2,c:3,d:4}, (key, n) => n > 2 ? n : 0), 1.75); + }); + + it('should average with string mapper', function() { + assertEqual(average({1:{age:2},2:{age:5}}, 'age'), 3.5); + assertNaN(average({1:{age:2},2:{age:5}}, 'height')); + }); + + it('should handle deep properties', function() { + assertEqual(average({ + 1: { profile: { likes: 20 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 38 } }, + }, 'profile.likes'), 25); + assertEqual(average({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), 63); + assertEqual(average({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), 63); + }); + + it('should handle irregular input', function() { + assertEqual(average({a:null,b:false}), 0); + assertNaN(average({a:NaN,b:NaN})); + assertError(function() { average(); }); + assertError(function() { average(null); }); + assertError(function() { average(1); }); + assertError(function() { average('a'); }); + }); + + }); + + describeInstance('median', function(median) { + + it('should median average all values with no arguments', function() { + assertEqual(median({a:1,b:5,c:7}), 5); + assertEqual(median({a:1,b:5,c:6,d:8}), 5.5); + assertEqual(median({a:8,b:6,c:5,d:1}), 5.5); + assertEqual(median({a:8,b:5,c:6,d:1}), 5.5); + assertEqual(median({a:1,b:80,c:81}), 80); + assertEqual(median({a:0,b:0,c:0}), 0); + assertEqual(median({}), 0); + }); + + it('should median average with function mapper', function() { + assertEqual(median({a:1,b:2,c:3,d:4}, (key, n) => n * 2), 5); + assertEqual(median({a:1,b:2,c:3,d:4}, (key, n) => n % 2 === 0 ? n : 0), 1); + assertEqual(median({a:1,b:2,c:3,d:4}, (key, n) => n > 5 ? n : 0), 0); + assertEqual(median({a:1,b:2,c:3,d:4}, (key, n) => n > 2 ? n : 0), 1.5); + }); + + it('should average with string mapper', function() { + assertEqual(median({1:{age:2},2:{age:5}}, 'age'), 3.5); + assertNaN(median({1:{age:2},2:{age:5}}, 'height')); + }); + + it('should handle deep properties', function() { + assertEqual(median({ + 1: { profile: { likes: 10 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 38 } }, + 4: { profile: { likes: 18 } }, + }, 'profile.likes'), 17.5); + assertEqual(median({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), 80); + assertEqual(median({ + 1: { posts: [{ views: 20 }] }, + 2: { posts: [{ views: 80 }] }, + 3: { posts: [{ views: 97 }] }, + 4: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), 50); + }); + + it('should handle irregular input', function() { + assertEqual(median({a:null,b:false}), 0); + assertNaN(median({a:NaN,b:NaN})); + assertError(function() { median(); }); + assertError(function() { median(null); }); + assertError(function() { median(1); }); + assertError(function() { median('a'); }); + }); + + }); + + describeInstance('minKey', function(minKey) { + + it('should work with no arguments', function() { + assertEqual(minKey({a:1,b:2,c:3}), 'a'); + assertEqual(minKey({a:0,b:0,c:0}), 'a'); + }); + + it('should allow a function mapper', function() { + assertEqual(minKey({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), 'd'); + }); + + it('should allow a string mapper', function() { + assertEqual(minKey({1:{age:5},2:{age:2}}, 'age'), '2'); + assertEqual(minKey({1:{age:2},2:{age:5}}, 'height'), '1'); + }); + + it('should handle deep properties', function() { + assertEqual(minKey({ + 1: { profile: { likes: 20 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 36 } }, + }, 'profile.likes'), '2'); + assertEqual(minKey({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), '3'); + assertEqual(minKey({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), '3'); + }); + + it('should handle infinite values', function() { + assertEqual(minKey({a:Infinity}), 'a'); + assertEqual(minKey({a:-Infinity}), 'a'); + }); + + it('should pass correct params', function() { + minKey({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(minKey({}), undefined); + assertEqual(minKey({a:'a',b:'b',c:'c'}), 'a'); + assertEqual(minKey({a:null, b:false}), 'a'); + assertError(function() { minKey(); }); + assertError(function() { minKey(null); }); + assertError(function() { minKey(1); }); + assertError(function() { minKey('a'); }); + }); + + }); + + describeInstance('maxKey', function(maxKey) { + + it('should work with no arguments', function() { + assertEqual(maxKey({a:1,b:2,c:3}), 'c'); + assertEqual(maxKey({a:0,b:0,c:0}), 'a'); + }); + + it('should allow a function mapper', function() { + assertEqual(maxKey({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), 'a'); + }); + + it('should allow a string mapper', function() { + assertEqual(maxKey({1:{age:5},2:{age:2}}, 'age'), '1'); + assertEqual(maxKey({1:{age:2},2:{age:5}}, 'height'), '1'); + }); + + it('should handle deep properties', function() { + assertEqual(maxKey({ + 1: { profile: { likes: 20 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 36 } }, + }, 'profile.likes'), '3'); + assertEqual(maxKey({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), '2'); + assertEqual(maxKey({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), '2'); + }); + + it('should handle infinite values', function() { + assertEqual(maxKey({a:Infinity}), 'a'); + assertEqual(maxKey({a:-Infinity}), 'a'); + }); + + it('should pass correct params', function() { + maxKey({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertEqual(maxKey({}), undefined); + assertEqual(maxKey({a:'a',b:'b',c:'c'}), 'c'); + assertEqual(maxKey({a:null, b:false}), 'a'); + assertError(function() { maxKey(); }); + assertError(function() { maxKey(null); }); + assertError(function() { maxKey(1); }); + assertError(function() { maxKey('a'); }); + }); + + }); + + describeInstance('minKeys', function(minKeys) { + + it('should work with no arguments', function() { + assertArrayEqual(minKeys({a:1,b:2,c:3}), ['a']); + assertArrayEqual(minKeys({a:1,b:1,c:3}), ['a','b']); + assertArrayEqual(minKeys({a:0,b:0,c:0}), ['a','b','c']); + }); + + it('should allow a function mapper', function() { + assertArrayEqual(minKeys({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), ['d']); + }); + + it('should allow a string mapper', function() { + assertArrayEqual(minKeys({1:{age:5},2:{age:2}}, 'age'), ['2']); + assertArrayEqual(minKeys({1:{age:2},2:{age:5}}, 'height'), ['1', '2']); + }); + + it('should handle deep properties', function() { + assertArrayEqual(minKeys({ + 1: { profile: { likes: 20 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 36 } }, + }, 'profile.likes'), ['2']); + assertArrayEqual(minKeys({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), ['3']); + assertArrayEqual(minKeys({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), ['3']); + }); + + it('should handle infinite values', function() { + assertArrayEqual(minKeys({a:Infinity}), ['a']); + assertArrayEqual(minKeys({a:-Infinity}), ['a']); + }); + + it('should pass correct params', function() { + minKeys({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertArrayEqual(minKeys({}), []); + assertArrayEqual(minKeys({a:'a',b:'b',c:'c'}), ['a']); + assertArrayEqual(minKeys({a:null, b:false}), ['a']); + assertError(function() { minKeys(); }); + assertError(function() { minKeys(null); }); + assertError(function() { minKeys(1); }); + assertError(function() { minKeys('a'); }); + }); + + }); + + describeInstance('maxKeys', function(maxKeys) { + + it('should work with no arguments', function() { + assertArrayEqual(maxKeys({a:1,b:2,c:3}), ['c']); + assertArrayEqual(maxKeys({a:1,b:3,c:3}), ['b','c']); + assertArrayEqual(maxKeys({a:0,b:0,c:0}), ['a','b','c']); + }); + + it('should allow a function mapper', function() { + assertArrayEqual(maxKeys({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), ['a']); + }); + + it('should allow a string mapper', function() { + assertArrayEqual(maxKeys({1:{age:5},2:{age:2}}, 'age'), ['1']); + assertArrayEqual(maxKeys({1:{age:2},2:{age:5}}, 'height'), ['1', '2']); + }); + + it('should handle deep properties', function() { + assertArrayEqual(maxKeys({ + 1: { profile: { likes: 20 } }, + 2: { profile: { likes: 17 } }, + 3: { profile: { likes: 36 } }, + }, 'profile.likes'), ['3']); + assertArrayEqual(maxKeys({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts[0].views'), ['2']); + assertArrayEqual(maxKeys({ + 1: { posts: [{ views: 80 }] }, + 2: { posts: [{ views: 97 }] }, + 3: { posts: [{ views: 12 }] }, + }, 'posts.0.views'), ['2']); + }); + + it('should handle infinite values', function() { + assertArrayEqual(maxKeys({a:Infinity}), ['a']); + assertArrayEqual(maxKeys({a:-Infinity}), ['a']); + }); + + it('should pass correct params', function() { + maxKeys({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + + it('should handle irregular input', function() { + assertArrayEqual(maxKeys({}), []); + assertArrayEqual(maxKeys({a:'a',b:'b',c:'c'}), ['c']); + assertArrayEqual(maxKeys({a:null, b:false}), ['a']); + assertError(function() { maxKeys(); }); + assertError(function() { maxKeys(null); }); + assertError(function() { maxKeys(1); }); + assertError(function() { maxKeys('a'); }); + }); + + }); + }); From 4dc1775ae2926832b43757b2d82cefc51bf1d4ef Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 3 Sep 2020 14:38:14 +0900 Subject: [PATCH 084/191] Added Array#minAll and Array#maxAll --- CHANGELOG.md | 2 + src/array/define.js | 2 + src/array/maxAll.js | 46 ++++++++++++++ src/array/methods.js | 2 + src/array/minAll.js | 46 ++++++++++++++ test/.eslintrc | 1 + test/tests/array.js | 142 +++++++++++++++++++++++++++++++++++++++++++ test/tests/object.js | 90 +++++++++++++-------------- 8 files changed, 286 insertions(+), 45 deletions(-) create mode 100644 src/array/maxAll.js create mode 100644 src/array/minAll.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 149660466..d42209071 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -93,6 +93,8 @@ call `Function#lock` first in the chain to achieve the same effect. - `Object.min` and `Object.max` are now `Object.minKey` and `Object.maxKey`. - `Object.min` and `Object.max` with `all` flag are now refactored to `Object.minKeys` and `Object.maxKeys`. +- `Array#min` and `Array#max` with `all` flag are now refactored to + `Array#minAll` and `Array#maxAll`. TODO: diff --git a/src/array/define.js b/src/array/define.js index 10b63efe0..7743cf886 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -12,7 +12,9 @@ defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); defineInstance('map', methods.map); defineInstance('max', methods.max); +defineInstance('maxAll', methods.maxAll); defineInstance('min', methods.min); +defineInstance('minAll', methods.minAll); defineInstance('median', methods.median); defineInstance('none', methods.none); defineInstance('remove', methods.remove); diff --git a/src/array/maxAll.js b/src/array/maxAll.js new file mode 100644 index 000000000..0a62aff17 --- /dev/null +++ b/src/array/maxAll.js @@ -0,0 +1,46 @@ +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; + +/** + * Returns all elements in the array with the highest mapped value. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to compare. + * A function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. + * + * @returns {any} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].maxAll(); -> [3] + * [1,3,1,3].maxAll(); -> [3,3] + * users.maxAll((user) => user.votes) -> // user objects with max votes + * users.maxAll('votes') -> // user objects with max votes + * users.maxAll('profile.likes') -> // user objects with max profile likes + * + **/ +export default function maxAll(arr, map, context) { + assertArray(arr); + let max; + let found; + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + const val = mapper(el, i, arr); + if (i === 0 || val > max) { + max = val; + found = [el]; + } else if (val === max) { + found.push(el); + } + }); + return found || []; +} diff --git a/src/array/methods.js b/src/array/methods.js index ad3fa34ee..cb548185c 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -9,7 +9,9 @@ export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; export { default as map } from './map'; export { default as max } from './max'; +export { default as maxAll } from './maxAll'; export { default as min } from './min'; +export { default as minAll } from './minAll'; export { default as median } from './median'; export { default as none } from './none'; export { default as remove } from './remove'; diff --git a/src/array/minAll.js b/src/array/minAll.js new file mode 100644 index 000000000..10c25f20a --- /dev/null +++ b/src/array/minAll.js @@ -0,0 +1,46 @@ +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; + +/** + * Returns all elements in the array with the lowest mapped value. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to compare. + * A function may be passed here similar to `Array#map` or a string acting as a + * shortcut. Strings implement deep property matching. + * @param {any} [context] - The `this` argument to be passed to the mapping + * function. + * + * @returns {any} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,3].minAll(); -> [1] + * [1,2,1,3].minAll(); -> [1,1] + * users.minAll((user) => user.votes) -> // user objects with min votes + * users.minAll('votes') -> // user objects with min votes + * users.minAll('profile.likes') -> // user objects with min profile likes + * + **/ +export default function minAll(arr, map, context) { + assertArray(arr); + let min; + let found; + const mapper = getMapper(map, context); + arr.forEach((el, i) => { + const val = mapper(el, i, arr); + if (i === 0 || val < min) { + min = val; + found = [el]; + } else if (val === min) { + found.push(el); + } + }); + return found || []; +} diff --git a/test/.eslintrc b/test/.eslintrc index 5952d0b35..57a36e015 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -43,6 +43,7 @@ assertError: true, assertNoError: true, assertUndefined: true, + assertDateEqual: true, assertArrayEqual: true, assertObjectEqual: true, assertInstanceOf: true, diff --git a/test/tests/array.js b/test/tests/array.js index b5de401f5..9b88d4245 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1192,6 +1192,77 @@ namespace('Array', function() { }); + describeInstance('minAll', function(minAll) { + + it('should work with no arguments', function() { + assertArrayEqual(minAll([1,2,3]), [1]); + assertArrayEqual(minAll([1,1,2,3]), [1,1]); + assertArrayEqual(minAll([0,0,0]), [0,0,0]); + }); + + it('should allow a function mapper', function() { + assertArrayEqual(minAll([1,2,3,4], (n) => 1 / n), [4]); + }); + + it('should allow a string mapper', function() { + assertArrayEqual(minAll([{age:5},{age:2}], 'age'), [{age:2}]); + assertArrayEqual(minAll([{age:2},{age:5}], 'height'), [{age:2},{age:5}]); + }); + + it('should handle deep properties', function() { + assertArrayEqual(minAll([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), [{ profile: { likes: 17 } }]); + assertArrayEqual(minAll([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), [{ posts: [{ views: 12 }] }]); + assertArrayEqual(minAll([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), [{ posts: [{ views: 12 }] }]); + }); + + it('should handle infinite values', function() { + assertArrayEqual(minAll([Infinity]), [Infinity]); + assertArrayEqual(minAll([-Infinity]), [-Infinity]); + }); + + it('should pass correct params', function() { + minAll(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + minAll(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertArrayEqual(minAll([]), []); + assertArrayEqual(minAll(['c','b','a']), ['a']); + assertArrayEqual(minAll([null, false]), [null]); + assertError(function() { minAll(); }); + assertError(function() { minAll(null); }); + assertError(function() { minAll(1); }); + assertError(function() { minAll('a'); }); + }); + + }); + describeInstance('max', function(max) { it('should work with no arguments', function() { @@ -1262,6 +1333,77 @@ namespace('Array', function() { }); + describeInstance('maxAll', function(maxAll) { + + it('should work with no arguments', function() { + assertArrayEqual(maxAll([1,2,3]), [3]); + assertArrayEqual(maxAll([1,2,3,3]), [3,3]); + assertArrayEqual(maxAll([0,0,0]), [0,0,0]); + }); + + it('should allow a function mapper', function() { + assertArrayEqual(maxAll([1,2,3,4], (n) => 1 / n), [1]); + }); + + it('should allow a string mapper', function() { + assertArrayEqual(maxAll([{age:5},{age:2}], 'age'), [{age:5}]); + assertArrayEqual(maxAll([{age:2},{age:5}], 'height'), [{age:2},{age:5}]); + }); + + it('should handle deep properties', function() { + assertArrayEqual(maxAll([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), [{ profile: { likes: 36 } }]); + assertArrayEqual(maxAll([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), [{ posts: [{ views: 97 }] }]); + assertArrayEqual(maxAll([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), [{ posts: [{ views: 97 }] }]); + }); + + it('should handle infinite values', function() { + assertArrayEqual(maxAll([Infinity]), [Infinity]); + assertArrayEqual(maxAll([-Infinity]), [-Infinity]); + }); + + it('should pass correct params', function() { + maxAll(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + assertEqual(this, 'context'); + }, 'context'); + }); + + it('should not iterate over all members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + maxAll(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should handle irregular input', function() { + assertArrayEqual(maxAll([]), []); + assertArrayEqual(maxAll(['c','b','a']), ['c']); + assertArrayEqual(maxAll([null, false]), [null]); + assertError(function() { maxAll(); }); + assertError(function() { maxAll(null); }); + assertError(function() { maxAll(1); }); + assertError(function() { maxAll('a'); }); + }); + + }); + describeInstance('shuffle', function(shuffle) { function assertRandomized(arr, fn) { diff --git a/test/tests/object.js b/test/tests/object.js index ee930a638..ff4507cdd 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -1237,47 +1237,48 @@ namespace('Object', function () { }); - describeInstance('maxKey', function(maxKey) { + describeInstance('minKeys', function(minKeys) { it('should work with no arguments', function() { - assertEqual(maxKey({a:1,b:2,c:3}), 'c'); - assertEqual(maxKey({a:0,b:0,c:0}), 'a'); + assertArrayEqual(minKeys({a:1,b:2,c:3}), ['a']); + assertArrayEqual(minKeys({a:1,b:1,c:3}), ['a','b']); + assertArrayEqual(minKeys({a:0,b:0,c:0}), ['a','b','c']); }); it('should allow a function mapper', function() { - assertEqual(maxKey({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), 'a'); + assertArrayEqual(minKeys({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), ['d']); }); it('should allow a string mapper', function() { - assertEqual(maxKey({1:{age:5},2:{age:2}}, 'age'), '1'); - assertEqual(maxKey({1:{age:2},2:{age:5}}, 'height'), '1'); + assertArrayEqual(minKeys({1:{age:5},2:{age:2}}, 'age'), ['2']); + assertArrayEqual(minKeys({1:{age:2},2:{age:5}}, 'height'), ['1', '2']); }); it('should handle deep properties', function() { - assertEqual(maxKey({ + assertArrayEqual(minKeys({ 1: { profile: { likes: 20 } }, 2: { profile: { likes: 17 } }, 3: { profile: { likes: 36 } }, - }, 'profile.likes'), '3'); - assertEqual(maxKey({ + }, 'profile.likes'), ['2']); + assertArrayEqual(minKeys({ 1: { posts: [{ views: 80 }] }, 2: { posts: [{ views: 97 }] }, 3: { posts: [{ views: 12 }] }, - }, 'posts[0].views'), '2'); - assertEqual(maxKey({ + }, 'posts[0].views'), ['3']); + assertArrayEqual(minKeys({ 1: { posts: [{ views: 80 }] }, 2: { posts: [{ views: 97 }] }, 3: { posts: [{ views: 12 }] }, - }, 'posts.0.views'), '2'); + }, 'posts.0.views'), ['3']); }); it('should handle infinite values', function() { - assertEqual(maxKey({a:Infinity}), 'a'); - assertEqual(maxKey({a:-Infinity}), 'a'); + assertArrayEqual(minKeys({a:Infinity}), ['a']); + assertArrayEqual(minKeys({a:-Infinity}), ['a']); }); it('should pass correct params', function() { - maxKey({a:1}, function (key, val, obj) { + minKeys({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); assertObjectEqual(obj, {a:1}); @@ -1285,59 +1286,58 @@ namespace('Object', function () { }); it('should handle irregular input', function() { - assertEqual(maxKey({}), undefined); - assertEqual(maxKey({a:'a',b:'b',c:'c'}), 'c'); - assertEqual(maxKey({a:null, b:false}), 'a'); - assertError(function() { maxKey(); }); - assertError(function() { maxKey(null); }); - assertError(function() { maxKey(1); }); - assertError(function() { maxKey('a'); }); + assertArrayEqual(minKeys({}), []); + assertArrayEqual(minKeys({a:'a',b:'b',c:'c'}), ['a']); + assertArrayEqual(minKeys({a:null, b:false}), ['a']); + assertError(function() { minKeys(); }); + assertError(function() { minKeys(null); }); + assertError(function() { minKeys(1); }); + assertError(function() { minKeys('a'); }); }); }); - describeInstance('minKeys', function(minKeys) { + describeInstance('maxKey', function(maxKey) { it('should work with no arguments', function() { - assertArrayEqual(minKeys({a:1,b:2,c:3}), ['a']); - assertArrayEqual(minKeys({a:1,b:1,c:3}), ['a','b']); - assertArrayEqual(minKeys({a:0,b:0,c:0}), ['a','b','c']); + assertEqual(maxKey({a:1,b:2,c:3}), 'c'); + assertEqual(maxKey({a:0,b:0,c:0}), 'a'); }); it('should allow a function mapper', function() { - assertArrayEqual(minKeys({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), ['d']); + assertEqual(maxKey({a:1,b:2,c:3,d:4}, (key, n) => 1 / n), 'a'); }); it('should allow a string mapper', function() { - assertArrayEqual(minKeys({1:{age:5},2:{age:2}}, 'age'), ['2']); - assertArrayEqual(minKeys({1:{age:2},2:{age:5}}, 'height'), ['1', '2']); + assertEqual(maxKey({1:{age:5},2:{age:2}}, 'age'), '1'); + assertEqual(maxKey({1:{age:2},2:{age:5}}, 'height'), '1'); }); it('should handle deep properties', function() { - assertArrayEqual(minKeys({ + assertEqual(maxKey({ 1: { profile: { likes: 20 } }, 2: { profile: { likes: 17 } }, 3: { profile: { likes: 36 } }, - }, 'profile.likes'), ['2']); - assertArrayEqual(minKeys({ + }, 'profile.likes'), '3'); + assertEqual(maxKey({ 1: { posts: [{ views: 80 }] }, 2: { posts: [{ views: 97 }] }, 3: { posts: [{ views: 12 }] }, - }, 'posts[0].views'), ['3']); - assertArrayEqual(minKeys({ + }, 'posts[0].views'), '2'); + assertEqual(maxKey({ 1: { posts: [{ views: 80 }] }, 2: { posts: [{ views: 97 }] }, 3: { posts: [{ views: 12 }] }, - }, 'posts.0.views'), ['3']); + }, 'posts.0.views'), '2'); }); it('should handle infinite values', function() { - assertArrayEqual(minKeys({a:Infinity}), ['a']); - assertArrayEqual(minKeys({a:-Infinity}), ['a']); + assertEqual(maxKey({a:Infinity}), 'a'); + assertEqual(maxKey({a:-Infinity}), 'a'); }); it('should pass correct params', function() { - minKeys({a:1}, function (key, val, obj) { + maxKey({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); assertObjectEqual(obj, {a:1}); @@ -1345,13 +1345,13 @@ namespace('Object', function () { }); it('should handle irregular input', function() { - assertArrayEqual(minKeys({}), []); - assertArrayEqual(minKeys({a:'a',b:'b',c:'c'}), ['a']); - assertArrayEqual(minKeys({a:null, b:false}), ['a']); - assertError(function() { minKeys(); }); - assertError(function() { minKeys(null); }); - assertError(function() { minKeys(1); }); - assertError(function() { minKeys('a'); }); + assertEqual(maxKey({}), undefined); + assertEqual(maxKey({a:'a',b:'b',c:'c'}), 'c'); + assertEqual(maxKey({a:null, b:false}), 'a'); + assertError(function() { maxKey(); }); + assertError(function() { maxKey(null); }); + assertError(function() { maxKey(1); }); + assertError(function() { maxKey('a'); }); }); }); From e8086c9c76999b3f06889f160e72044b11dae2d7 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 3 Sep 2020 19:07:02 +0900 Subject: [PATCH 085/191] Added Object.reduce --- src/object/define.js | 1 + src/object/forEach.js | 5 ++- src/object/methods.js | 1 + src/object/reduce.js | 47 ++++++++++++++++++++ test/OLD/tests/enumerable.js | 84 ------------------------------------ test/tests/object.js | 53 +++++++++++++++++++++++ 6 files changed, 105 insertions(+), 86 deletions(-) create mode 100644 src/object/reduce.js delete mode 100644 test/OLD/tests/enumerable.js diff --git a/src/object/define.js b/src/object/define.js index 9e3925e94..c0f8222b6 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -18,6 +18,7 @@ defineInstance('maxKeys', methods.maxKeys); defineInstance('minKey', methods.minKey); defineInstance('minKeys', methods.minKeys); defineInstance('none', methods.none); +defineInstance('reduce', methods.reduce); defineInstance('remove', methods.remove); defineInstance('removeValues', methods.removeValues); defineInstance('some', methods.some); diff --git a/src/object/forEach.js b/src/object/forEach.js index 67bfbef54..7a13112a4 100644 --- a/src/object/forEach.js +++ b/src/object/forEach.js @@ -1,4 +1,5 @@ import { assertObject, assertFunction } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; /** * Iterates over each enumerable, non-inherited property of the object. @@ -22,8 +23,8 @@ import { assertObject, assertFunction } from '../util/assertions'; export default function forEach(obj, fn) { assertObject(obj); assertFunction(fn); - for (let [key, val] of Object.entries(obj)) { + forEachProperty(obj, (key, val) => { fn(key, val, obj); - } + }); } diff --git a/src/object/methods.js b/src/object/methods.js index 21652071b..21d494e48 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -15,6 +15,7 @@ export { default as maxKeys } from './maxKeys'; export { default as minKey } from './minKey'; export { default as minKeys } from './minKeys'; export { default as none } from './none'; +export { default as reduce } from './reduce'; export { default as remove } from './remove'; export { default as removeValues } from './removeValues'; export { default as some } from './some'; diff --git a/src/object/reduce.js b/src/object/reduce.js new file mode 100644 index 000000000..c79f575aa --- /dev/null +++ b/src/object/reduce.js @@ -0,0 +1,47 @@ +import { assertObject, assertFunction } from '../util/assertions'; +import { forEachProperty } from '../util/helpers'; + +/** + * Executes a reducer function for each property of the object, resulting in a + * single output value. + * + * @param {Object} obj - The object. + * @param {eachFn} fn - The function to be called for each iteration. + * @param {any} [initial] - The value to be used as the initial accumulator on + * the first iteration. If no argument is passed, the first value encountered + * will be used. If no argument is passed and the object is empty, will throw + * a TypeError. + * + * @returns {any} + * + * @callback reduceFn + * @param {any} acc - The accumulator value of the current iteration. + * @param {string} key - The key of the current iteration. + * @param {any} val - The value of the current iteration. + * @param {Object} obj - A reference to the object. + * + * @example + * + * Object.reduce({a:1,b:2,c:3}, (acc, key, val) => { + * return acc + val; + * }, 0); -> 6 + * + **/ +export default function reduce(obj, fn, initial) { + assertObject(obj); + assertFunction(fn); + let acc = initial; + let assign = arguments.length === 2; + forEachProperty(obj, (key, val) => { + if (assign) { + acc = val; + assign = false; + } else { + acc = fn(acc, key, val, obj); + } + }); + if (assign) { + throw new TypeError('Empty object with no initial value'); + } + return acc; +} diff --git a/test/OLD/tests/enumerable.js b/test/OLD/tests/enumerable.js deleted file mode 100644 index 0c4433933..000000000 --- a/test/OLD/tests/enumerable.js +++ /dev/null @@ -1,84 +0,0 @@ -namespace('Object', function() { - 'use strict'; - - var obj1 = { - foo: 2, - bar: 4, - moo: 6, - car: 6 - } - - var obj2 = { - foo: { age: 11 }, - bar: { age: 22 }, - moo: { age: 33 }, - car: { age: 44 } - } - - var deepObj2 = { - foo: { user: {age: 11 } }, - bar: { user: {age: 22 } }, - moo: { user: {age: 33 } }, - car: { user: {age: 44 } } - } - - var obj3 = testClone(obj1); obj3['blue'] = 4; - var obj4 = testClone(obj2); obj4['blue'] = {age:11}; - var deepObj4 = testClone(deepObj2); deepObj4['blue'] = {user:{age:11}}; - - method('reduce', function() { - var fn = function(a, b) { - return a * b; - } - var obj = { - foo: 2, - bar: 4, - moo: 6 - } - - test(obj, [fn], 48, 'reduced value should be 48'); - test(obj, [fn, 10], 480, 'reduced value with initial should be 480'); - test(obj, [function() {}], undefined, 'reduced with anonymous function'); - test(obj, [function() {}, 10], undefined, 'reduced with anonymous function and initial'); - - // These tests are making an assumption that objects - // will be iterated over in a specific order. This is - // incorrect, but simplifies the tests greatly, so going - // with this for now. - var count = 0; - var expectedA = [2, -2]; - var expectedB = [4, 6]; - var expectedKeys = ['bar','moo']; - var checkArgs = function(a, b, key, obj) { - equal(a, expectedA[count], 'a should be equal'); - equal(b, expectedB[count], 'key should be equal'); - equal(key, expectedKeys[count], 'key should be equal'); - equal(obj, obj, 'object should remain same as original'); - count++; - return a - b; - } - var result = run(obj, 'reduce', [checkArgs]); - equal(count, 2, 'Should have ran twice'); - equal(result, -8, 'Result of subtracted should be -8'); - - var count = 0; - var expectedA = [18, 16, 12]; - var expectedB = [2, 4, 6]; - var expectedKeys = ['foo', 'bar','moo']; - var checkArgs = function(a, b, key, obj) { - equal(a, expectedA[count], 'a should be equal'); - equal(b, expectedB[count], 'key should be equal'); - equal(key, expectedKeys[count], 'key should be equal'); - equal(obj, obj, 'object should remain same as original'); - count++; - return a - b; - } - var result = run(obj, 'reduce', [checkArgs, 18]); - equal(count, 3, 'Should have ran twice'); - equal(result, 6, 'Result of subtracted should be -8'); - - raisesError(function(){ run(obj, 'reduce', []) }, 'no function raises an error'); - - }); - -}); diff --git a/test/tests/object.js b/test/tests/object.js index ff4507cdd..47551487b 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -1416,4 +1416,57 @@ namespace('Object', function () { }); + describeInstance('reduce', function(reduce) { + + it('should accumulate the result of the passed function', function() { + assertEqual(reduce({a:1}, () => 1), 1); + assertEqual(reduce({a:1,b:2,c:3}, () => 1), 1); + }); + + it('should be able to perform basic sum', function() { + assertEqual(reduce({a:1,b:2,c:3}, (acc, key, val) => acc + val), 6); + assertEqual(reduce({a:1,b:2,c:3}, (acc, key, val) => acc + val, 0), 6); + }); + + it('should have correct arguments when no initial value passed', function() { + reduce({a:1,b:2}, (acc, key, val, obj) => { + assertEqual(acc, 1); + assertEqual(key, 'b'); + assertEqual(val, 2); + assertObjectEqual(obj, {a:1,b:2}); + }); + reduce({1:{name:'John'},2:{name:'Frank'}}, (acc, key, val, obj) => { + assertObjectEqual(acc, {name:'John'}); + assertEqual(key, '2'); + assertObjectEqual(val, {name:'Frank'}); + assertObjectEqual(obj, {1:{name:'John'},2:{name:'Frank'}}); + }); + }); + + it('should have correct arguments when initial value passed', function() { + reduce({a:1}, (acc, key, val, obj) => { + assertEqual(acc, 2); + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }, 2); + reduce({1:{name:'John'}}, (acc, key, val, obj) => { + assertObjectEqual(acc, {name:'Frank'}); + assertEqual(key, '1'); + assertObjectEqual(val, {name:'John'}); + assertObjectEqual(obj, {1:{name:'John'}}); + }, {name:'Frank'}); + }); + + it('should correctly iterate when initial value is undefined', function() { + reduce({a:1}, (acc, key, val, obj) => { + assertEqual(acc, undefined); + }, undefined); + }); + + it('should error when object empty and no initial value', function() { + assertError(() => { reduce({}, () => {}) }, TypeError); + }); + }); + }); From f2abb404fd7adcd06d12cba75ed98ef3327165f8 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 00:44:27 +0900 Subject: [PATCH 086/191] Added Array#isEmpty, Object.isEmpty, and Object.size --- src/array/define.js | 1 + src/array/isEmpty.js | 19 +++++++++++++ src/array/methods.js | 1 + src/object/define.js | 2 ++ src/object/isEmpty.js | 19 +++++++++++++ src/object/methods.js | 2 ++ src/object/size.js | 20 ++++++++++++++ test/OLD/tests/array.js | 13 --------- test/OLD/tests/object.js | 49 --------------------------------- test/tests/array.js | 24 +++++++++++++++++ test/tests/object.js | 58 ++++++++++++++++++++++++++++++++++++++++ 11 files changed, 146 insertions(+), 62 deletions(-) create mode 100644 src/array/isEmpty.js create mode 100644 src/object/isEmpty.js create mode 100644 src/object/size.js diff --git a/src/array/define.js b/src/array/define.js index 7743cf886..d4445dd29 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -10,6 +10,7 @@ defineInstance('filter', methods.filter); defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); +defineInstance('isEmpty', methods.isEmpty); defineInstance('map', methods.map); defineInstance('max', methods.max); defineInstance('maxAll', methods.maxAll); diff --git a/src/array/isEmpty.js b/src/array/isEmpty.js new file mode 100644 index 000000000..dcc56811b --- /dev/null +++ b/src/array/isEmpty.js @@ -0,0 +1,19 @@ +import { assertArray } from '../util/assertions'; + +/** + * Returns true if the array length is zero. + * + * @param {Array} arr - The array. + * + * @returns {boolean} + * + * @example + * + * [].isEmpty() -> true + * ['a'].isEmpty() -> false + * + **/ +export default function isEmpty(arr) { + assertArray(arr); + return arr.length === 0; +} diff --git a/src/array/methods.js b/src/array/methods.js index cb548185c..5a23699c5 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -7,6 +7,7 @@ export { default as filter } from './filter'; export { default as find } from './find'; export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; +export { default as isEmpty } from './isEmpty'; export { default as map } from './map'; export { default as max } from './max'; export { default as maxAll } from './maxAll'; diff --git a/src/object/define.js b/src/object/define.js index c0f8222b6..d051dd180 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -10,6 +10,7 @@ defineInstance('filter', methods.filter); defineInstance('filterValues', methods.filterValues); defineInstance('findKey', methods.findKey); defineInstance('forEach', methods.forEach); +defineInstance('isEmpty', methods.isEmpty); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); defineInstance('median', methods.median); @@ -21,5 +22,6 @@ defineInstance('none', methods.none); defineInstance('reduce', methods.reduce); defineInstance('remove', methods.remove); defineInstance('removeValues', methods.removeValues); +defineInstance('size', methods.size); defineInstance('some', methods.some); defineInstance('sum', methods.sum); diff --git a/src/object/isEmpty.js b/src/object/isEmpty.js new file mode 100644 index 000000000..b40bc04f9 --- /dev/null +++ b/src/object/isEmpty.js @@ -0,0 +1,19 @@ +import { assertObject } from '../util/assertions'; + +/** + * Returns true if the object has no non-inherited, enumerable properties. + * + * @param {Object} obj - The object. + * + * @returns {boolean} + * + * @example + * + * Object.isEmpty({}) -> true + * Object.isEmpty({a:1}) -> false + * + **/ +export default function isEmpty(obj) { + assertObject(obj); + return Object.keys(obj).length === 0; +} diff --git a/src/object/methods.js b/src/object/methods.js index 21d494e48..05a9b4200 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -7,6 +7,7 @@ export { default as filter } from './filter'; export { default as filterValues } from './filterValues'; export { default as findKey } from './findKey'; export { default as forEach } from './forEach'; +export { default as isEmpty } from './isEmpty'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; export { default as median } from './median'; @@ -18,5 +19,6 @@ export { default as none } from './none'; export { default as reduce } from './reduce'; export { default as remove } from './remove'; export { default as removeValues } from './removeValues'; +export { default as size } from './size'; export { default as some } from './some'; export { default as sum } from './sum'; diff --git a/src/object/size.js b/src/object/size.js new file mode 100644 index 000000000..e5801a11e --- /dev/null +++ b/src/object/size.js @@ -0,0 +1,20 @@ +import { assertObject } from '../util/assertions'; + +/** + * Returns the number of non-inherited, enumerable properties in the object. + * + * @param {Object} obj - The object. + * + * @returns {number} + * + * @example + * + * Object.size({}) -> 0 + * Object.size({a:1}) -> 1 + * Object.size({a:1,b:2}) -> 2 + * + **/ +export default function size(obj) { + assertObject(obj); + return Object.keys(obj).length; +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 5ab778539..7b98dbf8b 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -1607,18 +1607,5 @@ namespace('Array', function () { }); - method('isEmpty', function() { - - test([1,2,3], false, '1,2,3'); - test([], true, 'empty array'); - test([null], false, '[null]'); - test(oneUndefined, false, '[undefined]'); - test([null,null], false, '[null,null]'); - test(twoUndefined, false, '[undefined,undefined]'); - test([false,false], false, '[false,false]'); - test([0,0], false, '[0,0]'); - - }); - }); diff --git a/test/OLD/tests/object.js b/test/OLD/tests/object.js index afc0180b0..a22e591bd 100644 --- a/test/OLD/tests/object.js +++ b/test/OLD/tests/object.js @@ -2176,53 +2176,4 @@ namespace('Object', function () { equal(run(obj2, 'reject', ['moo']).foo, obj, 'rejected values should be equal by reference'); }); - method('isEmpty', function() { - test({}, [], true, 'object is empty'); - test({ broken: 'wear' }, [], false, 'object is not empty'); - test({ length: 0 }, [], false, 'simple object with length property is not empty'); - test({ foo: null }, [], false, 'null is still counted'); - test({ foo: undefined }, [], false, 'undefined is still counted'); - test({ foo: NaN }, [], false, 'undefined is still counted'); - test([], [], true, 'empty array is empty'); - test('', [], true, 'empty string is empty'); - test(new String(''), [], true, 'empty string object is empty'); - test('wasabi', [], false, 'non-empty string is not empty'); - test(new String('wasabi'), [], false, 'non-empty string object is not empty'); - test(NaN, [], true, 'NaN is empty'); - test(8, [], true, '8 is empty'); - test(new Number(8), [], true, '8 object is empty'); - test(Object, [null], true, 'null is empty'); - test(Object, [undefined], true, 'undefined is empty'); - }); - - method('size', function() { - test({}, [], 0, 'empty object'); - test({foo:'bar'}, [], 1, '1 property'); - test({foo:'bar',moo:'car'}, [], 2, '2 properties'); - test({foo:1}, [], 1, 'numbers'); - test({foo:/bar/}, [], 1, 'regexes'); - test({foo:function(){}}, [], 1, 'functions'); - test({foo:{bar:'car'}}, [], 1, 'nested object'); - test({foo:[1]}, [], 1, 'nested array'); - test(['a'], [], 1, 'array'); - test(['a','b'], [], 2, 'array 2 elements'); - test(['a','b','c'], [], 3, 'array 3 elements'); - test('foo', [], 3, 'string primitive'); - test(new String('foo'), [], 3, 'string object'); - test(1, [], 0, 'number primitive'); - test(new Number(1), [], 0, 'number object'); - test(true, [], 0, 'boolean primitive'); - test(new Boolean(true), [], 0, 'boolean object'); - - test(Object, [null], 0, 'null'); - test(Object, [undefined], 0, 'undefined'); - - var Foo = function(){}; - test(new Foo, [], 0, 'class instances'); - - var Foo = function(a){ this.a = a; }; - test(new Foo, [], 1, 'class instances with a single property'); - - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index 9b88d4245..bfa79973e 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1469,4 +1469,28 @@ namespace('Array', function() { }); + describeInstance('isEmpty', function(isEmpty) { + + it('should report true for empty arrays', function() { + assertTrue(isEmpty([])); + }); + + it('should report false for non-empty arrays', function() { + assertFalse(isEmpty([1])); + assertFalse(isEmpty([null])); + assertFalse(isEmpty([undefined])); + }); + + it('should report false for sparse arrays', function() { + assertFalse(isEmpty([,])); + }); + + it('should handle irregular input', function() { + assertError(() => { isEmpty(null); }); + assertError(() => { isEmpty('8'); }); + assertError(() => { isEmpty(8); }); + }); + + }); + }); diff --git a/test/tests/object.js b/test/tests/object.js index 47551487b..d06b1d3d3 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -1469,4 +1469,62 @@ namespace('Object', function () { }); }); + describeInstance('isEmpty', function(isEmpty) { + + it('should report true for empty objects', function() { + assertTrue(isEmpty({})); + }); + + it('should report false for non-empty objects', function() { + assertFalse(isEmpty({a:1})); + assertFalse(isEmpty({a:null})); + assertFalse(isEmpty({a:undefined})); + }); + + it('should work correctly on class instances', function() { + function Foo(a) { + if (a) { + this.a = a; + } + }; + assertTrue(isEmpty(new Foo)); + assertFalse(isEmpty(new Foo(1))); + }); + + it('should handle irregular input', function() { + assertError(() => { isEmpty(null); }); + assertError(() => { isEmpty('8'); }); + assertError(() => { isEmpty(8); }); + }); + + }); + + describeInstance('size', function(size) { + + it('should report correct size of objects', function() { + assertEqual(size({}), 0); + assertEqual(size({a:1}), 1); + assertEqual(size({a:1,b:2,c:3}), 3); + assertEqual(size({a:null}), 1); + assertEqual(size({a:undefined}), 1); + }); + + it('should work correctly on class instances', function() { + function Foo(a) { + if (a) { + this.a = a; + } + }; + assertEqual(size(new Foo), 0); + assertEqual(size(new Foo(1)), 1); + }); + + it('should handle irregular input', function() { + assertError(() => { size(null); }); + assertError(() => { size('8'); }); + assertError(() => { size(8); }); + }); + + }); + }); From 4a29d3ac340c2a840197b1a587b8d73b19785015 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 01:49:19 +0900 Subject: [PATCH 087/191] Added Object.reject/rejectKeys/rejectValues Added Object.select/selectKeys/selectValues Added Object.removeKeys/removeValues Updated Object.remove to be an alias for removeKeys Removed Object.filter Removed Object.exclude --- CHANGELOG.md | 9 +- src/object/define.js | 11 +- src/object/exclude.js | 29 --- src/object/filter.js | 29 --- src/object/methods.js | 11 +- src/object/none.js | 7 +- src/object/reject.js | 9 + src/object/rejectKeys.js | 31 +++ .../{excludeValues.js => rejectValues.js} | 10 +- src/object/remove.js | 30 +-- src/object/removeKeys.js | 33 +++ src/object/select.js | 9 + src/object/selectKeys.js | 31 +++ .../{filterValues.js => selectValues.js} | 10 +- src/util/keys.js | 14 ++ test/OLD/tests/object.js | 69 ------ test/helpers/suite.js | 14 +- test/tests/object.js | 232 ++++++++++-------- 18 files changed, 296 insertions(+), 292 deletions(-) delete mode 100644 src/object/exclude.js delete mode 100644 src/object/filter.js create mode 100644 src/object/reject.js create mode 100644 src/object/rejectKeys.js rename src/object/{excludeValues.js => rejectValues.js} (81%) create mode 100644 src/object/removeKeys.js create mode 100644 src/object/select.js create mode 100644 src/object/selectKeys.js rename src/object/{filterValues.js => selectValues.js} (81%) create mode 100644 src/util/keys.js diff --git a/CHANGELOG.md b/CHANGELOG.md index d42209071..317928e9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,14 +87,17 @@ call `Function#lock` first in the chain to achieve the same effect. - Changed `Object.map` to be `Object.mapValues` with an equivalent `Objecxt.mapKeys`. - Changed `Object` method callbacks to pass key first. - Renamed `Object.find` to `Object.findKey`. -- `Object.filter` now filters by key. Equivalent is now `Object.filterValues`. -- `Object.remove` now removes by key. Equivalent is now `Object.removeValues`. -- `Object.exclude` now excludes by key. Equivalent is now `Object.excludeValues`. +- Removed `Object.filter`. Equivalent is now `Object.selectValues`. +- Removed `Object.exclude`. Equivalent is now `Object.rejectValues`. +- `Object.remove` now removes by key (alias for `Object.removeKeys`). + Equivalent is now `Object.removeValues`. - `Object.min` and `Object.max` are now `Object.minKey` and `Object.maxKey`. - `Object.min` and `Object.max` with `all` flag are now refactored to `Object.minKeys` and `Object.maxKeys`. - `Array#min` and `Array#max` with `all` flag are now refactored to `Array#minAll` and `Array#maxAll`. +- Changed `Object.select` and `Object.reject` now no longer accepts an object + to select keys by. Use `Object.keys` on the input object for this case. TODO: diff --git a/src/object/define.js b/src/object/define.js index d051dd180..5856bf2c9 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -4,10 +4,6 @@ import * as methods from './methods'; defineInstance('average', methods.average); defineInstance('count', methods.count); defineInstance('every', methods.every); -defineInstance('exclude', methods.exclude); -defineInstance('excludeValues', methods.excludeValues); -defineInstance('filter', methods.filter); -defineInstance('filterValues', methods.filterValues); defineInstance('findKey', methods.findKey); defineInstance('forEach', methods.forEach); defineInstance('isEmpty', methods.isEmpty); @@ -20,8 +16,15 @@ defineInstance('minKey', methods.minKey); defineInstance('minKeys', methods.minKeys); defineInstance('none', methods.none); defineInstance('reduce', methods.reduce); +defineInstance('reject', methods.reject); +defineInstance('rejectKeys', methods.rejectKeys); +defineInstance('rejectValues', methods.rejectValues); defineInstance('remove', methods.remove); +defineInstance('removeKeys', methods.removeKeys); defineInstance('removeValues', methods.removeValues); +defineInstance('select', methods.select); +defineInstance('selectKeys', methods.selectKeys); +defineInstance('selectValues', methods.selectValues); defineInstance('size', methods.size); defineInstance('some', methods.some); defineInstance('sum', methods.sum); diff --git a/src/object/exclude.js b/src/object/exclude.js deleted file mode 100644 index 677000445..000000000 --- a/src/object/exclude.js +++ /dev/null @@ -1,29 +0,0 @@ -import { assertObject } from '../util/assertions'; -import { forEachProperty } from '../util/helpers'; - -/** - * Returns a new object with keys not matching input. - * - * @param {Object} obj - The object. - * @param {...string|Array} - The keys to be excluded. May be an array. - * - * @returns {Object} - * - * @example - * - * Object.exclude({a:1,b:2}, 'a') -> {b:2} - * Object.exclude({a:1,b:2}, 'a', 'b') -> {} - * Object.exclude({a:1,b:1}, ['a', 'b']) -> {} - * - **/ -export default function exclude(obj, ...args) { - assertObject(obj); - args = args.flat(); - const result = {}; - forEachProperty(obj, (key, val) => { - if (!args.includes(key)) { - result[key] = val; - } - }); - return result; -} diff --git a/src/object/filter.js b/src/object/filter.js deleted file mode 100644 index b20075d46..000000000 --- a/src/object/filter.js +++ /dev/null @@ -1,29 +0,0 @@ -import { assertObject } from '../util/assertions'; -import { hasOwnProperty } from '../util/helpers'; - -/** - * Returns a new object with keys matching input. - * - * @param {Object} obj - The object. - * @param {...string|Array} - The keys to be included. May be an array. - * - * @returns {Object} - * - * @example - * - * Object.filter({a:1,b:2}, 'a') -> {a:1} - * Object.filter({a:1,b:2}, 'a', 'b') -> {a:1,b:2} - * Object.filter({a:1,b:1}, ['a', 'b']) -> {a:1,b:2} - * - **/ -export default function filter(obj, ...args) { - assertObject(obj); - args = args.flat(); - const result = {}; - for (let arg of args) { - if (hasOwnProperty(obj, arg)) { - result[arg] = obj[arg]; - } - } - return result; -} diff --git a/src/object/methods.js b/src/object/methods.js index 05a9b4200..e7550c3fe 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -1,10 +1,6 @@ export { default as average } from './average'; export { default as count } from './count'; export { default as every } from './every'; -export { default as exclude } from './exclude'; -export { default as excludeValues } from './excludeValues'; -export { default as filter } from './filter'; -export { default as filterValues } from './filterValues'; export { default as findKey } from './findKey'; export { default as forEach } from './forEach'; export { default as isEmpty } from './isEmpty'; @@ -17,8 +13,15 @@ export { default as minKey } from './minKey'; export { default as minKeys } from './minKeys'; export { default as none } from './none'; export { default as reduce } from './reduce'; +export { default as reject } from './reject'; +export { default as rejectKeys } from './rejectKeys'; +export { default as rejectValues } from './rejectValues'; export { default as remove } from './remove'; +export { default as removeKeys } from './removeKeys'; export { default as removeValues } from './removeValues'; +export { default as select } from './select'; +export { default as selectKeys } from './selectKeys'; +export { default as selectValues } from './selectValues'; export { default as size } from './size'; export { default as some } from './some'; export { default as sum } from './sum'; diff --git a/src/object/none.js b/src/object/none.js index 74e89f874..81b337342 100644 --- a/src/object/none.js +++ b/src/object/none.js @@ -24,10 +24,7 @@ import some from './some'; * }); -> true if no users are older than 30 * **/ -export default function none(obj, match) { +export default function none(obj, ...args) { assertObject(obj); - if (arguments.length === 1) { - throw new Error('Match parameter required'); - } - return !some(obj, match); + return !some(obj, ...args); } diff --git a/src/object/reject.js b/src/object/reject.js new file mode 100644 index 000000000..26c8dbfc0 --- /dev/null +++ b/src/object/reject.js @@ -0,0 +1,9 @@ +import rejectKeys from './rejectKeys'; + +/** + * Alias for rejectKeys. + * + **/ +export default function reject(...args) { + return rejectKeys(...args); +} diff --git a/src/object/rejectKeys.js b/src/object/rejectKeys.js new file mode 100644 index 000000000..db9e9c338 --- /dev/null +++ b/src/object/rejectKeys.js @@ -0,0 +1,31 @@ +import { assertObject } from '../util/assertions'; +import { getKeyMatcher } from '../util/keys'; +import { forEachProperty } from '../util/helpers'; + +/** + * Returns a new object with keys not matching input. + * + * @param {Object} obj - The object. + * @param {...string|RegExp|Array} - The keys to be rejected. May be an array + * or a regex to test keys. + * + * @returns {Object} + * + * @example + * + * Object.rejectKeys({a:1,b:2}, 'a') -> {b:2} + * Object.rejectKeys({a:1,b:2}, 'a', 'b') -> {} + * Object.rejectKeys({a:1,b:1}, ['a', 'b']) -> {} + * + **/ +export default function rejectKeys(obj, ...args) { + assertObject(obj); + const result = {}; + const matcher = getKeyMatcher(args); + forEachProperty(obj, (key, val) => { + if (!matcher(key, obj)) { + result[key] = val; + } + }); + return result; +} diff --git a/src/object/excludeValues.js b/src/object/rejectValues.js similarity index 81% rename from src/object/excludeValues.js rename to src/object/rejectValues.js index 3404f27aa..0721bb7fd 100644 --- a/src/object/excludeValues.js +++ b/src/object/rejectValues.js @@ -17,15 +17,15 @@ import { getMatcher } from '../util/matchers'; * * @example * - * Object.excludeValues({a:1,b:2}, 1) -> {b:2} - * Object.excludeValues({a:1,b:1}, 3) -> {a:1,b:1} - * Object.excludeValues({a:'a',b:'b'}, /[a-f]) -> {} - * Object.excludeValues(usersById, user => { + * Object.rejectValues({a:1,b:2}, 1) -> {b:2} + * Object.rejectValues({a:1,b:1}, 3) -> {a:1,b:1} + * Object.rejectValues({a:'a',b:'b'}, /[a-f]) -> {} + * Object.rejectValues(usersById, user => { * return user.age > 30; * }); -> an object with all users under 30 * **/ -export default function excludeValues(obj, match) { +export default function rejectValues(obj, match) { assertObject(obj); if (arguments.length === 1) { throw new Error('Match parameter required'); diff --git a/src/object/remove.js b/src/object/remove.js index eb91cbcc2..96ec31b99 100644 --- a/src/object/remove.js +++ b/src/object/remove.js @@ -1,31 +1,9 @@ -import { assertObject } from '../util/assertions'; -import { hasOwnProperty } from '../util/helpers'; +import removeKeys from './removeKeys'; /** - * Returns a new object with keys not matching input. - * - * @extra This method will modify the object! For a non-destructive alias, use - * `exclude`. - * - * @param {Object} obj - The object. - * @param {...string|Array} - The keys to be removed. May be an array. - * - * @returns {Object} - * - * @example - * - * Object.remove({a:1,b:2}, 'a') -> {b:2} - * Object.remove({a:1,b:2}, 'a', 'b') -> {} - * Object.remove({a:1,b:1}, ['a', 'b']) -> {} + * Alias for removeKeys. * **/ -export default function remove(obj, ...args) { - assertObject(obj); - args = args.flat(); - for (let arg of args) { - if (hasOwnProperty(obj, arg)) { - delete obj[arg]; - } - } - return obj; +export default function remove(...args) { + return removeKeys(...args); } diff --git a/src/object/removeKeys.js b/src/object/removeKeys.js new file mode 100644 index 000000000..ddb7e106c --- /dev/null +++ b/src/object/removeKeys.js @@ -0,0 +1,33 @@ +import { assertObject } from '../util/assertions'; +import { getKeyMatcher } from '../util/keys'; +import { forEachProperty } from '../util/helpers'; + +/** + * Returns a new object with keys not matching input. + * + * @extra This method will modify the object! For a non-destructive alias, use + * `exclude`. + * + * @param {Object} obj - The object. + * @param {...string|RegExp|Array} - The keys to be removed. May be an array + * or a regex to test keys. + * + * @returns {Object} + * + * @example + * + * Object.removeKeys({a:1,b:2}, 'a') -> {b:2} + * Object.removeKeys({a:1,b:2}, 'a', 'b') -> {} + * Object.removeKeys({a:1,b:1}, ['a', 'b']) -> {} + * + **/ +export default function removeKeys(obj, ...args) { + assertObject(obj); + const matcher = getKeyMatcher(args); + forEachProperty(obj, (key) => { + if (matcher(key, obj)) { + delete obj[key]; + } + }); + return obj; +} diff --git a/src/object/select.js b/src/object/select.js new file mode 100644 index 000000000..a57097861 --- /dev/null +++ b/src/object/select.js @@ -0,0 +1,9 @@ +import selectKeys from './selectKeys'; + +/** + * Alias for selectKeys. + * + **/ +export default function select(...args) { + return selectKeys(...args); +} diff --git a/src/object/selectKeys.js b/src/object/selectKeys.js new file mode 100644 index 000000000..76caace0a --- /dev/null +++ b/src/object/selectKeys.js @@ -0,0 +1,31 @@ +import { assertObject } from '../util/assertions'; +import { getKeyMatcher } from '../util/keys'; +import { forEachProperty } from '../util/helpers'; + +/** + * Returns a new object with keys matching input. + * + * @param {Object} obj - The object. + * @param {...string|RegExp|Array} - The keys to be selected. May be an array + * or a regex to test keys. + * + * @returns {Object} + * + * @example + * + * Object.selectKeys({a:1,b:2}, 'a') -> {a:1} + * Object.selectKeys({a:1,b:2}, 'a', 'b') -> {a:1,b:2} + * Object.selectKeys({a:1,b:1}, ['a', 'b']) -> {a:1,b:2} + * + **/ +export default function selectKeys(obj, ...args) { + assertObject(obj); + const result = {}; + const matcher = getKeyMatcher(args); + forEachProperty(obj, (key, val) => { + if (matcher(key, obj)) { + result[key] = val; + } + }); + return result; +} diff --git a/src/object/filterValues.js b/src/object/selectValues.js similarity index 81% rename from src/object/filterValues.js rename to src/object/selectValues.js index f42278403..29cd3b45e 100644 --- a/src/object/filterValues.js +++ b/src/object/selectValues.js @@ -17,15 +17,15 @@ import { getMatcher } from '../util/matchers'; * * @example * - * Object.filterValues({a:1,b:2}, 1) -> {a:1} - * Object.filterValues({a:1,b:1}, 3) -> {} - * Object.filterValues({a:'a',b:'b'}, /[a-f]) -> {a:'a',b:'b'} - * Object.filterValues(usersById, user => { + * Object.selectValues({a:1,b:2}, 1) -> {a:1} + * Object.selectValues({a:1,b:1}, 3) -> {} + * Object.selectValues({a:'a',b:'b'}, /[a-f]) -> {a:'a',b:'b'} + * Object.selectValues(usersById, user => { * return user.age > 30; * }); -> an object with all users over 30 * **/ -export default function filterValues(obj, match) { +export default function selectValues(obj, match) { assertObject(obj); if (arguments.length === 1) { throw new Error('Match parameter required'); diff --git a/src/util/keys.js b/src/util/keys.js new file mode 100644 index 000000000..3f744e075 --- /dev/null +++ b/src/util/keys.js @@ -0,0 +1,14 @@ +import { isRegExp } from './typeChecks'; + +export function getKeyMatcher(args) { + args = args.flat(); + return (key) => { + return args.some((arg) => { + if (isRegExp(arg)) { + return arg.test(key); + } else { + return arg == key; + } + }); + }; +} diff --git a/test/OLD/tests/object.js b/test/OLD/tests/object.js index a22e591bd..34e68325c 100644 --- a/test/OLD/tests/object.js +++ b/test/OLD/tests/object.js @@ -2107,73 +2107,4 @@ namespace('Object', function () { equal(result === obj, false, 'No arguments still produces new object'); }); - method('select', function() { - - var obj = { - one: 1, - two: 2, - three: 3, - four: 4, - five: 5 - }; - - var obj2 = { foo: obj }; - - test(obj, ['one'], { one: 1 }, 'one key'); - test(obj, ['foo'], {}, 'nonexistent key'); - test(obj, ['one', 'two'], { one: 1 }, 'does not accept enumerated arguments'); - test(obj, [['four', 'two']], { two: 2, four: 4 }, 'accepts multiple from array'); - test(obj, [['one', 'foo']], { one: 1 }, 'one existing one non-existing'); - test(obj, [['four', 'two']], { two: 2, four: 4 }, 'keys out of order'); - test(obj, [/o/], { one: 1, two: 2, four: 4 }, 'regex'); - test(obj, [/o$/], { two: 2 }, 'regex $'); - test(obj, [/^o/], { one: 1 }, '^ regex'); - test(obj, [/z/], {}, 'non-matching regex'); - test(obj, [{one:1}], {one:1}, 'finding object keys'); - test(obj, [{one:'foo'}], {one:1}, 'should match if keys exist'); - test(obj, [{}], {}, 'empty object'); - test(obj, [[/^o/, /^f/]], { one: 1, four: 4, five: 5 }, 'complex nested array of regexes'); - - test({a:1}, [{a:2}], {a:1}, 'selects keys in matcher object'); - test({a:1,b:2}, [{a:2}], {a:1}, 'does not select keys not in matcher'); - test({a:1}, [{a:2,b:3}], {a:1}, 'does not select keys not source'); - - equal(run(obj2, 'select', ['foo']).foo, obj, 'selected values should be equal by reference'); - - }); - - method('reject', function() { - - var obj = { - one: 1, - two: 2, - three: 3, - four: 4, - five: 5 - }; - - var obj2 = { foo: obj }; - - test(obj, ['one'], { two: 2, three: 3, four: 4, five: 5 }, 'one key'); - test(obj, ['foo'], obj, 'nonexistent key'); - test(obj, ['one', 'two'], { two: 2, three: 3, four: 4, five: 5 }, 'does not accept enumerated arguments'); - test(obj, [['four', 'two']], { one: 1, three: 3, five: 5 }, 'accepts multiple from array'); - test(obj, [['one', 'foo']], { two: 2, three: 3, four: 4, five: 5 }, 'one existing one non-existing'); - test(obj, [['four', 'two']], { one: 1, three: 3, five: 5 }, 'keys out of order'); - test(obj, [/o/], { three: 3, five: 5 }, 'regex'); - test(obj, [/o$/], { one: 1, three: 3, four: 4, five: 5 }, 'regex $'); - test(obj, [/^o/], { two: 2, three: 3, four: 4, five: 5 }, '^ regex'); - test(obj, [/z/], obj, 'non-matching regex'); - test(obj, [{one:1}], {two:2,three:3,four:4,five:5}, 'rejects matching key'); - test(obj, [{one:'foo'}], {two:2,three:3,four:4,five:5}, 'rejects matching key with different value'); - test(obj, [{}], obj, 'empty object'); - test(obj, [[/^o/, /^f/]], { two: 2, three: 3 }, 'complex nested array of regexes'); - - test({a:1}, [{a:2}], {}, 'rejects keys in matcher object'); - test({a:1}, [{b:2}], {a:1}, 'does not reject keys not in matcher'); - test({a:1}, [{b:1}], {a:1}, 'does not reject keys not source'); - - equal(run(obj2, 'reject', ['moo']).foo, obj, 'rejected values should be equal by reference'); - }); - }); diff --git a/test/helpers/suite.js b/test/helpers/suite.js index a41f9cd73..bc3048c43 100644 --- a/test/helpers/suite.js +++ b/test/helpers/suite.js @@ -26,12 +26,14 @@ } function withMethod(typeTest, suiteFn) { - return function(methodName, suite) { - var method = currentNamespace[methodName]; - var protoFn = currentNamespace.prototype[methodName]; - suiteFn(methodName, function() { - typeTest(protoFn); - suite(method); + return function(methodNames, suite) { + methodNames.split(',').forEach((methodName) => { + var method = currentNamespace[methodName]; + var protoFn = currentNamespace.prototype[methodName]; + suiteFn(methodName, function() { + typeTest(protoFn); + suite(method); + }); }); }; } diff --git a/test/tests/object.js b/test/tests/object.js index d06b1d3d3..2f80fa10e 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -545,46 +545,46 @@ namespace('Object', function () { }); - describeInstance('filterValues', function(filterValues) { + describeInstance('selectValues', function(selectValues) { it('should match by primitive matchers', function() { - assertObjectEqual(filterValues({a:'a',b:'b'}, 'a'), {a:'a'}); - assertObjectEqual(filterValues({a:'a',b:'b'}, 'c'), {}); - assertObjectEqual(filterValues({a:1,b:2}, 2), {b:2}); - assertObjectEqual(filterValues({a:1,b:2}, 3), {}); - assertObjectEqual(filterValues({a:true,b:false}, true), {a:true}); - assertObjectEqual(filterValues({a:true,b:true}, false), {}); + assertObjectEqual(selectValues({a:'a',b:'b'}, 'a'), {a:'a'}); + assertObjectEqual(selectValues({a:'a',b:'b'}, 'c'), {}); + assertObjectEqual(selectValues({a:1,b:2}, 2), {b:2}); + assertObjectEqual(selectValues({a:1,b:2}, 3), {}); + assertObjectEqual(selectValues({a:true,b:false}, true), {a:true}); + assertObjectEqual(selectValues({a:true,b:true}, false), {}); }); it('should match by regex', function() { - assertObjectEqual(filterValues({a:'a',b:'b'}, /[a-c]/), {a:'a',b:'b'}); - assertObjectEqual(filterValues({a:'a',b:'b'}, /[c-z]/), {}); + assertObjectEqual(selectValues({a:'a',b:'b'}, /[a-c]/), {a:'a',b:'b'}); + assertObjectEqual(selectValues({a:'a',b:'b'}, /[c-z]/), {}); }); it('should match by date', function() { var d1 = new Date(2020, 7, 28); var d2 = new Date(2020, 7, 29); - assertObjectEqual(filterValues({a:d1,b:d2}, new Date(2020, 7, 28)), {a:d1}); - assertObjectEqual(filterValues({a:d1,b:d1}, new Date(2020, 7, 29)), {}); + assertObjectEqual(selectValues({a:d1,b:d2}, new Date(2020, 7, 28)), {a:d1}); + assertObjectEqual(selectValues({a:d1,b:d1}, new Date(2020, 7, 29)), {}); }); it('should match by function', function() { - assertObjectEqual(filterValues({a:1,b:2}, (key, n) => n % 2 === 0), {b:2}); - assertObjectEqual(filterValues({a:1,b:3}, (key, n) => n % 2 === 0), {}); - assertObjectEqual(filterValues({a:1,b:2}, (key, n) => n > 5), {}); - assertObjectEqual(filterValues({a:1,b:2}, (key, n) => n > 0), {a:1,b:2}); + assertObjectEqual(selectValues({a:1,b:2}, (key, n) => n % 2 === 0), {b:2}); + assertObjectEqual(selectValues({a:1,b:3}, (key, n) => n % 2 === 0), {}); + assertObjectEqual(selectValues({a:1,b:2}, (key, n) => n > 5), {}); + assertObjectEqual(selectValues({a:1,b:2}, (key, n) => n > 0), {a:1,b:2}); }); it('should match by function when strictly equal', function() { var fn1 = function(){}; var fn2 = function(){}; - assertObjectEqual(filterValues({a:fn1, b:fn2}, fn2), {b:fn2}); - assertObjectEqual(filterValues({a:fn1, b:fn1}, fn2), {}); + assertObjectEqual(selectValues({a:fn1, b:fn2}, fn2), {b:fn2}); + assertObjectEqual(selectValues({a:fn1, b:fn1}, fn2), {}); }); it('should match by fuzzy matching', function() { assertObjectEqual( - filterValues({ + selectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, @@ -592,13 +592,13 @@ namespace('Object', function () { ), { 1: { name:'Frank'} }, ); - assertObjectEqual(filterValues({ + assertObjectEqual(selectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, {name:'Robert'}), {}, ); - assertObjectEqual(filterValues({ + assertObjectEqual(selectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, {name:/^[A-J]/}), @@ -607,7 +607,7 @@ namespace('Object', function () { 2: { name:'James'}, }, ); - assertObjectEqual(filterValues({ + assertObjectEqual(selectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, {name:/^[K-Z]/}), @@ -616,7 +616,7 @@ namespace('Object', function () { }); it('should pass correct params', function() { - filterValues({a:1}, function (key, val, obj) { + selectValues({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); assertObjectEqual(obj, {a:1}); @@ -625,60 +625,60 @@ namespace('Object', function () { it('should not modify the object', function() { const obj = {}; - assertEqual(obj === filterValues(obj, 1), false); + assertEqual(obj === selectValues(obj, 1), false); }); it('should handle irregular input', function() { - assertObjectEqual(filterValues({a:1}, null), {}); - assertObjectEqual(filterValues({a:1}, NaN), {}); - assertError(function() { filterValues({}); }); - assertError(function() { filterValues(null); }); - assertError(function() { filterValues('a'); }); - assertError(function() { filterValues(1); }); + assertObjectEqual(selectValues({a:1}, null), {}); + assertObjectEqual(selectValues({a:1}, NaN), {}); + assertError(function() { selectValues({}); }); + assertError(function() { selectValues(null); }); + assertError(function() { selectValues('a'); }); + assertError(function() { selectValues(1); }); }); }); - describeInstance('excludeValues', function(excludeValues) { + describeInstance('rejectValues', function(rejectValues) { it('should match by primitive matchers', function() { - assertObjectEqual(excludeValues({a:'a',b:'b'}, 'a'), {b:'b'}); - assertObjectEqual(excludeValues({a:'a',b:'b'}, 'c'), {a:'a',b:'b'}); - assertObjectEqual(excludeValues({a:1,b:2}, 2), {a:1}); - assertObjectEqual(excludeValues({a:1,b:2}, 3), {a:1,b:2}); - assertObjectEqual(excludeValues({a:true,b:false}, true), {b:false}); - assertObjectEqual(excludeValues({a:true,b:true}, false), {a:true,b:true}); + assertObjectEqual(rejectValues({a:'a',b:'b'}, 'a'), {b:'b'}); + assertObjectEqual(rejectValues({a:'a',b:'b'}, 'c'), {a:'a',b:'b'}); + assertObjectEqual(rejectValues({a:1,b:2}, 2), {a:1}); + assertObjectEqual(rejectValues({a:1,b:2}, 3), {a:1,b:2}); + assertObjectEqual(rejectValues({a:true,b:false}, true), {b:false}); + assertObjectEqual(rejectValues({a:true,b:true}, false), {a:true,b:true}); }); it('should match by regex', function() { - assertObjectEqual(excludeValues({a:'a',b:'b'}, /[a-c]/), {}); - assertObjectEqual(excludeValues({a:'a',b:'b'}, /[c-z]/), {a:'a',b:'b'}); + assertObjectEqual(rejectValues({a:'a',b:'b'}, /[a-c]/), {}); + assertObjectEqual(rejectValues({a:'a',b:'b'}, /[c-z]/), {a:'a',b:'b'}); }); it('should match by date', function() { var d1 = new Date(2020, 7, 28); var d2 = new Date(2020, 7, 29); - assertObjectEqual(excludeValues({a:d1,b:d2}, new Date(2020, 7, 28)), {b:d2}); - assertObjectEqual(excludeValues({a:d1,b:d1}, new Date(2020, 7, 29)), {a:d1,b:d1}); + assertObjectEqual(rejectValues({a:d1,b:d2}, new Date(2020, 7, 28)), {b:d2}); + assertObjectEqual(rejectValues({a:d1,b:d1}, new Date(2020, 7, 29)), {a:d1,b:d1}); }); it('should match by function', function() { - assertObjectEqual(excludeValues({a:1,b:2}, (key, n) => n % 2 === 0), {a:1}); - assertObjectEqual(excludeValues({a:1,b:3}, (key, n) => n % 2 === 0), {a:1,b:3}); - assertObjectEqual(excludeValues({a:1,b:2}, (key, n) => n > 5), {a:1,b:2}); - assertObjectEqual(excludeValues({a:1,b:2}, (key, n) => n > 0), {}); + assertObjectEqual(rejectValues({a:1,b:2}, (key, n) => n % 2 === 0), {a:1}); + assertObjectEqual(rejectValues({a:1,b:3}, (key, n) => n % 2 === 0), {a:1,b:3}); + assertObjectEqual(rejectValues({a:1,b:2}, (key, n) => n > 5), {a:1,b:2}); + assertObjectEqual(rejectValues({a:1,b:2}, (key, n) => n > 0), {}); }); it('should match by function when strictly equal', function() { var fn1 = function(){}; var fn2 = function(){}; - assertObjectEqual(excludeValues({a:fn1, b:fn2}, fn2), {a:fn1}); - assertObjectEqual(excludeValues({a:fn1, b:fn1}, fn2), {a:fn1,b:fn1}); + assertObjectEqual(rejectValues({a:fn1, b:fn2}, fn2), {a:fn1}); + assertObjectEqual(rejectValues({a:fn1, b:fn1}, fn2), {a:fn1,b:fn1}); }); it('should match by fuzzy matching', function() { assertObjectEqual( - excludeValues({ + rejectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, @@ -686,7 +686,7 @@ namespace('Object', function () { ), { 2: { name:'James'} }, ); - assertObjectEqual(excludeValues({ + assertObjectEqual(rejectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, {name:'Robert'}), @@ -695,13 +695,13 @@ namespace('Object', function () { 2:{ name:'James'}, }, ); - assertObjectEqual(excludeValues({ + assertObjectEqual(rejectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, {name:/^[A-J]/}), {}, ); - assertObjectEqual(excludeValues({ + assertObjectEqual(rejectValues({ 1:{ name:'Frank'}, 2:{ name:'James'}, }, {name:/^[K-Z]/}), @@ -713,7 +713,7 @@ namespace('Object', function () { }); it('should pass correct params', function() { - excludeValues({a:1}, function (key, val, obj) { + rejectValues({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); assertObjectEqual(obj, {a:1}); @@ -722,16 +722,16 @@ namespace('Object', function () { it('should not modify the object', function() { const obj = {}; - assertEqual(obj === excludeValues(obj, 1), false); + assertEqual(obj === rejectValues(obj, 1), false); }); it('should handle irregular input', function() { - assertObjectEqual(excludeValues({a:1}, null), {a:1}); - assertObjectEqual(excludeValues({a:1}, NaN), {a:1}); - assertError(function() { excludeValues({}); }); - assertError(function() { excludeValues(null); }); - assertError(function() { excludeValues('a'); }); - assertError(function() { excludeValues(1); }); + assertObjectEqual(rejectValues({a:1}, null), {a:1}); + assertObjectEqual(rejectValues({a:1}, NaN), {a:1}); + assertError(function() { rejectValues({}); }); + assertError(function() { rejectValues(null); }); + assertError(function() { rejectValues('a'); }); + assertError(function() { rejectValues(1); }); }); }); @@ -835,98 +835,116 @@ namespace('Object', function () { }); - describeInstance('filter', function(filter) { + describeInstance('select,selectKeys', function(selectKeys) { - it('should filter by enumerated arguments', function() { - assertObjectEqual(filter({a:1,b:2}, 'a'), {a:1}); - assertObjectEqual(filter({a:1,b:2}, 'a', 'b'), {a:1,b:2}); - assertObjectEqual(filter({a:1,b:2}), {}); - assertObjectEqual(filter({a:1,b:2}, 'c'), {}); + it('should select by enumerated arguments', function() { + assertObjectEqual(selectKeys({a:1,b:2}, 'a'), {a:1}); + assertObjectEqual(selectKeys({a:1,b:2}, 'a', 'b'), {a:1,b:2}); + assertObjectEqual(selectKeys({a:1,b:2}), {}); + assertObjectEqual(selectKeys({a:1,b:2}, 'c'), {}); }); - it('should filter by array argument', function() { - assertObjectEqual(filter({a:1,b:2}, ['a']), {a:1}); - assertObjectEqual(filter({a:1,b:2}, ['a', 'b']), {a:1,b:2}); - assertObjectEqual(filter({a:1,b:2}, []), {}); - assertObjectEqual(filter({a:1,b:2}, ['c']), {}); + it('should select by array argument', function() { + assertObjectEqual(selectKeys({a:1,b:2}, ['a']), {a:1}); + assertObjectEqual(selectKeys({a:1,b:2}, ['a', 'b']), {a:1,b:2}); + assertObjectEqual(selectKeys({a:1,b:2}, []), {}); + assertObjectEqual(selectKeys({a:1,b:2}, ['c']), {}); + }); + + it('should select by regex', function() { + assertObjectEqual(selectKeys({a:1,b:2}, /a/), {a:1}); + assertObjectEqual(selectKeys({a:1,b:2}, /[ab]/), {a:1,b:2}); + assertObjectEqual(selectKeys({a:1,b:2}, /c/), {}); }); it('should not modify the object', function() { const obj1 = {a:1}; - const obj2 = filter(obj1, 1); + const obj2 = selectKeys(obj1, 1); assertFalse(obj1 === obj2); }); it('should handle irregular input', function() { - assertObjectEqual(filter({a:1}, null), {}); - assertObjectEqual(filter({a:1}, NaN), {}); - assertError(function() { filter(null); }); - assertError(function() { filter('a'); }); - assertError(function() { filter(1); }); + assertObjectEqual(selectKeys({a:1}, null), {}); + assertObjectEqual(selectKeys({a:1}, NaN), {}); + assertError(function() { selectKeys(null); }); + assertError(function() { selectKeys('a'); }); + assertError(function() { selectKeys(1); }); }); }); - describeInstance('exclude', function(exclude) { + describeInstance('reject,rejectKeys', function(rejectKeys) { + + it('should reject by enumerated arguments', function() { + assertObjectEqual(rejectKeys({a:1,b:2}, 'a'), {b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, 'a', 'b'), {}); + assertObjectEqual(rejectKeys({a:1,b:2}), {a:1,b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, 'c'), {a:1,b:2}); + }); - it('should exclude by enumerated arguments', function() { - assertObjectEqual(exclude({a:1,b:2}, 'a'), {b:2}); - assertObjectEqual(exclude({a:1,b:2}, 'a', 'b'), {}); - assertObjectEqual(exclude({a:1,b:2}), {a:1,b:2}); - assertObjectEqual(exclude({a:1,b:2}, 'c'), {a:1,b:2}); + it('should reject by array argument', function() { + assertObjectEqual(rejectKeys({a:1,b:2}, ['a']), {b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, ['a', 'b']), {}); + assertObjectEqual(rejectKeys({a:1,b:2}, []), {a:1,b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, ['c']), {a:1,b:2}); }); - it('should exclude by array argument', function() { - assertObjectEqual(exclude({a:1,b:2}, ['a']), {b:2}); - assertObjectEqual(exclude({a:1,b:2}, ['a', 'b']), {}); - assertObjectEqual(exclude({a:1,b:2}, []), {a:1,b:2}); - assertObjectEqual(exclude({a:1,b:2}, ['c']), {a:1,b:2}); + it('should reject by regex', function() { + assertObjectEqual(rejectKeys({a:1,b:2}, /a/), {b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, /[ab]/), {}); + assertObjectEqual(rejectKeys({a:1,b:2}, /c/), {a:1,b:2}); }); it('should not modify the object', function() { const obj1 = {a:1}; - const obj2 = exclude(obj1, 1); + const obj2 = rejectKeys(obj1, 1); assertFalse(obj1 === obj2); }); it('should handle irregular input', function() { - assertObjectEqual(exclude({a:1}, null), {a:1}); - assertObjectEqual(exclude({a:1}, NaN), {a:1}); - assertError(function() { exclude(null); }); - assertError(function() { exclude('a'); }); - assertError(function() { exclude(1); }); + assertObjectEqual(rejectKeys({a:1}, null), {a:1}); + assertObjectEqual(rejectKeys({a:1}, NaN), {a:1}); + assertError(function() { rejectKeys(null); }); + assertError(function() { rejectKeys('a'); }); + assertError(function() { rejectKeys(1); }); }); }); - describeInstance('remove', function(remove) { + describeInstance('remove,removeKeys', function(removeKeys) { it('should remove by enumerated arguments', function() { - assertObjectEqual(remove({a:1,b:2}, 'a'), {b:2}); - assertObjectEqual(remove({a:1,b:2}, 'a', 'b'), {}); - assertObjectEqual(remove({a:1,b:2}), {a:1,b:2}); - assertObjectEqual(remove({a:1,b:2}, 'c'), {a:1,b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, 'a'), {b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, 'a', 'b'), {}); + assertObjectEqual(removeKeys({a:1,b:2}), {a:1,b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, 'c'), {a:1,b:2}); }); it('should remove by array argument', function() { - assertObjectEqual(remove({a:1,b:2}, ['a']), {b:2}); - assertObjectEqual(remove({a:1,b:2}, ['a', 'b']), {}); - assertObjectEqual(remove({a:1,b:2}, []), {a:1,b:2}); - assertObjectEqual(remove({a:1,b:2}, ['c']), {a:1,b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, ['a']), {b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, ['a', 'b']), {}); + assertObjectEqual(removeKeys({a:1,b:2}, []), {a:1,b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, ['c']), {a:1,b:2}); + }); + + it('should remove by regex', function() { + assertObjectEqual(removeKeys({a:1,b:2}, /a/), {b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, /[ab]/), {}); + assertObjectEqual(removeKeys({a:1,b:2}, /c/), {a:1,b:2}); }); it('should modify the object', function() { const obj1 = {a:1}; - const obj2 = remove(obj1, 1); + const obj2 = removeKeys(obj1, 1); assertTrue(obj1 === obj2); }); it('should handle irregular input', function() { - assertObjectEqual(remove({a:1}, null), {a:1}); - assertObjectEqual(remove({a:1}, NaN), {a:1}); - assertError(function() { remove(null); }); - assertError(function() { remove('a'); }); - assertError(function() { remove(1); }); + assertObjectEqual(removeKeys({a:1}, null), {a:1}); + assertObjectEqual(removeKeys({a:1}, NaN), {a:1}); + assertError(function() { removeKeys(null); }); + assertError(function() { removeKeys('a'); }); + assertError(function() { removeKeys(1); }); }); }); From b1414eb586dd6a2b56b0f5660919cb28fee6374c Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 05:55:46 +0900 Subject: [PATCH 088/191] Added Array#sortBy --- src/array/define.js | 1 + src/array/methods.js | 1 + src/array/sortBy.js | 101 +++++++ src/util/mappers.js | 9 +- test/OLD/tests/array.js | 629 ---------------------------------------- test/tests/array.js | 339 ++++++++++++++++++++++ 6 files changed, 448 insertions(+), 632 deletions(-) create mode 100644 src/array/sortBy.js diff --git a/src/array/define.js b/src/array/define.js index d4445dd29..aa546b0b8 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -22,4 +22,5 @@ defineInstance('remove', methods.remove); defineInstance('sample', methods.sample); defineInstance('shuffle', methods.shuffle); defineInstance('some', methods.some); +defineInstance('sortBy', methods.sortBy); defineInstance('sum', methods.sum); diff --git a/src/array/methods.js b/src/array/methods.js index 5a23699c5..0815e8ce5 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -19,4 +19,5 @@ export { default as remove } from './remove'; export { default as sample } from './sample'; export { default as shuffle } from './shuffle'; export { default as some } from './some'; +export { default as sortBy } from './sortBy'; export { default as sum } from './sum'; diff --git a/src/array/sortBy.js b/src/array/sortBy.js new file mode 100644 index 000000000..828b86dd3 --- /dev/null +++ b/src/array/sortBy.js @@ -0,0 +1,101 @@ +import { isObject, isString } from '../util/typeChecks'; +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; + +const DEFAULT_COLLATOR = new Intl.Collator(); + +/** + * Sorts the array based on the result of mapped values. + * + * @extra As with `Array#sort`, this method will modify the array. Use + * `Array#clone` to create a copy if this is not desired. + * + * @param {Array} arr - The array. + * @param {...string|mapFn|SortOptions} - Each passed argument will determine + * a field to sort on and/or options for sorting. Functions may be passed here + * to map values or a string serving as a shortcut. Implements deep mapping. + * + * @returns {Array} + * + * @callback mapFn + * + * el The array element. + * arr A reference to the array. + * + * @typedef {Options} SortOptions + * @property {string|mapFn} [map] - A function to map values or a string serving + * as a shortcut. When null, the array element will be used as the value. + * Implements deep mapping. + * @property {boolean} [desc] - When true, sorting on the field will be in + * descending order. Default is `false`. + * @property {Intl.Collator} [collator] - An instance of `Intl.Collator` that + * will determine collation affecting the resulting sort order. This may also + * be an object that implements a `compare` function returning `-1`, `1`, or `0`. + * + * @example + * + * ['aa','aaa','a'].sortBy('length') -> ['a','aa','aaa'] + * ['aa','aaa','a'].sortBy({ + * map: 'length', + * desc: true + * }) -> ['aaa','aa','a'] + * users.sortBy(function(n) { + * return n.age; + * }); -> users sorted by age + * users.sortBy('age') -> users sorted by age + * users.sortBy('name', 'age') -> users sorted by name, then by age + * users.sortBy({ + * map: 'name', + * desc: true, + * collate: new Intl.Collator('fr'), + * }); -> users sorted in descending order by name, using French collation + * + **/ +export default function sortBy(arr, ...args) { + assertArray(arr); + if (!args.length) { + args = [{}]; + } + const opts = args.map((arg) => { + if (!isObject(arg)) { + arg = { + map: arg, + }; + } + return { + ...arg, + mapper: getMapper(arg.map, arr), + }; + }); + return arr.sort((a, b) => { + let result; + for (let opt of opts) { + result = compare(a, b, arr, opt); + if (result !== 0) { + break; + } + } + return result; + }); +} + +function compare(a, b, arr, opt = {}) { + const { mapper, desc, collator = DEFAULT_COLLATOR } = opt; + const aVal = mapper(a, arr); + const bVal = mapper(b, arr); + let result; + if (isString(aVal) && isString(bVal)) { + result = collator.compare(aVal, bVal); + } else if (aVal < bVal) { + result = -1; + } else if (aVal > bVal) { + result = 1; + } else { + result = 0; + } + if (desc) { + result *= -1; + } + return result; + +} diff --git a/src/util/mappers.js b/src/util/mappers.js index 74f0279b5..36a0cd35c 100644 --- a/src/util/mappers.js +++ b/src/util/mappers.js @@ -13,11 +13,14 @@ export function getMapper(obj, context) { } function getFunctionMapper(fn, context) { - return (val, key, obj) => { + return (...args) => { + const obj = args[args.length - 1]; if (isArray(obj)) { - return fn.call(context || obj, val, key, obj); + return fn.apply(context || obj, args); } else { - return fn.call(context || obj, key, val, obj); + // Flip key and val arguments. + const [val, key, ...rest] = args; + return fn.call(context || obj, key, val, ...rest); } }; } diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 7b98dbf8b..648e9ec69 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -978,634 +978,5 @@ namespace('Array', function () { equal(run([['a',1],['b',2]], 'subtract', [[['a',1]]]), [['b',2]], 'nested arrays are not flattened'); }); - method('sortBy', function() { - var arr; - - test([0,1,2,3,4], [0,1,2,3,4], '0 is properly sorted'); - test(['0','1','2','3','4'], ['0','1','2','3','4'], 'string numerals are properly sorted'); - test(['c','B','a'], ['a','B','c'], 'upper-case is properly sorted'); - test(['back','Bad','banker'], ['back','Bad','banker'], 'case is ignored by default'); - test(['c','B','a','ä','ò','p'], ['a','ä','B','c','ò','p'], 'should allow normalization if exists'); - test(['apple','apples'], ['apple','apples'], 'basic string length'); - test(['has','hàs','had','hàd'], ['had','hàd','has','hàs'], 'special chars basic'); - test(['AM','AB'], ['AB','AM'], '0 index is properly sorted'); - - arr = ['San','San Cristobal','San Juan','San Teodoro','San Tomas','Santa Barbara','Santa Clara','Santa Cruz','Santo Domingo']; - test(arr, arr, 'spaces are counted'); - - arr = ['#foob','(fooc','fooa']; - test(arr, arr, 'special chars are not ignored by default'); - - arr = [ - '8braham', - 'a4raham', - 'abraham' - ]; - test(arr, arr, 'Numbers are filtered to the top'); - - arr = [ - 'pine', - 'pino', - 'piñata' - ]; - test(arr, arr, 'Spanish ñ is respected'); - - var frenchNames = [ - 'abelle', - 'aceline', - 'adélaïde', - 'adelais', - 'adèle', - 'adélie', - 'adeline', - 'adelle', - 'adelphe', - 'adrienne', - 'agace', - 'agate', - 'aglaë', - 'agnès', - 'agrippine', - 'aimée', - 'alaina', - 'alais', - 'alayna', - 'albertine', - 'alexandrie', - 'alexandrine', - 'aliénor', - 'aline', - 'alison', - 'alphonsine', - 'alvery', - 'amaline', - 'amandine', - 'amarante', - 'ambre', - 'ambrosine', - 'amélie', - 'amorette', - 'anaïs', - 'anastaise', - 'anastasie', - 'andrée', - 'andromaque', - 'anette', - 'angèle', - 'angeline', - 'angelique', - 'ann', - 'anne' - ]; - - test(run(frenchNames, 'shuffle'), frenchNames, 'sorting french names'); - - var arr = []; - for (var i = 0; i < frenchNames.length; i++) { - arr.push(frenchNames[i].toUpperCase()); - } - test(run(arr, 'shuffle'), arr, 'sorting french names in upper case'); - - // MSDN http://msdn.microsoft.com/en-us/library/cc194880.aspx - arr = [ - 'andere', - 'ändere', - 'chaque', - 'chemin', - 'cote', - 'cotÉ', - 'cÔte', - 'cÔtÉ', - 'Czech', - 'ČuČet', - 'hiŠa', - 'irdisch', - 'lävi', - 'lie', - 'lire', - 'llama', - 'LÖwen', - 'lÒza', - 'LÜbeck', - 'luck', - 'luČ', - 'lye', - 'Männer', - 'mÀŠta', - 'mÎr', - 'mÖchten', - 'myndig', - 'pint', - 'piÑa', - 'pylon', - 'sämtlich', - 'savoir', - 'Sietla', - 'subtle', - 'symbol', - 'Ślub', - 'ŠÀran', - 'väga', - 'verkehrt', - 'vox', - 'waffle', - 'wood', - 'yen', - 'yuan', - 'yucca', - 'zoo', - 'ZÜrich', - 'Zviedrija', - 'zysk', - 'Žal', - 'Žena' - ]; - test(run(arr, 'shuffle'), arr, 'Default collation'); - - arr = [ - 'cweat', - 'cwect', - 'čweat', - 'čweet', - 'sweat', - 'swect', - 'šweat', - 'šweet', - 'zweat', - 'zwect', - 'žweat', - 'žweet' - ]; - test(run(arr, 'shuffle'), arr, 'Czech/Lithuanian order is respected'); - - arr = [ - 'cat', - 'drone', - 'ðroll', - 'ebert' - ]; - test(run(arr, 'shuffle'), arr, 'Icelandic ð order is respected'); - - arr = [ - 'goth', - 'ğoad', - 'hover', - 'sing', - 'şeparate', - 'tumble' - ]; - test(run(arr, 'shuffle'), arr, 'Turkish order is respected'); - - arr = [ - 'ape', - 'ące', - 'central', - 'ćenter', - 'eulo', - 'ęula', - 'latch', - 'lever', - 'łevel', - 'martyr', - 'noob', - 'ńookie', - 'oppai', - 'sweat', - 'swect', - 'śweat', - 'śweet', - 'yeouch', - 'ýellow', - 'zipper', - 'zoophilia', - 'źebra', - 'żoo' - ]; - test(run(arr, 'shuffle'), arr, 'Polish order is respected'); - - arr = [ - 'cab', - 'opec', - 'still', - 'zounds', - 'æee', - 'ølaf', - 'ålegra' - ]; - test(run(arr, 'shuffle'), arr, 'Danish/Norwegian order is respected'); - - arr = [ - 'llama', - 'luck', - 'lye' - ]; - // Compressions simply can't be handled without a complex collation system - // as there is simply no way fundamentally to know what was intended as a - // compression. For example "catch a llama" vs "catch Al Lama" - test(run(arr, 'shuffle'), arr, 'Compressions are not handled'); - - arr = [ - 'àbel', - 'abet', - 'äpe', - 'apu', - 'âvec', - 'avel', - 'áxe', - 'axiom', - 'çoupon', - 'coupos', - 'écma', - 'ecmo', - 'êlam', - 'elan', - 'ëpic', - 'epil', - 'ëthen', - 'ether', - 'évac', - 'eval', - 'èxile', - 'exilo', - 'ïce', - 'icy', - 'îll', - 'ilp', - 'ïmpetum', - 'impetus', - 'íp', - 'is', - 'ìtalian', - 'italians', - 'luck', - 'lye', - 'òblast', - 'oblong', - 'ómam', - 'omar', - 'öpal', - 'opam', - 'ôva', - 'ovum', - 'ùla', - 'ule', - 'ûmar', - 'umas', - 'úni', - 'uny', - 'ùral', - 'uranus', - 'üte', - 'utu' - ]; - test(run(arr, 'shuffle'), arr, 'Standard Western-Latin equivalents are enforced'); - - // Swedish collation - var swedishWords = [ - 'att borsta', - 'att bränna', - 'att brinna', - 'att brinna', - 'att brista', - 'att bruka', - 'att bryta', - 'att bryta i bitar', - 'att buller', - 'att bygga', - 'att byta', - 'att chocka', - 'att dela', - 'att detaljera', - 'att dimpa', - 'att dö', - 'att dö', - 'att döda', - 'att dofta', - 'att dölja', - 'att döma', - 'att dra', - 'att dra', - 'att drabba', - 'att dricka', - 'att driva', - 'att driva', - 'att drömma', - 'att duga', - 'att erbjuda', - 'att erkänna', - 'att ersätta', - 'att explodera', - 'att falla', - 'att falla', - 'att fängsla', - 'att fara', - 'att fästa', - 'att fastna', - 'att fastställa', - 'att fatta', - 'att finna', - 'att finna', - 'att finnas', - 'att fira', - 'att fläta', - 'att få', - 'att fånga' - ]; - test(swedishWords, swedishWords, 'swedish strings sorted on utf8_general_ci'); - - var swedishCollated = [ - 'att borsta', - 'att brinna', - 'att brinna', - 'att brista', - 'att bruka', - 'att bryta', - 'att bryta i bitar', - 'att bränna', - 'att buller', - 'att bygga', - 'att byta', - 'att chocka', - 'att dela', - 'att detaljera', - 'att dimpa', - 'att dofta', - 'att dra', - 'att dra', - 'att drabba', - 'att dricka', - 'att driva', - 'att driva', - 'att drömma', - 'att duga', - 'att dö', - 'att dö', - 'att döda', - 'att dölja', - 'att döma', - 'att erbjuda', - 'att erkänna', - 'att ersätta', - 'att explodera', - 'att falla', - 'att falla', - 'att fara', - 'att fastna', - 'att fastställa', - 'att fatta', - 'att finna', - 'att finna', - 'att finnas', - 'att fira', - 'att fläta', - 'att få', - 'att fånga', - 'att fängsla', - 'att fästa' - ]; - - // The equivalents table is an object so need to make a clone - // here to properly restore the state after this test finishes. - var equivalents = Sugar.Array.getOption('sortEquivalents'); - var storedEquivalents = testClone(equivalents); - - equivalents['ö'] = null; - equivalents['ä'] = null; - - test(swedishWords, swedishCollated, 'removing equivalents can restore sort order'); - - equivalents['ö'] = storedEquivalents['ö']; - equivalents['ä'] = storedEquivalents['ä']; - - // Capitals - - arr = [ - 'abner', - 'aBBey', - 'Adrian', - 'aDella' - ]; - - expected = [ - 'aBBey', - 'abner', - 'aDella', - 'Adrian' - ]; - - Sugar.Array.setOption('sortIgnoreCase', true); - test(arr, expected, 'allows case ignore'); - - expected = [ - 'aDella', - 'Adrian', - 'aBBey', - 'abner' - ]; - - Sugar.Array.setOption('sortOrder', 'dba'); - test(arr, expected, 'allows other order'); - - expected = [ - 'aDella', - 'abner', - 'Adrian', - 'aBBey' - ]; - Sugar.Array.setOption('sortIgnore', /[abcde]/g); - test(arr, expected, 'allows custom ignore'); - Sugar.Array.setOption('sortIgnore', null); - - - Sugar.Array.setOption('sortOrder', 'cba'); - arr = ['cotÉ', 'cÔte', 'cÔtÉ', 'andere', 'ändere']; - test(arr, arr, 'cba'); - Sugar.Array.setOption('sortOrder', null); - - - Sugar.Array.setOption('sortCollate', function(a, b) { - switch (true) { - case a === 'c': return -1; - case b === 'c': return 1; - case a < b: return -1; - case a > b: return 1; - default: return 0; - } - }); - arr = ['a','b','c','d','e']; - test(arr, ['c','a','b','d','e'], 'allows custom collation'); - Sugar.Array.setOption('sortCollate', null); - - // Issue #282 - - test(['2','100','3'], ['2','3','100'], 'natural sort by default'); - test(['a2','a100','a3'], ['a2','a3','a100'], 'natural sort | leading char'); - test(['a2.5','a2.54','a2.4'], ['a2.4','a2.5','a2.54'], 'natural sort | floating number'); - test(['a100b', 'a100c', 'a100a'], ['a100a', 'a100b', 'a100c'], 'natural sort | number in middle'); - test(['a10.25b', 'a10.42c', 'a10.15a'], ['a10.15a', 'a10.25b', 'a10.42c'], 'natural sort | decimals in middle'); - test(['a10.15b', 'a10.15c', 'a10.15a'], ['a10.15a', 'a10.15b', 'a10.15c'], 'natural sort | middle decimal same, trailing char different'); - - test(['a10.25b', 'a10.42c', 'a10.15a'], ['a10.15a', 'a10.25b', 'a10.42c'], 'natural sort | decimals in middle'); - test(['a10.15b', 'a10.15c', 'a10.15a'], ['a10.15a', 'a10.15b', 'a10.15c'], 'natural sort | full-width | middle decimal same, trailing char different'); - test(['2','100','3'], ['2','3','100'], 'natural sort | full width'); - test(['a2','a100','a3'], ['a2','a3','a100'], 'natural sort | full width | leading char'); - - test(['title 1-300', 'title 1-1', 'title 1-5'], ['title 1-1', 'title 1-5', 'title 1-300'], 'natural sort | hyphenated'); - - - // The following tests were taken from http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm/ - - test(['10',9,2,'1','4'], ['1',2,'4',9,'10'], 'other | simple'); - test(['10.0401',10.022,10.042,'10.021999'], ['10.021999',10.022,'10.0401',10.042], 'other | floats'); - test(['10.04f','10.039F','10.038d','10.037D'], ['10.037D','10.038d','10.039F','10.04f'], 'other | float & decimal notation'); - test(['1.528535047e5','1.528535047e7','1.528535047e3'], ['1.528535047e3','1.528535047e5','1.528535047e7'], 'scientific notation'); - test(['192.168.0.100','192.168.0.1','192.168.1.1'], ['192.168.0.1','192.168.0.100','192.168.1.1'], 'other | IP addresses'); - test(['car.mov','01alpha.sgi','001alpha.sgi','my.string_41299.tif'], ['001alpha.sgi','01alpha.sgi','car.mov','my.string_41299.tif'], 'other | filenames'); - test(['$10002.00','$10001.02','$10001.01'], ['$10001.01','$10001.02','$10002.00'], 'other | money'); - test(['1 Title - The Big Lebowski','1 Title - Gattaca','1 Title - Last Picture Show'], ['1 Title - Gattaca','1 Title - Last Picture Show','1 Title - The Big Lebowski'], 'stolen | movie titles'); - - - Sugar.Array.setOption('sortNatural', false); - - test(['2','100','3'], ['100','2','3'], 'natural sort off'); - test(['a2','a100','a3'], ['a100','a2','a3'], 'natural sort off | leading char'); - test(['a2.5','a2.54','a2.4'], ['a2.4','a2.5','a2.54'], 'natural sort off | with floating number'); - test(['2','100','3'], ['100','2','3'], 'natural sort off | full width'); - test(['a2','a100','a3'], ['a100','a2','a3'], 'natural sort off | full width leading char'); - - Sugar.Array.setOption('sortNatural', true); - - - - // Issue #386 - sorting on multiple values - - var arr = [{a:'foo', b: 1},{a:'bar', b: 2},{a:'skittles', b: 1}]; - test(arr, [['b', 'a']], [{a:'foo',b:1},{a:'skittles',b:1},{a:'bar', b:2}], 'sort by key "b" then "a"'); - test([[1, 2], [1, 1], [0, 1], [0, 2]], [[0, 1], [0, 2], [1, 1], [1, 2]], 'sorting elements which are arrays'); - - var arr = [ - { - age: 34, - name: 'Gary' - }, - { - age: 18, - name: 'Alan' - }, - { - age: 8, - name: 'Toby' - }, - { - age: 8, - name: 'Ted' - }, - { - age: 8, - name: 'Tina' - } - ]; - - var expected = [ - { - age: 18, - name: 'Alan' - }, - { - age: 34, - name: 'Gary' - }, - { - age: 8, - name: 'Ted' - }, - { - age: 8, - name: 'Tina' - }, - { - age: 8, - name: 'Toby' - } - ]; - - test(arr, [['name', 'age']], expected, 'sorting by name and age'); - test(arr, [['name', 'hair']], expected, 'sorting by non-existent property first'); - test(arr, [['hair', 'name']], expected, 'sorting by non-existent property second'); - test(arr, [['hair', 'eyes']], arr, 'sorting by both properties non-existent'); - - var arr = [ - [5,4,3,2,1], - [3,3,3], - [4,3,2,1], - [1,2,3], - [1,2,3,4] - ] - - var expected = [ - [1,2,3], - [3,3,3], - [1,2,3,4], - [4,3,2,1], - [5,4,3,2,1] - ] - - test(arr, expected, 'sorting arrays of uneven length'); - - // More - - var arr; - arr = ['more','everyone!','bring','the','family']; - test(arr, ['length'], ['the','more','bring','family','everyone!'], 'sorting by length'); - test(arr, ['length', true], ['everyone!','family','bring','more','the'], 'desc | sorting by length'); - - test(arr, [function(a) { return a.length; }], ['the','more','bring','family','everyone!'], 'sort by length by function'); - test(arr, [function(a) { return a.length; }, true], ['everyone!','family','bring','more','the'], 'desc | sort by length by function'); - - arr = [{a:'foo'},{a:'bar'},{a:'skittles'}]; - test(arr, ['a'], [{a:'bar'},{a:'foo'},{a:'skittles'}], 'sort by key "a"'); - test(arr, ['a', true], [{a:'skittles'},{a:'foo'},{a:'bar'}], 'desc | sort by key "a"'); - - arr = [1,2,3]; - run(arr, 'sortBy', [function(n){ return 3 - n; }]); - equal(arr, [3,2,1], 'should be destructive'); - - test([1,2,3], oneUndefined, [1,2,3], 'undefined'); - test([1,2,3], [null], [1,2,3], 'null'); - test([1,2,3], [4], [1,2,3], 'number'); - - var Simple = function(num) { - this.valueOf = function() { - return num; - } - } - - var a = new Simple(5); - var b = new Simple(2); - var c = new Simple(3); - var d = new Simple(1); - var e = new Simple(2); - - test([a,b,c,d,e], [d,b,e,c,a], 'objects with "valueOf" defined will also be sorted properly'); - - - var obj1 = {id:1,a:{b:{c:248}}}; - var obj2 = {id:2,a:{b:{c:17}}}; - var obj3 = {id:3,a:{b:{c:50238}}}; - var obj4 = {id:4,a:{b:{c:29}}}; - var arr = [obj1, obj2, obj3, obj4]; - test(arr, ['a.b.c'], [obj2, obj4, obj1, obj3], 'by deep dot operator'); - test(arr, ['a.b.c', true], [obj3, obj1, obj4, obj2], 'by deep dot operator multiple'); - - - // Issue #273 - exposing collateString - - var arr = ['c','b','a','à','å','ä','ö']; - var viaSort = arr.sort(Sugar.Array.getOption('sortCollate')); - var viaSortBy = run(arr, 'sortBy'); - equal(viaSort, viaSortBy, 'Array.SugarCollateStrings | should be exposed to allow sorting via native Array#sort'); - - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index bfa79973e..65faf6f15 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1493,4 +1493,343 @@ namespace('Array', function() { }); + describeInstance('sortBy', function(sortBy) { + + it('should sort basic values without an argument', function() { + assertArrayEqual(sortBy([3,4,1,2]), [1,2,3,4]); + assertArrayEqual(sortBy(['c','a','b','d']), ['a','b','c','d']); + }); + + it('should sort in descending order', function() { + assertArrayEqual(sortBy([3,4,1,2], { + desc: true, + }), [4,3,2,1]); + assertArrayEqual(sortBy(['c','a','b','d'], { + desc: true, + }), ['d','c','b','a']); + }); + + it('should sort by mapping function', function() { + assertArrayEqual( + sortBy([ + { age: 24 }, + { age: 12 }, + ], (obj) => obj.age), + [{ age: 12 },{ age: 24 }] + ); + }); + + it('should sort by a string shortcut', function() { + assertArrayEqual( + sortBy([ + { age:24 }, + { age:12 }, + ], 'age'), + [{ age: 12 },{ age: 24 }] + ); + }); + + it('should handle deep properties', function() { + assertArrayEqual(sortBy([ + { profile: { likes: 20 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), [ + { profile: { likes: 17 } }, + { profile: { likes: 20 } }, + { profile: { likes: 36 } }, + ]); + assertArrayEqual(sortBy([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[0].views'), [ + { posts: [{ views: 12 }] }, + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + ]); + assertArrayEqual(sortBy([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts[-1].views'), [ + { posts: [{ views: 12 }] }, + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + ]); + assertArrayEqual(sortBy([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 12 }] }, + ], 'posts.0.views'), [ + { posts: [{ views: 12 }] }, + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + ]); + }); + + it('should be able to sort multiple fields', function() { + assertArrayEqual( + sortBy([ + { age: 24, likes: 20 }, + { age: 24, likes: 12 }, + { age: 22, likes: 10 }, + ], 'age', 'likes'), + [ + { age: 22, likes: 10 }, + { age: 24, likes: 12 }, + { age: 24, likes: 20 }, + ] + ); + assertArrayEqual( + sortBy([ + { age: 24, likes: 20 }, + { age: 24, likes: 12 }, + { age: 22, likes: 10 }, + ], 'age', { + map: 'likes', + desc: true, + }), + [ + { age: 22, likes: 10 }, + { age: 24, likes: 20 }, + { age: 24, likes: 12 }, + ] + ); + assertArrayEqual( + sortBy([ + { age: 24, likes: 20 }, + { age: 24, likes: 12 }, + { age: 22, likes: 10 }, + ], { + map: 'age', + desc: true, + }, { + map: 'likes', + desc: true, + }), + [ + { age: 24, likes: 20 }, + { age: 24, likes: 12 }, + { age: 22, likes: 10 }, + ] + ); + }); + + it('should allow collator option', function() { + assertArrayEqual( + sortBy(['1', '2', '9', '10'], { + collator: new Intl.Collator('en', { + numeric: true, + }) + }), + ['1','2','9','10'] + ); + assertArrayEqual( + sortBy(['*C', '#B', '#A', '@D'], { + collator: new Intl.Collator('en', { + ignorePunctuation: true, + }) + }), + ['#A','#B','*C','@D'] + ); + assertArrayEqual( + sortBy(['jose', 'josy', 'Josy', 'Jose', 'José'], { + collator: new Intl.Collator('en', { + sensitivity: 'case', + caseFirst: 'upper', + }) + }), + ['Jose','José','jose','Josy','josy'] + ); + }); + + it('should allow collator for French', function() { + assertArrayEqual( + sortBy([ + 'adélie', + 'adélaïde', + 'adeline', + 'adelphe', + 'adelle', + 'adèle', + 'adelais', + ], { + collator: new Intl.Collator('fr') + }), + [ + 'adélaïde', + 'adelais', + 'adèle', + 'adélie', + 'adeline', + 'adelle', + 'adelphe', + ] + ); + }); + + it('should allow collator for Czech/Lithuanian', function() { + assertArrayEqual( + sortBy([ + 'zwect', + 'čweet', + 'žweat', + 'cweat', + 'sweat', + 'swect', + 'šweet', + 'cwect', + 'čweat', + 'zweat', + 'šweat', + 'žweet' + ], { + collator: new Intl.Collator('cs') + }), + [ + 'cweat', + 'cwect', + 'čweat', + 'čweet', + 'sweat', + 'swect', + 'šweat', + 'šweet', + 'zweat', + 'zwect', + 'žweat', + 'žweet' + ] + ); + }); + + it('should allow collator for Swedish', function() { + assertArrayEqual( + sortBy([ + 'få', + 'fästa', + 'brinna', + 'byta', + 'duga', + 'fängsla', + 'bygga', + 'fara', + 'fånga', + 'bränna', + ], { + collator: new Intl.Collator('sv') + }), + [ + 'brinna', + 'bränna', + 'bygga', + 'byta', + 'duga', + 'fara', + 'få', + 'fånga', + 'fängsla', + 'fästa', + ] + ); + }); + + it('should handle issue #282', function() { + assertArrayEqual( + sortBy([ + 'andere', + 'ändere', + 'cote', + 'cotÉ', + 'cÔte', + 'cÔtÉ' + ]), + [ + 'andere', + 'ändere', + 'cote', + 'cotÉ', + 'cÔte', + 'cÔtÉ' + ] + ); + }); + + it('should handle special cases', function() { + assertArrayEqual( + sortBy([ + '1.528535047e5', + '1.528535047e7', + '1.528535047e10', + ], { + collator: new Intl.Collator('en', { + numeric: true, + }) + }), + [ + '1.528535047e5', + '1.528535047e7', + '1.528535047e10', + ] + ); + assertArrayEqual( + sortBy([ + '192.168.1.1', + '192.168.0.2', + '192.168.100.1', + '192.168.0.1', + '192.168.0.100', + ], { + collator: new Intl.Collator('en', { + numeric: true, + }) + }), + [ + '192.168.0.1', + '192.168.0.2', + '192.168.0.100', + '192.168.1.1', + '192.168.100.1', + ] + ); + assertArrayEqual( + sortBy([ + '$10002.00', + '$10001.02', + '$10001.01', + '$999.00', + ], { + collator: new Intl.Collator('en', { + numeric: true, + }) + }), + [ + '$999.00', + '$10001.01', + '$10001.02', + '$10002.00', + ] + ); + }); + + it('should be able to map instance values', function() { + function Foo(a) { + this.valueOf = () => a; + } + const a = new Foo(5); + const b = new Foo(2); + const c = new Foo(3); + const d = new Foo(1); + const e = new Foo(2); + assertArrayEqual(sortBy([a,b,c,d,e]), [d,b,e,c,a]); + }); + + it('should handle irregular input', function() { + assertError(() => { sortBy(null); }); + assertError(() => { sortBy('8'); }); + assertError(() => { sortBy(8); }); + }); + + }); }); From 7e9221a3d4070926a84447c9fd343d48b634c479 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 17:35:22 +0900 Subject: [PATCH 089/191] Added Array#unique --- src/array/define.js | 1 + src/array/groupBy.js | 12 ++- src/array/methods.js | 1 + src/array/unique.js | 47 +++++++++ src/util/enumerable.js | 18 ---- src/util/mappers.js | 6 +- src/util/object.js | 93 +++++++++++++----- src/util/serialize.js | 48 --------- test/OLD/tests/array.js | 61 ------------ test/tests/array.js | 211 ++++++++++++++++++++++++++++++++-------- test/tests/object.js | 32 +++--- 11 files changed, 318 insertions(+), 212 deletions(-) create mode 100644 src/array/unique.js delete mode 100644 src/util/enumerable.js delete mode 100644 src/util/serialize.js diff --git a/src/array/define.js b/src/array/define.js index aa546b0b8..688fae0f8 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -24,3 +24,4 @@ defineInstance('shuffle', methods.shuffle); defineInstance('some', methods.some); defineInstance('sortBy', methods.sortBy); defineInstance('sum', methods.sum); +defineInstance('unique', methods.unique); diff --git a/src/array/groupBy.js b/src/array/groupBy.js index 560bb9782..7425ac5e2 100644 --- a/src/array/groupBy.js +++ b/src/array/groupBy.js @@ -1,4 +1,5 @@ -import { mapWithShortcuts } from '../util/enumerable'; +import { assertArray } from '../util/assertions'; +import { getMapper } from '../util/mappers'; import { hasOwnProperty, forEachProperty } from '../util/helpers'; /** @@ -37,15 +38,16 @@ import { hasOwnProperty, forEachProperty } from '../util/helpers'; * **/ export default function groupBy(arr, map, groupFn) { + assertArray(arr); const result = {}; - for (let i = 0, len = arr.length; i < len; i++) { - const el = arr[i]; - const key = mapWithShortcuts(el, map, arr, [el, i, arr]); + const mapper = getMapper(map); + arr.forEach((el, i) => { + const key = mapper(el, i, arr); if (!hasOwnProperty(result, key)) { result[key] = []; } result[key].push(el); - } + }); if (groupFn) { forEachProperty(result, groupFn); } diff --git a/src/array/methods.js b/src/array/methods.js index 0815e8ce5..534133964 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -21,3 +21,4 @@ export { default as shuffle } from './shuffle'; export { default as some } from './some'; export { default as sortBy } from './sortBy'; export { default as sum } from './sum'; +export { default as unique } from './unique'; diff --git a/src/array/unique.js b/src/array/unique.js new file mode 100644 index 000000000..be84e15d6 --- /dev/null +++ b/src/array/unique.js @@ -0,0 +1,47 @@ +import { assertArray } from '../util/assertions'; +import { getSerializer } from '../util/object'; +import { getMapper } from '../util/mappers'; + +/** + * Removes all duplicate elements in the array. + * + * @param {Array} arr - The array. + * @param {string|mapFn} [map] - When passed, determines the values to unique + * by. A function may be passed here similar to `Array#map` or a string acting + * as a shortcut. Strings implement deep property matching. Default is a + * function that will deeply serialize objects in a way that any plain objects + * that cannot be observably distinguished are considered unique. Note that + * class instances as well as browser host objects are not serialized and are + * only unique by reference. + * + * @returns {Array} + * + * @callback mapFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * + * @example + * + * [1,2,2,3].unique() -> [1,2,3] + * [{a:'a'},{a:'a'}].unique() -> [{a:'a'}] + * users.unique((user) => { + * return user.id; + * }); -> unique users by id + * users.unique('id') -> unique users by id + * + **/ +export default function unique(arr, map = getSerializer()) { + assertArray(arr); + const values = new Set(); + const mapper = getMapper(map); + return arr.filter((el, i) => { + const val = mapper(el, i, arr); + if (!values.has(val)) { + values.add(val); + return true; + } + return false; + }); +} diff --git a/src/util/enumerable.js b/src/util/enumerable.js deleted file mode 100644 index 25e53092c..000000000 --- a/src/util/enumerable.js +++ /dev/null @@ -1,18 +0,0 @@ -import { isArray, isFunction } from './typeChecks'; -import { deepGetProperty } from './deepProperties'; - -export function mapWithShortcuts(el, map, context, mapArgs) { - if (!map) { - return el; - } else if (map.apply) { - return map.apply(context, mapArgs); - } else if (isArray(map)) { - return map.map((m) => { - return mapWithShortcuts(el, m, context, mapArgs); - }); - } else if (isFunction(el[map])) { - return el[map].call(el); - } else { - return deepGetProperty(el, map); - } -} diff --git a/src/util/mappers.js b/src/util/mappers.js index 36a0cd35c..56b1af9fe 100644 --- a/src/util/mappers.js +++ b/src/util/mappers.js @@ -39,7 +39,11 @@ function getArrayMapper(obj) { function getPropertyMapper(str) { return (val) => { - return deepGetProperty(val, str); + let result = deepGetProperty(val, str); + if (isFunction(result)) { + result = result.call(val); + } + return result; }; } diff --git a/src/util/object.js b/src/util/object.js index 96d940e2b..4df0b5590 100644 --- a/src/util/object.js +++ b/src/util/object.js @@ -1,6 +1,8 @@ -import { isObject } from './typeChecks'; +import { isPrimitive, isObject, isRealNaN } from './typeChecks'; import { hasOwnProperty, forEachProperty } from './helpers'; -import { isClass } from './class'; +import { isClass, classToString } from './class'; + +const objectProto = Object.prototype; export function isPlainObject(obj, classTag) { return isObject(obj) @@ -9,7 +11,59 @@ export function isPlainObject(obj, classTag) { && hasOwnEnumeratedProperties(obj); } -export function isSerializable(obj, classTag) { +// A function that will serialize objects holding an array of refs +// to distinguish non-serializable objects (class instances, host objects, etc). +export function getSerializer() { + const refs = []; + return (obj) => { + return serialize(obj, refs); + }; +} + +// Serializes an object in a way that will provide a token unique +// to the type, class, and value of an object. Host objects, class +// instances etc are not serializable, and are held in an array +// of references that will return the index as a unique identifier +// for the object. This array is passed from outside so that the +// calling function can decide how to dispose of this array. +export function serialize(obj, refs = [], stack = []) { + const type = typeof obj; + + // Check for -0 + const sign = 1 / obj === -Infinity ? '-' : ''; + + // Return quickly for primitives to save cycles + if (isPrimitive(obj, type) && !isRealNaN(obj)) { + return type + sign + obj; + } + + const className = classToString(obj); + + let value = ''; + if (!isSerializable(obj, className)) { + let index = refs.indexOf(obj); + if (index === -1) { + index = refs.length; + refs.push(obj); + } + return index; + } else if (isObject(obj)) { + value = serializeDeep(obj, refs, stack) + obj.toString(); + } else if (obj.valueOf) { + value = obj.valueOf(); + } + return type + className + sign + value; +} + +function serializeDeep(obj, refs, stack) { + let result = ''; + iterateWithCyclicCheck(obj, true, stack, (key, val, cyc, stack) => { + result += cyc ? 'CYC' : key + serialize(val, refs, stack); + }); + return result; +} + +function isSerializable(obj, classTag) { // Only known objects can be serialized. This notably excludes functions, // host objects, Symbols (which are matched by reference), and instances // of classes. The latter can arguably be matched by value, but @@ -18,16 +72,19 @@ export function isSerializable(obj, classTag) { return isKnownClassTag(classTag) || isPlainObject(obj, classTag); } -export function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { +// This method for checking for cyclic structures was egregiously stolen from +// the ingenious method by @kitcambridge from the Underscore script: +// https://github.com/documentcloud/underscore/issues/240 +function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { function next(val, key) { - var cyc = false; + let cyc = false; // Allowing a step into the structure before triggering this check to save // cycles on standard JSON structures and also to try as hard as possible to // catch basic properties that may have been modified. if (stack.length > 1) { - var i = stack.length; + let i = stack.length; while (i--) { if (stack[i] === val) { cyc = true; @@ -43,20 +100,12 @@ export function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { function iterateWithSortedKeys() { // Sorted keys is required for serialization, where object order // does not matter but stringified order does. - var arr = Object.keys(obj).sort(), key; - for (var i = 0; i < arr.length; i++) { - key = arr[i]; - next(obj[key], arr[i]); + const keys = Object.keys(obj).sort(); + for (let key of keys) { + next(obj[key], key); } } - // This method for checking for cyclic structures was egregiously stolen from - // the ingenious method by @kitcambridge from the Underscore script: - // https://github.com/documentcloud/underscore/issues/240 - if (!stack) { - stack = []; - } - if (sortedKeys) { iterateWithSortedKeys(); } else { @@ -96,8 +145,8 @@ function isKnownClassTag(classTag) { } function hasValidPlainObjectPrototype(obj) { - var hasToString = 'toString' in obj; - var hasConstructor = 'constructor' in obj; + const hasToString = 'toString' in obj; + const hasConstructor = 'constructor' in obj; // An object created with Object.create(null) has no methods in the // prototype chain, so check if any are missing. The additional hasToString // check is for false positives on some host objects in old IE which have @@ -116,10 +165,8 @@ function hasOwnEnumeratedProperties(obj) { // all their own, however in early IE environments without defineProperty, // there may also be enumerated methods in the prototype chain, so check // for both of these cases. - var objectProto = Object.prototype; - for (var key in obj) { - var val = obj[key]; - if (!hasOwnProperty(obj, key) && val !== objectProto[key]) { + for (let key in obj) { + if (!hasOwnProperty(obj, key) && obj[key] !== objectProto[key]) { return false; } } diff --git a/src/util/serialize.js b/src/util/serialize.js deleted file mode 100644 index c74deedb4..000000000 --- a/src/util/serialize.js +++ /dev/null @@ -1,48 +0,0 @@ -import { isPrimitive, isObject, isRealNaN } from '../typeChecks'; -import { isSerializable, iterateWithCyclicCheck } from './object'; -import { classToString } from './class'; - -// Serializes an object in a way that will provide a token unique -// to the type, class, and value of an object. Host objects, class -// instances etc, are not serializable, and are held in an array -// of references that will return the index as a unique identifier -// for the object. This array is passed from outside so that the -// calling function can decide when to dispose of this array. -export function serialize(obj, refs, stack) { - var type = typeof obj, sign = '', className, value, ref; - - // Check for -0 - if (1 / obj === -Infinity) { - sign = '-'; - } - - // Return quickly for primitives to save cycles - if (isPrimitive(obj, type) && !isRealNaN(obj)) { - return type + sign + obj; - } - - className = classToString(obj); - - if (!isSerializable(obj, className)) { - ref = refs.indexOf(obj); - if (ref === -1) { - ref = refs.length; - refs.push(obj); - } - return ref; - } else if (isObject(obj)) { - value = serializeDeep(obj, refs, stack) + obj.toString(); - } else if (obj.valueOf) { - value = obj.valueOf(); - } - return type + className + sign + value; -} - -function serializeDeep(obj, refs, stack) { - var result = ''; - iterateWithCyclicCheck(obj, true, stack, function(key, val, cyc, stack) { - result += cyc ? 'CYC' : key + serialize(val, refs, stack); - }); - return result; -} - diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 648e9ec69..1c3a208a2 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -323,67 +323,6 @@ namespace('Array', function () { equal(arr, [1,3], 'should affect the original array'); }); - method('unique', function() { - - test([1,1,3], [1,3], '1,1,3'); - test([0,0,0], [0], '0,0,0'); - test([-0,-0,-0], [-0], '-0,-0,-0'); - test([0,-0,0,-0], [0,-0], '0,-0,0,-0'); - test([0, -0, new Number(0), new Number(-0)], [0, -0, new Number(0), new Number(-0)], '0,-0 with non-primitives'); - test(['a','b','c'], ['a','b','c'], 'a,b,c'); - test(['a','a','c'], ['a','c'], 'a,a,c'); - test([NaN,NaN], [NaN], 'NaN'); - - test([{ foo:'bar' }, { foo:'bar' }], [{foo:'bar'}], 'objects uniqued as well'); - test([{ first: 'John', last: 'Woo' }, { first: 'Reynold', last: 'Woo' }], [function(n){ return n.last; }], [{ first: 'John', last: 'Woo' }], 'can be uniqued via a mapping function'); - test([{ first: 'John', last: 'Woo' }, { first: 'Reynold', last: 'Woo' }], ['last'], [{ first: 'John', last: 'Woo' }], 'can be uniqued via a mapping shortcut'); - test([{name:{first:'John',last:'P'}}, {name:{first:'Reynold',last:'P'}}], ['name.last'], [{name:{first:'John',last:'P'}}], 'mapping function can go deep with dot operator'); - - var fn = function(el,i,a) { - equal(this, [1], 'scope should be the array'); - equal(i, 0, 'second param should be the index'); - equal(a, [1], 'third param should also be the array'); - } - run([1], 'unique', [fn]); - - equal(run([function(){ return 'a' }, function() { return 'a'; }, function() { return 'b'; }]).length, 3, 'Functions are always unique'); - - test(['toString'], [], ['toString'], 'toString is respected as unique'); - test(['watch'], [], ['watch'], 'watch is respected as unique'); - test(['watch', 'flowers', 'toString'], [], ['watch', 'flowers', 'toString'], 'toString and watch mixed'); - - test(testGetSparseArray(3, 'a','b','a'), ['a','b'], 'should handle sparse arrays'); - - var arr = ['a']; - arr[Math.pow(2, 32) - 2] = 'a'; - // This test doesn't ever fail but is massively - // slow if not handling sparse arrays smartly. - test(arr, [], ['a'], 'does not take O(n) for sparse arrays'); - - test([['a'], {0:'a'}], [], [['a'],{0:'a'}], 'cannot be fooled by array-like'); - - // Class Instances - - function Foo () {} - var f1 = new Foo; - var f2 = new Foo; - var o1 = { foo: f1 }; - var o2 = { foo: f1 }; - var o3 = { foo: f2 }; - test([f1, f2], [f1, f2], 'instances | separate'); - test([f1, f1], [f1], 'instances | same'); - test([o1, o2], [o1], 'instances | same deep reference is equal'); - test([o1, o3], [o1, o3], 'instances | different deep reference is not equal'); - - var foo = {}; - test([{foo:foo}], [{foo:foo}], 'Handles cyclic structures'); - - var foo = {}; - foo.bar = foo; - test([foo], [foo], 'Handles cyclic structures'); - - }); - method('flatten', function() { test([1,2,3], [1,2,3], '1,2,3'); diff --git a/test/tests/array.js b/test/tests/array.js index 65faf6f15..18784d666 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1,4 +1,5 @@ 'use strict'; +/* eslint-disable no-sparse-arrays */ namespace('Array', function() { @@ -84,15 +85,16 @@ namespace('Array', function() { }); it('should call a function if necessary', function () { - var arr = [ - { name: function() { return 'Jim'; } }, - ]; + const obj = { + name: function() { + assertEqual(this, obj); + return 'Jim'; + } + }; assertObjectEqual( - groupBy(arr, 'name'), + groupBy([obj], 'name'), { - 'Jim': [ - arr[0], - ], + 'Jim': [obj], } ); }); @@ -164,7 +166,6 @@ namespace('Array', function() { }); it('should have no issues with sparse arrays', function() { - /* eslint-disable no-sparse-arrays */ assertEqual(at(['a',,'c'], 0), 'a'); assertUndefined(at(['a',,'c'], 1)); assertEqual(at(['a',,'c'], 2), 'c'); @@ -233,7 +234,7 @@ namespace('Array', function() { assertArrayEqual(remove([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'James'}]); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { remove(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -242,7 +243,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -305,7 +306,7 @@ namespace('Array', function() { assertArrayEqual(exclude([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), [{name:'James'}]); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { exclude(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -314,7 +315,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -389,7 +390,7 @@ namespace('Array', function() { ], 'posts[1..2].views'), [[40,20],[13,52],[45,81]]); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -414,7 +415,7 @@ namespace('Array', function() { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { map(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -480,7 +481,7 @@ namespace('Array', function() { assertEqual(some([{name:'Frank'},{name:'James'}], {name: /^[N-Z]/}), false); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { some(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -489,7 +490,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var n = 0; var arr = ['a']; arr[8000] = 'b'; @@ -553,7 +554,7 @@ namespace('Array', function() { assertEqual(none([{name:'Frank'},{name:'James'}], {name: /^[N-Z]/}), true); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { none(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -562,7 +563,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var n = 0; var arr = ['a']; arr[8000] = 'b'; @@ -627,7 +628,7 @@ namespace('Array', function() { assertEqual(every([{name:'Frank'},{name:'James'}], {name: /^[A-J]/}), true); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { every(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -636,7 +637,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var n = 0; var arr = ['a']; arr[8000] = 'b'; @@ -703,7 +704,7 @@ namespace('Array', function() { assertArrayEqual(filter([{a:'a'},{a:'b'}], new Foo(/b/)), [{a:'b'}]); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { filter(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -712,7 +713,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -768,7 +769,7 @@ namespace('Array', function() { assertObjectEqual(find([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), {name:'Frank'}); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { find(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -777,7 +778,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -833,7 +834,7 @@ namespace('Array', function() { assertEqual(findIndex([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), 0); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { findIndex(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -842,7 +843,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -903,7 +904,7 @@ namespace('Array', function() { assertEqual(count([{name:'Frank'},{name:'James'}], {name: /^[A-F]/}), 1); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { count(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -912,7 +913,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var n = 0; var arr = ['a']; arr[8000] = 'b'; @@ -969,7 +970,7 @@ namespace('Array', function() { ], 'posts.0.views'), 189); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { sum(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -978,7 +979,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1036,7 +1037,7 @@ namespace('Array', function() { ], 'posts.0.views'), 63); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1100,7 +1101,7 @@ namespace('Array', function() { ], 'posts.0.views'), 50); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1161,7 +1162,7 @@ namespace('Array', function() { assertEqual(min([-Infinity]), -Infinity); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { min(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -1170,7 +1171,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1232,7 +1233,7 @@ namespace('Array', function() { assertArrayEqual(minAll([-Infinity]), [-Infinity]); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { minAll(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -1241,7 +1242,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1302,7 +1303,7 @@ namespace('Array', function() { assertEqual(max([-Infinity]), -Infinity); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { max(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -1311,7 +1312,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1373,7 +1374,7 @@ namespace('Array', function() { assertArrayEqual(maxAll([-Infinity]), [-Infinity]); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { maxAll(['a'], function (el, i, arr) { assertEqual(el, 'a'); assertEqual(i, 0); @@ -1382,7 +1383,7 @@ namespace('Array', function() { }, 'context'); }); - it('should not iterate over all members of sparse arrays', function() { + it('should not iterate over non-members of sparse arrays', function() { var count = 0; var arr = ['a']; arr[8000] = 'b'; @@ -1832,4 +1833,134 @@ namespace('Array', function() { }); }); + + describeInstance('unique', function(unique) { + + it('should unique basic values without an argument', function() { + assertArrayEqual(unique([1,2,3]), [1,2,3]); + assertArrayEqual(unique([1,2,2,3]), [1,2,3]); + assertArrayEqual(unique([0,0,0]), [0]); + assertArrayEqual(unique([-0,-0,-0]), [-0]); + assertArrayEqual(unique([NaN,NaN,NaN]), [NaN]); + assertArrayEqual(unique([null,null,null]), [null]); + assertArrayEqual(unique([undefined,undefined,undefined]), [undefined]); + assertArrayEqual(unique(['a','b','c']), ['a','b','c']); + assertArrayEqual(unique(['a','b','c','c']), ['a','b','c']); + }); + + it('should unique objects with a mapper function', function() { + assertArrayEqual(unique([{a:1},{a:1}], (el) => el.a), [{a:1}]); + }); + + it('should unique objects with a string shortcut', function() { + assertArrayEqual(unique([{a:1},{a:1}], 'a'), [{a:1}]); + assertArrayEqual( + unique([ + { age: 24 }, + { age: 12 }, + { age: 12 }, + ], 'age'), + [{ age: 24 },{ age: 12 }] + ); + }); + + it('should unique objects by deep equality by default', function() { + assertArrayEqual(unique([{a:1},{a:1}]), [{a:1}]); + }); + + it('should handle deep properties', function() { + assertArrayEqual(unique([ + { profile: { likes: 17 } }, + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ], 'profile.likes'), [ + { profile: { likes: 17 } }, + { profile: { likes: 36 } }, + ]); + assertArrayEqual(unique([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 97 }] }, + ], 'posts[0].views'), [ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + ]); + assertArrayEqual(unique([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 97 }] }, + ], 'posts[-1].views'), [ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + ]); + assertArrayEqual(unique([ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + { posts: [{ views: 97 }] }, + ], 'posts.0.views'), [ + { posts: [{ views: 80 }] }, + { posts: [{ views: 97 }] }, + ]); + }); + + it('should handle sparse arrays', function() { + const arr = ['a']; + arr[8000] = 'b'; + assertArrayEqual(unique(arr), ['a','b']); + }); + + it('should not iterate over non-members of sparse arrays', function() { + var count = 0; + var arr = ['a']; + arr[8000] = 'b'; + unique(arr, function () { + count++; + }); + assertEqual(count, 2); + }); + + it('should pass correct arguments', function() { + unique(['a'], function (el, i, arr) { + assertEqual(el, 'a'); + assertEqual(i, 0); + assertArrayEqual(arr, ['a']); + }); + }); + + it('should treat array-like structures as separate', function() { + assertArrayEqual(unique([ + ['a'], + {0:'a'}, + ['a'], + {0:'a'}, + ]), [ + ['a'], + {0:'a'} + ]); + }); + + it('should handle class instances', function() { + function Foo () {} + const o1 = new Foo; + const o2 = new Foo; + assertArrayEqual(unique([o1, o1]), [o1]); + assertArrayEqual(unique([o1, o2]), [o1, o2]); + assertArrayEqual(unique([{a: o1}, {a: o1}]), [{a:o1}]); + assertArrayEqual(unique([{a: o1}, {a: o2}]), [{a:o1}, {a:o2}]); + }); + + it('should handle cyclic structures', function() { + const foo = {}; + foo.bar = foo; + assertArrayEqual(unique([{foo},{foo}]), [{foo}]); + }); + + it('should handle irregular input', function() { + assertError(() => { unique(null); }); + assertError(() => { unique('8'); }); + assertError(() => { unique(8); }); + }); + + }); + }); diff --git a/test/tests/object.js b/test/tests/object.js index 2f80fa10e..d45e057a9 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -50,7 +50,7 @@ namespace('Object', function () { assertObjectEqual(obj, empty); }); - it('should pass correct params', function () { + it('should pass correct arguments', function () { mapKeys({ a: 1 }, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -129,7 +129,7 @@ namespace('Object', function () { assertObjectEqual(obj, empty); }); - it('should pass correct params', function () { + it('should pass correct arguments', function () { mapValues({ a: 1 }, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -174,7 +174,7 @@ namespace('Object', function () { assertFalse(iterated); }); - it('should pass correct params', function () { + it('should pass correct arguments', function () { forEach({ a: 1 }, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -267,7 +267,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { some({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -355,7 +355,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { every({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -440,7 +440,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { none({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -526,7 +526,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { findKey({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -615,7 +615,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { selectValues({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -712,7 +712,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { rejectValues({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -809,7 +809,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { removeValues({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -1016,7 +1016,7 @@ namespace('Object', function () { ); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { count({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -1074,7 +1074,7 @@ namespace('Object', function () { }, 'posts.0.views'), 189); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { sum({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -1235,7 +1235,7 @@ namespace('Object', function () { assertEqual(minKey({a:-Infinity}), 'a'); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { minKey({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -1295,7 +1295,7 @@ namespace('Object', function () { assertArrayEqual(minKeys({a:-Infinity}), ['a']); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { minKeys({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -1354,7 +1354,7 @@ namespace('Object', function () { assertEqual(maxKey({a:-Infinity}), 'a'); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { maxKey({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); @@ -1414,7 +1414,7 @@ namespace('Object', function () { assertArrayEqual(maxKeys({a:-Infinity}), ['a']); }); - it('should pass correct params', function() { + it('should pass correct arguments', function() { maxKeys({a:1}, function (key, val, obj) { assertEqual(key, 'a'); assertEqual(val, 1); From 27e66787f1f6eed9833eed04c3cfa8ed799bd55d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 18:40:07 +0900 Subject: [PATCH 090/191] Added Array#union --- src/array/define.js | 1 + src/array/methods.js | 1 + src/array/union.js | 29 ++++++ src/array/unique.js | 4 +- test/OLD/tests/array.js | 223 ---------------------------------------- test/tests/array.js | 207 +++++++++++++++++++++++++++++++++++++ 6 files changed, 240 insertions(+), 225 deletions(-) create mode 100644 src/array/union.js diff --git a/src/array/define.js b/src/array/define.js index 688fae0f8..8642ef4c1 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -24,4 +24,5 @@ defineInstance('shuffle', methods.shuffle); defineInstance('some', methods.some); defineInstance('sortBy', methods.sortBy); defineInstance('sum', methods.sum); +defineInstance('union', methods.union); defineInstance('unique', methods.unique); diff --git a/src/array/methods.js b/src/array/methods.js index 534133964..6663c7d67 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -21,4 +21,5 @@ export { default as shuffle } from './shuffle'; export { default as some } from './some'; export { default as sortBy } from './sortBy'; export { default as sum } from './sum'; +export { default as union } from './union'; export { default as unique } from './unique'; diff --git a/src/array/union.js b/src/array/union.js new file mode 100644 index 000000000..3f7021d21 --- /dev/null +++ b/src/array/union.js @@ -0,0 +1,29 @@ +import { assertArray } from '../util/assertions'; +import unique from './unique'; + +/** + * Returns a new array containing elements in all passed arrays with duplicates + * removed. + * + * @param {Array} arr - The array. + * @param {...Array} - Arrays passed as arguments here will be merged into the + * result containing the elements of the first array. Elements are deeply + * checked in a way that any plain objects that cannot be observably + * distinguished are considered unique. Note that functions, class instances, + * and browser host objects are not serialized and are only unique by reference. + * + * @returns {Array} + * + * @example + * + * [1,2].union([2,3]) -> [1,2,3] + * [user1, user2].union([user2, user3]) -> [user1, user2, user3] + * [user1].union([user2], [user3]) -> [user1, user2, user3] + * + **/ +export default function union(...args) { + for (let arg of args) { + assertArray(arg); + } + return unique([].concat(...args)); +} diff --git a/src/array/unique.js b/src/array/unique.js index be84e15d6..6fa79b6c5 100644 --- a/src/array/unique.js +++ b/src/array/unique.js @@ -11,8 +11,8 @@ import { getMapper } from '../util/mappers'; * as a shortcut. Strings implement deep property matching. Default is a * function that will deeply serialize objects in a way that any plain objects * that cannot be observably distinguished are considered unique. Note that - * class instances as well as browser host objects are not serialized and are - * only unique by reference. + * functions, class instances, and browser host objects are not serialized and + * are only unique by reference. * * @returns {Array} * diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 1c3a208a2..6545bc391 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -562,229 +562,6 @@ namespace('Array', function () { test([4, 5, 6], [[1, 2], [8]], [[4, 1, 8], [5, 2, null], [6, null, null]], 'filled with null'); }); - method('union', function() { - - test([1,2,3], [[3,4,5]], [1,2,3,4,5], '1,2,3 + 3,4,5'); - test([1,1,1], [[1,2,3]], [1,2,3], '1,1,1 + 1,2,3'); - test([0,0,0], [[1,2,3]], [0,1,2,3], '0,0,0 + 1,2,3'); - test([0,0,0], [[0,0,0]], [0], '0,0,0 + 0,0,0'); - test([], [[]], [], '2 empty arrays'); - test([-1,-2,-3], [[-2,-4,-5]], [-1,-2,-3,-4,-5], '-1,-2,-3 + -2,-4,-5'); - test([-1,-2,-3], [[3,4,5]], [-1,-2,-3,3,4,5], '-1,-2,-3 + 3,4,5'); - test([{a:1},{b:2}], [[{b:2},{c:3}]], [{a:1},{b:2},{c:3}], 'a:1,b:2 + b:2,c:3'); - test([1,2,3], [[4]], [1,2,3,4], '1,2,3 + 4'); - - test([1,2,3], [[4,8,10]], [1,2,3,4,8,10], '1,2,3 + 4 8 10'); - - var arr = [1,2,3]; - run(arr, 'union', [[4,5,6]]); - equal(arr, [1,2,3], 'is non-destructive'); - - var s1 = testGetSparseArray(3, 'a','b'); - var s2 = testGetSparseArray(3, 'c','b'); - test(s1, [s2], ['a','b','c'], 'works on sparse arrays'); - - - // Comprehensive unit tests for new uniquing method. - - var aFunc = function(){ - return 'a'; - } - var bFunc = function(){ - return 'b'; - } - var cFunc = function(){ - return 'c'; - } - var dFunc = function(){ - return 'd'; - } - - assertArrayEquivalent(run([1,2,3], 'union', [[3,4,5]]), [1,2,3,4,5], 'basic'); - assertArrayEquivalent(run([1,2,3], 'union', [['1','2','3']]), [1,2,3,'1','2','3'], 'Numbers vs. Strings'); - assertArrayEquivalent(run([[1,2,3]], 'union', [[['1','2','3']]]), [[1,2,3],['1','2','3']], 'Numbers vs. Strings nested'); - - assertArrayEquivalent(run([1,2,3], 'union', [[1,2,3]]), [1,2,3], 'Number array'); - assertArrayEquivalent(run([[1,2,3]], 'union', [[[1,2,3]]]), [[1,2,3]], 'Nested number array'); - assertArrayEquivalent(run([[1,2,3]], 'union', [[[3,2,1]]]), [[1,2,3],[3,2,1]], 'Nested and reversed'); - - assertArrayEquivalent(run([aFunc], 'union', [[bFunc]]), [aFunc, bFunc], 'Function references'); - assertArrayEquivalent(run([aFunc], 'union', [[bFunc, cFunc]]), [aFunc, bFunc, cFunc], 'Function references'); - assertArrayEquivalent(run([aFunc, bFunc], 'union', [[bFunc, cFunc]]), [aFunc, bFunc, cFunc], 'Function references'); - assertArrayEquivalent(run([aFunc, bFunc, cFunc], 'union', [[aFunc, bFunc, cFunc]]), [aFunc, bFunc, cFunc], 'Function references'); - assertArrayEquivalent(run([cFunc, cFunc], 'union', [[cFunc, cFunc]]), [cFunc], 'Function references'); - assertArrayEquivalent(run([], 'union', [[aFunc]]), [aFunc], 'Function references'); - - equal(run([function() { return 'a'; }], 'union', [[function() { return 'a'; }]]).length, 2, 'Functions are never equivalent'); - - assertArrayEquivalent(run([/bar/], 'union', [[/bas/]]), [/bar/,/bas/], 'Regexes'); - assertArrayEquivalent(run([[/bar/]], 'union', [[[/bas/,/bap/]]]), [[/bar/],[/bas/,/bap/]], 'Nested Regexes'); - assertArrayEquivalent(run([{ reg: /bar/ }], 'union', [[{ reg: /bar/ }, { reg: /map/ }]]), [{ reg: /bar/ }, { reg: /map/ }], 'Object Regexes'); - - assertArrayEquivalent(run([true], 'union', [[false]]), [true,false], 'Booleans'); - assertArrayEquivalent(run([true], 'union', [[true]]), [true], 'Same Booleans'); - assertArrayEquivalent(run([[true]], 'union', [[[true, false]]]), [[true],[true, false]], 'Nested Booleans'); - assertArrayEquivalent(run([{ b: false }], 'union', [[{ b: false }, { b: true }]]), [{ b: false }, { b: true }], 'Object Booleans'); - - - assertArrayEquivalent(run([{},{}], 'union', [[{},{}]]), [{}], 'empty object array'); - assertArrayEquivalent(run([[{}]], 'union', [[[{},{}]]]), [[{}],[{},{}]], 'nested empty object array'); - assertArrayEquivalent(run([[{},{}]], 'union', [[[{},{}]]]), [[{},{}]], 'nested double object array'); - - assertArrayEquivalent(run([{0:1}], 'union', [[[1]]]), [{0:1},[1]], 'object posing as array'); - assertArrayEquivalent(run([{}], 'union', [[[]]]), [{},[]], 'empty object vs. empty array'); - - assertArrayEquivalent(run([[[],1]], 'union', [[[[1]]]]), [[[],1], [[1]]], 'empty array, 1 vs. empty array WITH one'); - - var aObj = { - text: 'foo', - reg: /moofa/, - arr: [{foo:'bar'},{moo:'car'}], - date: new Date(2001, 5, 15) - } - - var bObj = { - text: 'foo', - reg: /moofa/, - arr: [{foo:'bar'},{moo:'car'}], - date: new Date(2001, 5, 15) - } - - var cObj = { - text: 'foo', - reg: /moofo/, - arr: [{foo:'bar'},{moo:'car'}], - date: new Date(2001, 5, 15) - } - - var dObj = { - text: 'foo', - reg: /moofa/, - arr: [{foo:'bar'},{moo:'car'}], - date: new Date(2001, 8, 15) - } - - var eObj = { - text: 'foo', - reg: /moofa/, - arr: [{foo:'bar'},{moo:'par'}], - date: new Date(2001, 8, 15) - } - - - assertArrayEquivalent(run([aObj], 'union', [[aObj]]), [aObj], 'Nested objects a + a'); - assertArrayEquivalent(run([aObj], 'union', [[bObj]]), [aObj], 'Nested objects a + b'); - assertArrayEquivalent(run([aObj,bObj,cObj], 'union', [[]]), [aObj, cObj], 'Nested objects a,b,c + []'); - assertArrayEquivalent(run([], 'union', [[aObj,bObj,cObj]]), [aObj, cObj], 'Nested objects [] + a,b,c'); - assertArrayEquivalent(run([aObj,bObj], 'union', [[cObj]]), [aObj, cObj], 'Nested objects a,b + c'); - assertArrayEquivalent(run([cObj, cObj], 'union', [[cObj, cObj]]), [cObj], 'Nested objects c,c + c,c'); - assertArrayEquivalent(run([aObj, bObj, cObj, dObj], 'union', [[]]), [aObj, cObj, dObj], 'Nested objects a,b,c,d + []'); - assertArrayEquivalent(run([], 'union', [[aObj, bObj, cObj, dObj]]), [aObj, cObj, dObj], 'Nested objects a,b,c,d + a,c,d'); - assertArrayEquivalent(run([aObj, bObj], 'union', [[cObj, dObj]]), [aObj, cObj, dObj], 'Nested objects a,b + c,d'); - - assertArrayEquivalent(run([aObj, bObj, cObj, dObj, eObj], 'union', [[aObj, bObj, cObj, dObj, eObj]]), [aObj, cObj, dObj, eObj], 'Nested objects a,b,c,d,e + a,b,c,d,e'); - - var fnA = function() { return 'a'; } - var fnC = function() { return 'c'; } - - var aFuncObj = { - text: 'foo', - func: fnA, - arr: ['a','b','c'], - reg: /moofa/, - date: new Date(2001, 5, 15) - } - - var bFuncObj = { - text: 'foo', - func: fnA, - arr: ['a','b','c'], - reg: /moofa/, - date: new Date(2001, 5, 15) - } - - var cFuncObj = { - text: 'foo', - func: fnC, - arr: ['a','b','c'], - reg: /moofa/, - date: new Date(2001, 5, 15) - } - - - assertArrayEquivalent(run([aFuncObj], 'union', [[aFuncObj]]), [aFuncObj], 'Nested objects with functions'); - assertArrayEquivalent(run([aFuncObj], 'union', [[bFuncObj]]), [aFuncObj], 'Nested objects with functions'); - assertArrayEquivalent(run([aFuncObj,bFuncObj,cFuncObj], 'union', [[]]), [aFuncObj, cFuncObj], 'Nested objects with functions'); - assertArrayEquivalent(run([aFuncObj,bFuncObj], 'union', [[cFuncObj]]), [aFuncObj, cFuncObj], 'Nested objects with functions'); - assertArrayEquivalent(run([cFuncObj, cFuncObj], 'union', [[cFuncObj, cFuncObj]]), [cFuncObj], 'Nested objects with functions meh'); - - assertArrayEquivalent(run([NaN,NaN], 'union', [[NaN,NaN]]), [NaN], 'NaN'); - assertArrayEquivalent(run([null,null], 'union', [[null,null]]), [null], 'Null'); - assertArrayEquivalent(run(oneUndefined, 'union', nestedUndefined), oneUndefined, 'undefined'); - - - var aObj = { - one: 1, - two: 2, - three: 3 - } - - var bObj = { - three: 3, - two: 2, - one: 1 - } - - equal(run([aObj], 'union', [[bObj]]).length, 1, 'Properties may not be in the same order.'); - - - var xFunc = function (){ return 'x'; } - var yFunc = function (){ return 'y'; } - - assertArrayEquivalent(run([xFunc], 'union', [[]]), [xFunc], 'functions with different content | [x] + []'); - assertArrayEquivalent(run([yFunc], 'union', [[]]), [yFunc], 'functions with different content | [y] + []'); - assertArrayEquivalent(run([], 'union', [[xFunc]]), [xFunc], 'functions with different content | [] + [x]'); - assertArrayEquivalent(run([], 'union', [[yFunc]]), [yFunc], 'functions with different content | [] + [y]'); - assertArrayEquivalent(run([], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with different content | [] + [x,y]'); - assertArrayEquivalent(run([xFunc], 'union', [[xFunc]]), [xFunc], 'functions with different content | [x] + [x]'); - assertArrayEquivalent(run([xFunc], 'union', [[yFunc]]), [xFunc,yFunc], 'functions with different content | [x] + [y]'); - assertArrayEquivalent(run([xFunc], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with different content | [x] + [x,y]'); - assertArrayEquivalent(run([xFunc, xFunc], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with different content | [x,x] + [x,y]'); - assertArrayEquivalent(run([xFunc, xFunc], 'union', [[xFunc, xFunc]]), [xFunc], 'functions with different content | [x,x] + [x,x]'); - assertArrayEquivalent(run([xFunc, yFunc], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with different content | [x,y] + [x,y]'); - assertArrayEquivalent(run([xFunc, yFunc], 'union', [[yFunc, xFunc]]), [xFunc,yFunc], 'functions with different content | [x,y] + [y,x]'); - assertArrayEquivalent(run([xFunc, yFunc], 'union', [[yFunc, yFunc]]), [xFunc,yFunc], 'functions with different content | [x,y] + [y,y]'); - assertArrayEquivalent(run([yFunc, xFunc], 'union', [[yFunc, xFunc]]), [yFunc,xFunc], 'functions with different content | [y,x] + [y,x]'); - assertArrayEquivalent(run([yFunc, xFunc], 'union', [[xFunc, yFunc]]), [yFunc,xFunc], 'functions with different content | [y,x] + [x,y]'); - assertArrayEquivalent(run([yFunc, xFunc], 'union', [[xFunc, xFunc]]), [yFunc,xFunc], 'functions with different content | [y,x] + [x,x]'); - assertArrayEquivalent(run([xFunc, xFunc], 'union', [[yFunc, yFunc]]), [xFunc,yFunc], 'functions with different content | [x,x] + [y,y]'); - assertArrayEquivalent(run([yFunc, yFunc], 'union', [[xFunc, xFunc]]), [yFunc,xFunc], 'functions with different content | [y,y] + [x,x]'); - - - xFunc = function (){} - yFunc = function (){} - - assertArrayEquivalent(run([xFunc], 'union', [[]]), [xFunc], 'functions with identical content | [x] + []'); - assertArrayEquivalent(run([yFunc], 'union', [[]]), [yFunc], 'functions with identical content | [y] + []'); - assertArrayEquivalent(run([], 'union', [[xFunc]]), [xFunc], 'functions with identical content | [] + [x]'); - assertArrayEquivalent(run([], 'union', [[yFunc]]), [yFunc], 'functions with identical content | [] + [y]'); - assertArrayEquivalent(run([], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with identical content | [] + [x,y]'); - assertArrayEquivalent(run([xFunc], 'union', [[xFunc]]), [xFunc], 'functions with identical content | [x] + [x]'); - assertArrayEquivalent(run([xFunc], 'union', [[yFunc]]), [xFunc,yFunc], 'functions with identical content | [x] + [y]'); - assertArrayEquivalent(run([xFunc], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with identical content | [x] + [x,y]'); - assertArrayEquivalent(run([xFunc, xFunc], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with identical content | [x,x] + [x,y]'); - assertArrayEquivalent(run([xFunc, xFunc], 'union', [[xFunc, xFunc]]), [xFunc], 'functions with identical content | [x,x] + [x,x]'); - assertArrayEquivalent(run([xFunc, yFunc], 'union', [[xFunc, yFunc]]), [xFunc,yFunc], 'functions with identical content | [x,y] + [x,y]'); - assertArrayEquivalent(run([xFunc, yFunc], 'union', [[yFunc, xFunc]]), [xFunc,yFunc], 'functions with identical content | [x,y] + [y,x]'); - assertArrayEquivalent(run([xFunc, yFunc], 'union', [[yFunc, yFunc]]), [xFunc,yFunc], 'functions with identical content | [x,y] + [y,y]'); - assertArrayEquivalent(run([yFunc, xFunc], 'union', [[yFunc, xFunc]]), [yFunc,xFunc], 'functions with identical content | [y,x] + [y,x]'); - assertArrayEquivalent(run([yFunc, xFunc], 'union', [[xFunc, yFunc]]), [yFunc,xFunc], 'functions with identical content | [y,x] + [x,y]'); - assertArrayEquivalent(run([yFunc, xFunc], 'union', [[xFunc, xFunc]]), [yFunc,xFunc], 'functions with identical content | [y,x] + [x,x]'); - assertArrayEquivalent(run([xFunc, xFunc], 'union', [[yFunc, yFunc]]), [xFunc,yFunc], 'functions with identical content | [x,x] + [y,y]'); - assertArrayEquivalent(run([yFunc, yFunc], 'union', [[xFunc, xFunc]]), [yFunc,xFunc], 'functions with identical content | [y,y] + [x,x]'); - - }); - method('intersect', function() { test([1,2,3], [[3,4,5]], [3], '1,2,3 & 3,4,5'); diff --git a/test/tests/array.js b/test/tests/array.js index 18784d666..e985e4430 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1963,4 +1963,211 @@ namespace('Array', function() { }); + describeInstance('union', function(union) { + + it('should merge basic values', function() { + assertArrayEqual(union([1,2], [2,3]), [1,2,3]); + assertArrayEqual(union(['a','b'], ['b','c']), ['a','b','c']); + assertArrayEqual(union([0,0], [0,0]), [0]); + }); + + it('should accept multiple arguments', function() { + assertArrayEqual(union([1,2], [2,3], [3,4], [4,5]), [1,2,3,4,5]); + }); + + it('should object values', function() { + assertArrayEqual( + union([{a:1},{b:2}], [{b:2},{c:3}]), + [{a:1},{b:2},{c:3}] + ); + }); + + it('should not affect the passed arrays', function() { + const arr1 = [1,2]; + const arr2 = [2,3]; + const result = union(arr1, arr2); + assertFalse(result === arr1); + assertFalse(result === arr2); + }); + + it('should distinguish between strings and numbers', function() { + assertArrayEqual(union([1,2,3], ['1','2','3']), [1,2,3,'1','2','3']); + }); + + it('should work on nested arrays', function() { + assertArrayEqual(union([[1,2]], [[1,2],[2,3]]), [[1,2],[2,3]]); + }); + + it('should work on nested booleans', function() { + assertArrayEqual(union([true, false], [false, true]), [true, false]); + }); + + it('should match functions by reference', function() { + const fn1 = () => {}; + const fn2 = () => {}; + const fn3 = () => {}; + assertArrayEqual(union([fn1, fn2], [fn2, fn3]), [fn1, fn2, fn3]); + }); + + it('should handle complex nested objects', function() { + let obj1, obj2, obj3; + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(union([obj1, obj2], [obj2, obj3]), [obj1]); + + obj1 = { + text: 'foo1', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo2', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo3', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(union([obj1, obj2], [obj2, obj3]), [obj1, obj2, obj3]); + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo1/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo2/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo3/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(union([obj1, obj2], [obj2, obj3]), [obj1, obj2, obj3]); + + obj1 = { + text: 'foo', + arr: ['a','b','c', '1'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c', '2'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c', '3'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(union([obj1, obj2], [obj2, obj3]), [obj1, obj2, obj3]); + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 16) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 17) + } + assertArrayEqual(union([obj1, obj2], [obj2, obj3]), [obj1, obj2, obj3]); + + const fn1 = () => {}; + const fn2 = () => {}; + const fn3 = () => {}; + + obj1 = { + fn: fn1, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + fn: fn2, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 16) + }; + obj3 = { + fn: fn3, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 17) + } + assertArrayEqual(union([obj1, obj2], [obj2, obj3]), [obj1, obj2, obj3]); + }); + + it('should handle class instances', function() { + function Foo() {} + const f1 = new Foo; + const f2 = new Foo; + const f3 = new Foo; + + assertArrayEqual(union([f1, f2], [f2, f3]), [f1, f2, f3]); + assertArrayEqual( + union([{a:f1}, {a:f2}], [{a:f2}, {a:f3}]), + [{a:f1}, {a:f2}, {a:f3}] + ); + }); + + it('should work on sparse arrays', function() { + const arr1 = [1]; + arr1[10] = 2; + const arr2 = []; + arr2[20] = 2; + arr2[30] = 3; + assertArrayEqual(union(arr1, arr2), [1,2,3]); + }); + + it('should handle irregular input', function() { + assertError(() => { union([1,2], null); }); + assertError(() => { union(null); }); + assertError(() => { union('8'); }); + assertError(() => { union(8); }); + }); + + }); }); From d50f7390228649ce5f4a09793a3f08ff4dae0da2 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 19:44:10 +0900 Subject: [PATCH 091/191] Added Array#intersect and Array#subtract --- src/array/define.js | 2 + src/array/intersect.js | 39 ++++ src/array/methods.js | 2 + src/array/subtract.js | 32 ++++ test/OLD/tests/array.js | 217 --------------------- test/tests/array.js | 415 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 489 insertions(+), 218 deletions(-) create mode 100644 src/array/intersect.js create mode 100644 src/array/subtract.js diff --git a/src/array/define.js b/src/array/define.js index 8642ef4c1..708a9809d 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -10,6 +10,7 @@ defineInstance('filter', methods.filter); defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); +defineInstance('intersect', methods.intersect); defineInstance('isEmpty', methods.isEmpty); defineInstance('map', methods.map); defineInstance('max', methods.max); @@ -23,6 +24,7 @@ defineInstance('sample', methods.sample); defineInstance('shuffle', methods.shuffle); defineInstance('some', methods.some); defineInstance('sortBy', methods.sortBy); +defineInstance('subtract', methods.subtract); defineInstance('sum', methods.sum); defineInstance('union', methods.union); defineInstance('unique', methods.unique); diff --git a/src/array/intersect.js b/src/array/intersect.js new file mode 100644 index 000000000..63dfb66ef --- /dev/null +++ b/src/array/intersect.js @@ -0,0 +1,39 @@ +import { assertArray } from '../util/assertions'; +import { getSerializer } from '../util/object'; + +/** + * Returns a new array containing all elements common to all arrays. + * + * @param {Array} arr - The array. + * @param {...Array} - Arrays passed as arguments here will determine the + * result. Elements are deeply checked in a way that any plain objects that + * cannot be observably distinguished are considered unique. Note that + * functions, class instances, and browser host objects are not serialized + * and are only unique by reference. + * + * @returns {Array} + * + * @example + * + * [1,2].intersect([2,3]) -> [2] + * [user1, user2].intersect([user2, user3]) -> [user2] + * [user1].intersect([user2], [user3]) -> [user2] + * + **/ +export default function intersect(arr, ...args) { + assertArray(arr); + const values = new Set(); + const serializer = getSerializer(); + return arr.filter((el) => { + const val = serializer(el) + if (!values.has(val)) { + values.add(val); + return args.every((arr) => { + return arr.some((el) => { + return values.has(serializer(el)); + }); + }); + } + return false; + }); +} diff --git a/src/array/methods.js b/src/array/methods.js index 6663c7d67..19b0d3c77 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -7,6 +7,7 @@ export { default as filter } from './filter'; export { default as find } from './find'; export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; +export { default as intersect } from './intersect'; export { default as isEmpty } from './isEmpty'; export { default as map } from './map'; export { default as max } from './max'; @@ -20,6 +21,7 @@ export { default as sample } from './sample'; export { default as shuffle } from './shuffle'; export { default as some } from './some'; export { default as sortBy } from './sortBy'; +export { default as subtract } from './subtract'; export { default as sum } from './sum'; export { default as union } from './union'; export { default as unique } from './unique'; diff --git a/src/array/subtract.js b/src/array/subtract.js new file mode 100644 index 000000000..d801dd369 --- /dev/null +++ b/src/array/subtract.js @@ -0,0 +1,32 @@ +import { assertArray } from '../util/assertions'; +import { getSerializer } from '../util/object'; + +/** + * Returns a new array containing with all elements in the second array removed. + * + * @param {Array} arr1 - The array. + * @param {Array} arr2 - The array whose values will be removed. Elements are + * deeply checked in a way that any plain objects that cannot be observably + * distinguished are considered unique. Note that functions, class instances, + * and browser host objects are not serialized and are only unique by reference. + * + * @returns {Array} + * + * @example + * + * [1,2].subtract([2,3]) -> [1] + * [user1, user2].subtract([user2, user3]) -> [user1] + * [user1].subtract([user2], [user3]) -> [user1] + * + **/ +export default function subtract(arr1, arr2) { + assertArray(arr1); + assertArray(arr2); + const serializer = getSerializer(); + return arr1.filter((el) => { + const str = serializer(el) + return !arr2.some((el) => { + return serializer(el) === str; + }); + }); +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 6545bc391..f1a3adf3a 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -114,90 +114,6 @@ namespace('Array', function () { }); - method('subtract', function() { - - test([1,2,3], [[3,4,5]], [1,2], '[1,2,3] - [3,4,5]'); - test([1,1,2,2,3,3,4,4,5,5], [[2,3,4]], [1,1,5,5], '[1,1,2,2,3,3,4,4,5,5] - [2,3,4]'); - test(['a','b','c'], [['c','d','e']], ['a','b'], '[a,b,c] - [c,d,e]'); - test([1,2,3], [[1,2,3]], [], '[1,2,3] - [1,2,3]'); - test([1,2,3], [[3,2,1]], [], '[1,2,3] - [3,2,1]'); - test([], [[3]], [], '[] - [3]'); - test([3], [[]], [3], '[3] - []'); - test([], [[]], [], '[] - []'); - test([null], [[]], [null], '[null] - []'); - test([null], [[null]], [], '[null] - [null]'); - test([false], [[false]], [], '[false] - [false]'); - test([false], [[0]], [false], '[false] - [0]'); - test([false], [[null]], [false], '[false] - [null]'); - test([false], nestedUndefined, [false], '[false] - [undefined]'); - test([{a:1},{b:2}], [[{b:2},{c:3}]], [{a:1}], '[a:1,b:2] - [b:2,c:3]'); - test([1,1,3], [[1,5,6]], [3], '[1,1,3] - [1,5,6]'); - test([1,2,3], [[4,5,6]], [1,2,3], '[1,2,3] - [4,5,6]'); - test([1,2,3], [[2]], [1,3], '[1,2,3] - [2]'); - test([1,2,3], [2], [1,3], '[1,2,3] - 2'); - test(safeArray(undefined), [undefined], [], '[undefined] - undefined'); - - test([0,1,2,3], [undefined], [0,1,2,3], '[0,1,2,3] - undefined'); - test([0,1,2,3], [null], [0,1,2,3], '[0,1,2,3] - null'); - test([0,1,2,3], [{0:0}], [0,1,2,3], '[0,1,2,3] - {0:0}'); - - var arr = [1,2,3]; - run(arr, 'subtract', [[3]]); - equal(arr, [1,2,3], 'is non-destructive'); - - var s1 = testGetSparseArray(3, 'a','b'); - var s2 = testGetSparseArray(3, 'c','b'); - test(s1, [s2], ['a'], 'works on sparse arrays'); - - var yFunc = function () { return 'y'; } - var xFunc = function () { return 'x'; } - - test([xFunc], [[]], [xFunc], 'functions with different content | [x] - []'); - test([yFunc], [[]], [yFunc], 'functions with different content | [y] - []'); - test([], [[xFunc]], [], 'functions with different content | [] - [x]'); - test([], [[yFunc]], [], 'functions with different content | [] - [y]'); - test([], [[xFunc, yFunc]], [], 'functions with different content | [] - [x,y]'); - test([xFunc], [[xFunc]], [], 'functions with different content | [x] - [x]'); - test([xFunc], [[yFunc]], [xFunc], 'functions with different content | [x] - [y]'); - test([xFunc], [[xFunc, yFunc]], [], 'functions with different content | [x] - [x,y]'); - test([xFunc, xFunc], [[xFunc, yFunc]], [], 'functions with different content | [x,x] - [x,y]'); - test([xFunc, xFunc], [[xFunc, xFunc]], [], 'functions with different content | [x,x] - [x,x]'); - test([xFunc, yFunc], [[xFunc, yFunc]], [], 'functions with different content | [x,y] - [x,y]'); - test([xFunc, yFunc], [[yFunc, xFunc]], [], 'functions with different content | [x,y] - [y,x]'); - test([xFunc, yFunc], [[yFunc, yFunc]], [xFunc], 'functions with different content | [x,y] - [y,y]'); - test([yFunc, xFunc], [[yFunc, xFunc]], [], 'functions with different content | [y,x] - [y,x]'); - test([yFunc, xFunc], [[xFunc, yFunc]], [], 'functions with different content | [y,x] - [x,y]'); - test([yFunc, xFunc], [[xFunc, xFunc]], [yFunc], 'functions with different content | [y,x] - [x,x]'); - test([xFunc, xFunc], [[yFunc, yFunc]], [xFunc,xFunc], 'functions with different content | [x,x] - [y,y]'); - test([yFunc, yFunc], [[xFunc, xFunc]], [yFunc,yFunc], 'functions with different content | [y,y] - [x,x]'); - - var xFunc = function() {}; - var yFunc = function() {}; - - test([xFunc], [[]], [xFunc], 'functions with identical content | [x] - []'); - test([yFunc], [[]], [yFunc], 'functions with identical content | [y] - []'); - test([], [[xFunc]], [], 'functions with identical content | [] - [x]'); - test([], [[yFunc]], [], 'functions with identical content | [] - [y]'); - test([], [[xFunc, yFunc]], [], 'functions with identical content | [] - [x,y]'); - test([xFunc], [[xFunc]], [], 'functions with identical content | [x] - [x]'); - test([xFunc], [[yFunc]], [xFunc], 'functions with identical content | [x] - [y]'); - test([xFunc], [[xFunc, yFunc]], [], 'functions with identical content | [x] - [x,y]'); - test([xFunc, xFunc], [[xFunc, yFunc]], [], 'functions with identical content | [x,x] - [x,y]'); - test([xFunc, xFunc], [[xFunc, xFunc]], [], 'functions with identical content | [x,x] - [x,x]'); - test([xFunc, yFunc], [[xFunc, yFunc]], [], 'functions with identical content | [x,y] - [x,y]'); - test([xFunc, yFunc], [[yFunc, xFunc]], [], 'functions with identical content | [x,y] - [y,x]'); - test([xFunc, yFunc], [[yFunc, yFunc]], [xFunc], 'functions with identical content | [x,y] - [y,y]'); - test([yFunc, xFunc], [[yFunc, xFunc]], [], 'functions with identical content | [y,x] - [y,x]'); - test([yFunc, xFunc], [[xFunc, yFunc]], [], 'functions with identical content | [y,x] - [x,y]'); - test([yFunc, xFunc], [[xFunc, xFunc]], [yFunc], 'functions with identical content | [y,x] - [x,x]'); - test([xFunc, xFunc], [[yFunc, yFunc]], [xFunc,xFunc], 'functions with identical content | [x,x] - [y,y]'); - test([yFunc, yFunc], [[xFunc, xFunc]], [yFunc,yFunc], 'functions with identical content | [y,y] - [x,x]'); - - equal(run([function(){ return 'a' }, function() { return 'b'; }], 'subtract', [[function() { return 'a'; }]]).length, 2, 'functions are always unique'); - test([xFunc, yFunc], [[xFunc]], [yFunc], 'function references are ==='); - - }); - method('append', function() { test([1,2,3], [4], [1,2,3,4], '[1,2,3] + 4'); @@ -562,137 +478,4 @@ namespace('Array', function () { test([4, 5, 6], [[1, 2], [8]], [[4, 1, 8], [5, 2, null], [6, null, null]], 'filled with null'); }); - method('intersect', function() { - - test([1,2,3], [[3,4,5]], [3], '1,2,3 & 3,4,5'); - test(['a','b','c'], [['c','d','e']], ['c'], 'a,b,c & c,d,e'); - test([1,2,3], [[1,2,3]], [1,2,3], '1,2,3 & 1,2,3'); - test([1,2,3], [[3,2,1]], [1,2,3], '1,2,3 & 3,2,1'); - test([], [[3]], [], 'empty array & 3'); - test([3], [[]], [], '3 & empty array'); - test([], [[]], [], '2 empty arrays'); - test([null], [[]], [], '[null] & empty array'); - test([null], [[null]], [null], '[null] & [null]'); - test([false], [[false]], [false], '[false] & [false]'); - test([false], [[0]], [], '[false] & [0]'); - test([false], [[null]], [], '[false] & [null]'); - test([false], nestedUndefined, [], '[false] & [undefined]'); - test([{a:1},{b:2}], [[{b:2},{c:3}]], [{b:2}], 'a:1,b:2 & b:2,c:3'); - test([1,1,3], [[1,5,6]], [1], '1,1,3 & 1,5,6'); - test([1,2,3], [[4,5,6]], [], '1,1,3 & 4,5,6'); - test([1,1], [[1,1,[1,1]]], [1], 'assure uniqueness'); - test([1,2,3], [[1]], [1], '1,2,3 + 1'); - test(safeArray(undefined), [undefined], safeArray(undefined), '[undefined] & undefined'); - - var arr = [1,2,3]; - run(arr, 'intersect', [[3,4,5]]); - equal(arr, [1,2,3], 'is non-destructive'); - - var s1 = testGetSparseArray(3, 'a','b'); - var s2 = testGetSparseArray(3, 'c','b'); - test(s1, [s2], ['b'], 'works on sparse arrays'); - - - var yFunc = function () { return 'y'; } - var xFunc = function () { return 'x'; } - - test([function(){ return 'a' }], [[function() { return 'a'; }, function() { return 'b'; }]], [], 'functions are always unique'); - test([xFunc], [[]], [], 'functions with different content | [x] & []'); - test([yFunc], [[]], [], 'functions with different content | [y] & []'); - test([], [[xFunc]], [], 'functions with different content | [] & [x]'); - test([], [[yFunc]], [], 'functions with different content | [] & [y]'); - test([], [[xFunc, yFunc]], [], 'functions with different content | [] & [x,y]'); - test([xFunc], [[xFunc]], [xFunc], 'functions with different content | [x] & [x]'); - test([xFunc], [[yFunc]], [], 'functions with different content | [x] & [y]'); - test([xFunc], [[xFunc, yFunc]], [xFunc], 'functions with different content | [x] & [x,y]'); - test([xFunc, xFunc], [[xFunc, yFunc]], [xFunc], 'functions with different content | [x,x] & [x,y]'); - test([xFunc, xFunc], [[xFunc, xFunc]], [xFunc], 'functions with different content | [x,x] & [x,x]'); - test([xFunc, yFunc], [[xFunc, yFunc]], [xFunc,yFunc], 'functions with different content | [x,y] & [x,y]'); - test([xFunc, yFunc], [[yFunc, xFunc]], [xFunc,yFunc], 'functions with different content | [x,y] & [y,x]'); - test([xFunc, yFunc], [[yFunc, yFunc]], [yFunc], 'functions with different content | [x,y] & [y,y]'); - test([yFunc, xFunc], [[yFunc, xFunc]], [yFunc,xFunc], 'functions with different content | [y,x] & [y,x]'); - test([yFunc, xFunc], [[xFunc, yFunc]], [yFunc,xFunc], 'functions with different content | [y,x] & [x,y]'); - test([yFunc, xFunc], [[xFunc, xFunc]], [xFunc], 'functions with different content | [y,x] & [x,x]'); - test([xFunc, xFunc], [[yFunc, yFunc]], [], 'functions with different content | [x,x] & [y,y]'); - test([yFunc, yFunc], [[xFunc, xFunc]], [], 'functions with different content | [y,y] & [x,x]'); - - var xFunc = function() {}; - var yFunc = function() {}; - - test([xFunc], [[]], [], 'functions with identical content | [x] & []'); - test([yFunc], [[]], [], 'functions with identical content | [y] & []'); - test([], [[xFunc]], [], 'functions with identical content | [] & [x]'); - test([], [[yFunc]], [], 'functions with identical content | [] & [y]'); - test([], [[xFunc, yFunc]], [], 'functions with identical content | [] & [x,y]'); - test([xFunc], [[xFunc]], [xFunc], 'functions with identical content | [x] & [x]'); - test([xFunc], [[yFunc]], [], 'functions with identical content | [x] & [y]'); - test([xFunc], [[xFunc, yFunc]], [xFunc], 'functions with identical content | [x] & [x,y]'); - test([xFunc, xFunc], [[xFunc, yFunc]], [xFunc], 'functions with identical content | [x,x] & [x,y]'); - test([xFunc, xFunc], [[xFunc, xFunc]], [xFunc], 'functions with identical content | [x,x] & [x,x]'); - test([xFunc, yFunc], [[xFunc, yFunc]], [xFunc,yFunc], 'functions with identical content | [x,y] & [x,y]'); - test([xFunc, yFunc], [[yFunc, xFunc]], [xFunc,yFunc], 'functions with identical content | [x,y] & [y,x]'); - test([xFunc, yFunc], [[yFunc, yFunc]], [yFunc], 'jrray#intersect | functions with identical content | [x,y] & [y,y]'); - test([yFunc, xFunc], [[yFunc, xFunc]], [yFunc,xFunc], 'functions with identical content | [y,x] & [y,x]'); - test([yFunc, xFunc], [[xFunc, yFunc]], [yFunc,xFunc], 'functions with identical content | [y,x] & [x,y]'); - test([yFunc, xFunc], [[xFunc, xFunc]], [xFunc], 'functions with identical content | [y,x] & [x,x]'); - test([xFunc, xFunc], [[yFunc, yFunc]], [], 'functions with identical content | [x,x] & [y,y]'); - test([yFunc, yFunc], [[xFunc, xFunc]], [], 'functions with identical content | [y,y] & [x,x]'); - - }); - - group('Complex Union/Intersect', function() { - - // Testing Array#union and Array#intersect on complex elements as found http://ermouth.com/fastArray/ - // Thanks to @ermouth! - - var yFunc = function () { return 'y'; } - var xFunc = function () { return 'x'; } - - var arr1 = [ - { eccbc87e4b5ce2fe28308fd9f2a7baf3: 3 }, - /rowdy/, - /randy/, - yFunc, - [6, "1679091c5a880faf6fb5e6087eb1b2dc"], - xFunc, - 2 - ]; - - var arr2 = [ - { eccbc87e4b5ce2fe28308fd9f2a7baf3: 3 }, - /rowdy/, - /pandy/, - xFunc, - { e4da3b7fbbce2345d7772b0674a318d5: 5 }, - [8, "c9f0f895fb98ab9159f51fd0297e236d"] - ]; - - var unionExpected = [ - { eccbc87e4b5ce2fe28308fd9f2a7baf3: 3 }, - /rowdy/, - /randy/, - yFunc, - [6, "1679091c5a880faf6fb5e6087eb1b2dc"], - xFunc, - 2, - /pandy/, - { e4da3b7fbbce2345d7772b0674a318d5: 5 }, - [8, "c9f0f895fb98ab9159f51fd0297e236d"] - ]; - - var intersectExpected = [ - { eccbc87e4b5ce2fe28308fd9f2a7baf3: 3 }, - /rowdy/, - xFunc - ]; - - - equal(run(arr1, 'union', [arr2]), unionExpected, 'complex array unions'); - equal(run(arr1, 'intersect', [arr2]), intersectExpected, 'complex array intersects'); - - equal(run([['a',1]], 'intersect', [[['a',1],['b',2]]]), [['a',1]], 'nested arrays are not flattened'); - equal(run([['a',1],['b',2]], 'subtract', [[['a',1]]]), [['b',2]], 'nested arrays are not flattened'); - }); - }); - diff --git a/test/tests/array.js b/test/tests/array.js index e985e4430..ee9ff1177 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -1975,7 +1975,7 @@ namespace('Array', function() { assertArrayEqual(union([1,2], [2,3], [3,4], [4,5]), [1,2,3,4,5]); }); - it('should object values', function() { + it('should accept object values', function() { assertArrayEqual( union([{a:1},{b:2}], [{b:2},{c:3}]), [{a:1},{b:2},{c:3}] @@ -2170,4 +2170,417 @@ namespace('Array', function() { }); }); + + describeInstance('intersect', function(intersect) { + + it('should merge basic values', function() { + assertArrayEqual(intersect([1,2], [2,3]), [2]); + assertArrayEqual(intersect(['a','b'], ['b','c']), ['b']); + assertArrayEqual(intersect([0,0], [0,0]), [0]); + }); + + it('should accept multiple arguments', function() { + assertArrayEqual(intersect([1,2], [2,3], [2,4], [2,5]), [2]); + }); + + it('should accept object values', function() { + assertArrayEqual( + intersect([{a:1},{b:2}], [{b:2},{c:3}]), + [{b:2}] + ); + }); + + it('should not affect the passed arrays', function() { + const arr1 = [1,2]; + const arr2 = [2,3]; + const result = intersect(arr1, arr2); + assertFalse(result === arr1); + assertFalse(result === arr2); + }); + + it('should distinguish between strings and numbers', function() { + assertArrayEqual(intersect([1,2,3], ['1','2','3']), []); + }); + + it('should work on nested arrays', function() { + assertArrayEqual(intersect([[1,2]], [[1,2],[2,3]]), [[1,2]]); + }); + + it('should work on nested booleans', function() { + assertArrayEqual(intersect([true, false], [false]), [false]); + }); + + it('should match functions by reference', function() { + const fn1 = () => {}; + const fn2 = () => {}; + const fn3 = () => {}; + assertArrayEqual(intersect([fn1, fn2], [fn2, fn3]), [fn2]); + }); + + it('should handle complex nested objects', function() { + let obj1, obj2, obj3; + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(intersect([obj1, obj2], [obj2, obj3]), [obj1]); + + obj1 = { + text: 'foo1', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo2', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo3', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(intersect([obj1, obj2], [obj2, obj3]), [obj2]); + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo1/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo2/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo3/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(intersect([obj1, obj2], [obj2, obj3]), [obj2]); + + obj1 = { + text: 'foo', + arr: ['a','b','c', '1'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c', '2'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c', '3'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(intersect([obj1, obj2], [obj2, obj3]), [obj2]); + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 16) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 17) + } + assertArrayEqual(intersect([obj1, obj2], [obj2, obj3]), [obj2]); + + const fn1 = () => {}; + const fn2 = () => {}; + const fn3 = () => {}; + + obj1 = { + fn: fn1, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + fn: fn2, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 16) + }; + obj3 = { + fn: fn3, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 17) + } + assertArrayEqual(intersect([obj1, obj2], [obj2, obj3]), [obj2]); + }); + + it('should handle class instances', function() { + function Foo() {} + const f1 = new Foo; + const f2 = new Foo; + const f3 = new Foo; + + assertArrayEqual(intersect([f1, f2], [f2, f3]), [f2]); + assertArrayEqual( + intersect([{a:f1}, {a:f2}], [{a:f2}, {a:f3}]), + [{a:f2}] + ); + }); + + it('should work on sparse arrays', function() { + const arr1 = [1]; + arr1[10] = 2; + const arr2 = []; + arr2[20] = 2; + arr2[30] = 3; + assertArrayEqual(intersect(arr1, arr2), [2]); + }); + + it('should handle irregular input', function() { + assertError(() => { intersect([1,2], null); }); + assertError(() => { intersect(null); }); + assertError(() => { intersect('8'); }); + assertError(() => { intersect(8); }); + }); + + }); + + describeInstance('subtract', function(subtract) { + + it('should subtract basic values', function() { + assertArrayEqual(subtract([1,2], [2,3]), [1]); + assertArrayEqual(subtract(['a','b'], ['b','c']), ['a']); + assertArrayEqual(subtract([0,0], [0,0]), []); + }); + + it('should accept object values', function() { + assertArrayEqual( + subtract([{a:1},{b:2}], [{b:2},{c:3}]), + [{a:1}] + ); + }); + + it('should not affect the passed arrays', function() { + const arr1 = [1,2]; + const arr2 = [2,3]; + const result = subtract(arr1, arr2); + assertFalse(result === arr1); + assertFalse(result === arr2); + }); + + it('should distinguish between strings and numbers', function() { + assertArrayEqual(subtract([1,2,3], ['1','2','3']), [1,2,3]); + }); + + it('should work on nested arrays', function() { + assertArrayEqual(subtract([[1,2],[2,3]], [[1,2]]), [[2,3]]); + }); + + it('should work on nested booleans', function() { + assertArrayEqual(subtract([true, false], [false]), [true]); + }); + + it('should match functions by reference', function() { + const fn1 = () => {}; + const fn2 = () => {}; + const fn3 = () => {}; + assertArrayEqual(subtract([fn1, fn2], [fn2, fn3]), [fn1]); + }); + + it('should handle complex nested objects', function() { + let obj1, obj2, obj3; + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(subtract([obj1, obj2], [obj2, obj3]), []); + + obj1 = { + text: 'foo1', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo2', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo3', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(subtract([obj1, obj2], [obj2, obj3]), [obj1]); + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo1/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo2/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo3/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(subtract([obj1, obj2], [obj2, obj3]), [obj1]); + + obj1 = { + text: 'foo', + arr: ['a','b','c', '1'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c', '2'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c', '3'], + reg: /foo/, + date: new Date(2001, 5, 15) + } + assertArrayEqual(subtract([obj1, obj2], [obj2, obj3]), [obj1]); + + obj1 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 16) + }; + obj3 = { + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 17) + } + assertArrayEqual(subtract([obj1, obj2], [obj2, obj3]), [obj1]); + + const fn1 = () => {}; + const fn2 = () => {}; + const fn3 = () => {}; + + obj1 = { + fn: fn1, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 15) + }; + obj2 = { + fn: fn2, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 16) + }; + obj3 = { + fn: fn3, + text: 'foo', + arr: ['a','b','c'], + reg: /foo/, + date: new Date(2001, 5, 17) + } + assertArrayEqual(subtract([obj1, obj2], [obj2, obj3]), [obj1]); + }); + + it('should handle class instances', function() { + function Foo() {} + const f1 = new Foo; + const f2 = new Foo; + const f3 = new Foo; + + assertArrayEqual(subtract([f1, f2], [f2, f3]), [f1]); + assertArrayEqual( + subtract([{a:f1}, {a:f2}], [{a:f2}, {a:f3}]), + [{a:f1}] + ); + }); + + it('should work on sparse arrays', function() { + const arr1 = [1]; + arr1[10] = 2; + const arr2 = []; + arr2[20] = 2; + arr2[30] = 3; + assertArrayEqual(subtract(arr1, arr2), [1]); + }); + + it('should handle irregular input', function() { + assertError(() => { subtract([1,2], null); }); + assertError(() => { subtract(null); }); + assertError(() => { subtract('8'); }); + assertError(() => { subtract(8); }); + }); + + }); + }); From 487b9aa210558faba900048940e818c549bd0ec9 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 20:04:40 +0900 Subject: [PATCH 092/191] Added Array#add --- CHANGELOG.md | 4 ++++ src/array/add.js | 21 ++++++++++++++++++ src/array/define.js | 1 + src/array/methods.js | 1 + src/array/subtract.js | 3 +-- test/OLD/tests/array.js | 25 --------------------- test/tests/array.js | 48 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 src/array/add.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 317928e9e..bdcf678b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,10 @@ call `Function#lock` first in the chain to achieve the same effect. `Array#minAll` and `Array#maxAll`. - Changed `Object.select` and `Object.reject` now no longer accepts an object to select keys by. Use `Object.keys` on the input object for this case. +- Changed `Array#subtract` to only accept another array to subtract on. To + remove elements by value use `Array#exclude` instead. +- Changed `Array#add` second argument to add element at a specific index. Use + `Array#insert` for this instead. TODO: diff --git a/src/array/add.js b/src/array/add.js new file mode 100644 index 000000000..b27b0173c --- /dev/null +++ b/src/array/add.js @@ -0,0 +1,21 @@ +import { assertArray } from '../util/assertions'; + +/** + * Returns a new array with all elements in the second array added. + * + * @param {Array} arr1 - The array. + * @param {Array} arr2 - The array whose elements will be added. + * + * @returns {Array} + * + * @example + * + * [1,2].add([2,3]) -> [1,2,2,3] + * [user1, user2].add([user2, user3]) -> [user1, user2, user2, user3] + * + **/ +export default function arr(arr1, arr2) { + assertArray(arr1); + assertArray(arr2); + return [...arr1, ...arr2]; +} diff --git a/src/array/define.js b/src/array/define.js index 708a9809d..ceb65d088 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -1,6 +1,7 @@ import { defineInstance } from '../core/array'; import * as methods from './methods'; +defineInstance('add', methods.add); defineInstance('at', methods.at); defineInstance('average', methods.average); defineInstance('count', methods.count); diff --git a/src/array/methods.js b/src/array/methods.js index 19b0d3c77..4c8b1fe65 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1,3 +1,4 @@ +export { default as add } from './add'; export { default as at } from './at'; export { default as average } from './average'; export { default as count } from './count'; diff --git a/src/array/subtract.js b/src/array/subtract.js index d801dd369..91460b26c 100644 --- a/src/array/subtract.js +++ b/src/array/subtract.js @@ -2,7 +2,7 @@ import { assertArray } from '../util/assertions'; import { getSerializer } from '../util/object'; /** - * Returns a new array containing with all elements in the second array removed. + * Returns a new array with all elements in the second array removed. * * @param {Array} arr1 - The array. * @param {Array} arr2 - The array whose values will be removed. Elements are @@ -16,7 +16,6 @@ import { getSerializer } from '../util/object'; * * [1,2].subtract([2,3]) -> [1] * [user1, user2].subtract([user2, user3]) -> [user1] - * [user1].subtract([user2], [user3]) -> [user1] * **/ export default function subtract(arr1, arr2) { diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index f1a3adf3a..d7a7997b5 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -89,31 +89,6 @@ namespace('Array', function () { test([user1], [[user1, user2]], false, 'array of objects 1:2'); }); - method('add', function() { - - test([], [], [], 'nothing'); - test([1], [[2]], [1,2], '[1] + [2]'); - test([], [[1]], [1], '[] + [1]'); - - test(['a','b','d'], ['c', 2], ['a','b','c','d'], 'nothing'); - - test(oneUndefined, [oneUndefined], twoUndefined, 'undefined + undefined'); - test(oneUndefined, [twoUndefined], threeUndefined, 'undefined + 2undefined'); - - var arr = [1,2,3]; - var result = run(arr, 'add', [[4,5,6]]); - equal(result, [1,2,3,4,5,6], 'array should have been added'); - equal(arr, [1,2,3], 'original array should be untouched'); - - var arr1 = []; arr1[5] = 'a'; - var arr2 = []; arr1[10] = 'b'; - var expected = []; expected[5] = 'a'; expected[10] = 'b'; - var result = run(arr1, 'add', [arr2]); - equal(result, expected, 'should work on sparse arrays'); - equal(result.length, 11, 'sparse result length should be 11'); - - }); - method('append', function() { test([1,2,3], [4], [1,2,3,4], '[1,2,3] + 4'); diff --git a/test/tests/array.js b/test/tests/array.js index ee9ff1177..3a601473d 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2583,4 +2583,52 @@ namespace('Array', function() { }); + describeInstance('add', function(add) { + + it('should add basic values', function() { + assertArrayEqual(add([1,2], [2,3]), [1,2,2,3]); + assertArrayEqual(add(['a','b'], ['b','c']), ['a','b','b','c']); + assertArrayEqual(add([0,0], [0,0]), [0,0,0,0]); + }); + + it('should add object values', function() { + assertArrayEqual( + add([{a:1},{b:2}], [{b:2},{c:3}]), + [{a:1}, {b:2}, {b:2}, {c:3}] + ); + }); + + it('should add falsy values', function() { + assertArrayEqual(add([null], [null]), [null, null]); + assertArrayEqual(add([NaN], [NaN]), [NaN, NaN]); + assertArrayEqual(add([undefined], [undefined]), [undefined, undefined]); + assertArrayEqual(add([false], [false]), [false, false]); + assertArrayEqual(add([''], ['']), ['', '']); + }); + + it('should not affect the passed arrays', function() { + const arr1 = [1,2]; + const arr2 = [2,3]; + const result = add(arr1, arr2); + assertFalse(result === arr1); + assertFalse(result === arr2); + }); + + it('should work as expected on sparse arrays', function() { + const arr1 = [1]; + arr1[2] = 2; + const arr2 = [2]; + arr2[2] = 3; + assertArrayEqual(add(arr1, arr2), [1,undefined,2,2,undefined,3]); + }); + + it('should handle irregular input', function() { + assertError(() => { add([1,2], null); }); + assertError(() => { add(null); }); + assertError(() => { add('8'); }); + assertError(() => { add(8); }); + }); + + }); + }); From 11f17c35469e7f7e5e8329d80a8a3e18d1fb459d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 20:21:04 +0900 Subject: [PATCH 093/191] Added Array#append --- CHANGELOG.md | 4 +++- src/array/add.js | 2 ++ src/array/append.js | 24 ++++++++++++++++++++ src/array/define.js | 1 + src/array/methods.js | 1 + test/OLD/tests/array.js | 50 ----------------------------------------- test/tests/array.js | 47 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 78 insertions(+), 51 deletions(-) create mode 100644 src/array/append.js diff --git a/CHANGELOG.md b/CHANGELOG.md index bdcf678b7..565fd76e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,7 +100,9 @@ call `Function#lock` first in the chain to achieve the same effect. to select keys by. Use `Object.keys` on the input object for this case. - Changed `Array#subtract` to only accept another array to subtract on. To remove elements by value use `Array#exclude` instead. -- Changed `Array#add` second argument to add element at a specific index. Use +- Removed `Array#add` second argument to add element at a specific index. Use + `Array#insert` for this instead. +- Removed `Array#append` second argument to add element at a specific index. Use `Array#insert` for this instead. diff --git a/src/array/add.js b/src/array/add.js index b27b0173c..241502296 100644 --- a/src/array/add.js +++ b/src/array/add.js @@ -3,6 +3,8 @@ import { assertArray } from '../util/assertions'; /** * Returns a new array with all elements in the second array added. * + * @extra Use `Array#append` to modify the first array. + * * @param {Array} arr1 - The array. * @param {Array} arr2 - The array whose elements will be added. * diff --git a/src/array/append.js b/src/array/append.js new file mode 100644 index 000000000..6bb061c66 --- /dev/null +++ b/src/array/append.js @@ -0,0 +1,24 @@ +import { assertArray } from '../util/assertions'; + +/** + * Pushes all elements in the second array into the first. + * + * @extra Use `Array#add` for an alias that does not modify the original array. + * + * @param {Array} arr1 - The array. + * @param {Array} arr2 - The array whose elements will be appended. + * + * @returns {Array} + * + * @example + * + * [1,2].append([2,3]) -> [1,2,2,3] + * [user1, user2].append([user2, user3]) -> [user1, user2, user2, user3] + * + **/ +export default function append(arr1, arr2) { + assertArray(arr1); + assertArray(arr2); + arr1.push(...arr2); + return arr1; +} diff --git a/src/array/define.js b/src/array/define.js index ceb65d088..e937f7e74 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -2,6 +2,7 @@ import { defineInstance } from '../core/array'; import * as methods from './methods'; defineInstance('add', methods.add); +defineInstance('append', methods.append); defineInstance('at', methods.at); defineInstance('average', methods.average); defineInstance('count', methods.count); diff --git a/src/array/methods.js b/src/array/methods.js index 4c8b1fe65..8401a6bf2 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -1,4 +1,5 @@ export { default as add } from './add'; +export { default as append } from './append'; export { default as at } from './at'; export { default as average } from './average'; export { default as count } from './count'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index d7a7997b5..39b1d984d 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -89,56 +89,6 @@ namespace('Array', function () { test([user1], [[user1, user2]], false, 'array of objects 1:2'); }); - method('append', function() { - - test([1,2,3], [4], [1,2,3,4], '[1,2,3] + 4'); - test(['a','b','c'], ['d'], ['a','b','c','d'], '[a,b,c] + d'); - test([{a:1},{a:2}], [{a:3}], [{a:1},{a:2},{a:3}], '[a:1,a:2] + a:3'); - test([1,2,3], [[3,4,5]], [1,2,3,3,4,5], '[1,2,3] + [3,4,5]'); - test(['a','b','c'], [['c','d','e']], ['a','b','c','c','d','e'], '[a,b,c] + [c,d,e]'); - test([1,2,3], [[1,2,3]], [1,2,3,1,2,3], '[1,2,3] + [1,2,3]'); - test([1,2,3], [[3,2,1]], [1,2,3,3,2,1], '[1,2,3] + [3,2,1]'); - test([], [[3]], [3], '[] + [3]'); - test([3], [[]], [3], '[3] + []'); - test([], [[]], [], '[] + []'); - test([null], [[]], [null], '[null] + []'); - test([null], [[null]], [null, null], '[null] + [null]'); - test([false], [[false]], [false, false], '[false] + [false]'); - test([false], [[0]], [false, 0], '[false] + [0]'); - test([false], [[null]], [false, null], '[false] + [null]'); - test([false], nestedUndefined, safeArray(false, undefined), '[false] + [undefined]'); - test([{a:1},{b:2}], [[{b:2},{c:3}]], [{a:1},{b:2},{b:2},{c:3}], '[a:1,b:2] + [b:2,c:3]'); - test([1,1,3], [[1,5,6]], [1,1,3,1,5,6], '[1,1,3] + [1,5,6]'); - test([1,2,3], [[4,5,6]], [1,2,3,4,5,6], '[1,2,3] + [4,5,6]'); - test([1,2,3], [1], [1,2,3,1], '[1,2,3] + [1]'); - - test(['c','d'], [['a','b'], 0], ['a','b','c','d'], 'can effectively prepend'); - - test([1,2,3], [4, 1], [1,4,2,3], 'index 1 | 4'); - test(['a','b','c'], ['d', 1], ['a','d','b','c'], 'index 1 | d'); - test([{a:1},{a:2}], [{a:3}, 1], [{a:1},{a:3},{a:2}], 'index 1 | a:3'); - test([1,2,3], [4, 2], [1,2,4,3], 'index 2 | 4'); - test(['a','b','c'], ['d', 2], ['a','b','d','c'], 'index 2 | d'); - test([{a:1},{a:2}], [{a:3}, 2], [{a:1},{a:2},{a:3}], 'index 2 | a:3'); - - test(['a','b','c'], ['d', 0], ['d','a','b','c'], 'index 0 | d'); - test(['a','b','c'], ['d', 5], ['a','b','c','d'], 'index 5 | d'); - test(['a','b','c'], ['d', -1], ['a','b','d','c'], 'index -1 | d'); - test(['a','b','c'], ['d', -2], ['a','d','b','c'], 'index -2 | d'); - test(['a','b','c'], ['d', -3], ['d','a','b','c'], 'index -3 | d'); - test(['a','b','c'], ['d', -4], ['d','a','b','c'], 'index -4 | d'); - test(['a','b','c'], ['d', null], ['d','a','b','c'], 'null index | d'); - test(['a','b','c'], safeArray('d', undefined), ['a','b','c','d'], 'undefined index | d'); - test(['a','b','c'], ['d', 'a'], ['a','b','c','d'], 'index a | d'); - test(['a','b','c'], ['d', NaN], ['a','b','c','d'], 'index NaN | d'); - test(['a','b','c'], ['d', '0'], ['d','a','b','c'], "index '0' | d"); - - var arr = [1,2,3]; - run(arr, 'append', [4]); - equal(arr, [1,2,3,4], 'should affect the original array'); - - }); - method('insert', function() { test([1,2,3], [4], [1,2,3,4], '[1,2,3] + 4'); diff --git a/test/tests/array.js b/test/tests/array.js index 3a601473d..88cebacd4 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2631,4 +2631,51 @@ namespace('Array', function() { }); + describeInstance('append', function(append) { + + it('should append basic values', function() { + assertArrayEqual(append([1,2], [2,3]), [1,2,2,3]); + assertArrayEqual(append(['a','b'], ['b','c']), ['a','b','b','c']); + assertArrayEqual(append([0,0], [0,0]), [0,0,0,0]); + }); + + it('should append object values', function() { + assertArrayEqual( + append([{a:1},{b:2}], [{b:2},{c:3}]), + [{a:1}, {b:2}, {b:2}, {c:3}] + ); + }); + + it('should append falsy values', function() { + assertArrayEqual(append([null], [null]), [null, null]); + assertArrayEqual(append([NaN], [NaN]), [NaN, NaN]); + assertArrayEqual(append([undefined], [undefined]), [undefined, undefined]); + assertArrayEqual(append([false], [false]), [false, false]); + assertArrayEqual(append([''], ['']), ['', '']); + }); + + it('should modify the original array', function() { + const arr1 = [1,2]; + const arr2 = [2,3]; + const result = append(arr1, arr2); + assertTrue(result === arr1); + }); + + it('should work as expected on sparse arrays', function() { + const arr1 = [1]; + arr1[2] = 2; + const arr2 = [2]; + arr2[2] = 3; + assertArrayEqual(append(arr1, arr2), [1,,2,2,undefined,3]); + }); + + it('should handle irregular input', function() { + assertError(() => { append([1,2], null); }); + assertError(() => { append(null); }); + assertError(() => { append('8'); }); + assertError(() => { append(8); }); + }); + + }); + }); From f228ddaba774cf19c37a5435655644102a8b5bf3 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 20:42:49 +0900 Subject: [PATCH 094/191] Added Array#insert --- src/array/add.js | 2 +- src/array/define.js | 1 + src/array/insert.js | 33 +++++++++++++++++++++++++++ src/array/methods.js | 1 + test/OLD/tests/array.js | 49 ----------------------------------------- test/tests/array.js | 27 +++++++++++++++++++++++ 6 files changed, 63 insertions(+), 50 deletions(-) create mode 100644 src/array/insert.js diff --git a/src/array/add.js b/src/array/add.js index 241502296..85da0673d 100644 --- a/src/array/add.js +++ b/src/array/add.js @@ -16,7 +16,7 @@ import { assertArray } from '../util/assertions'; * [user1, user2].add([user2, user3]) -> [user1, user2, user2, user3] * **/ -export default function arr(arr1, arr2) { +export default function add(arr1, arr2) { assertArray(arr1); assertArray(arr2); return [...arr1, ...arr2]; diff --git a/src/array/define.js b/src/array/define.js index e937f7e74..014b1e6de 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -12,6 +12,7 @@ defineInstance('filter', methods.filter); defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); +defineInstance('insert', methods.insert); defineInstance('intersect', methods.intersect); defineInstance('isEmpty', methods.isEmpty); defineInstance('map', methods.map); diff --git a/src/array/insert.js b/src/array/insert.js new file mode 100644 index 000000000..b0d5b7655 --- /dev/null +++ b/src/array/insert.js @@ -0,0 +1,33 @@ +import { isArray } from '../util/typeChecks'; +import { assertArray } from '../util/assertions'; + +/** + * Inserts an element(s) into the array at a specific index. + * + * @param {Array} arr - The array. + * @param {any} insert - The element to be inserted. If an array, multiple + * elements will be inserted. + * @param {number} [index] - The index to insert the element(s) at. By default + * will add elements to the end of the array. + * + * @returns {Array} + * + * @example + * + * [1,3].insert(2, 1) -> [1,2,3] + * [1,4].insert([2,3], 1) -> [1,2,3,4] + * + **/ +export default function insert(arr, insert, index) { + assertArray(arr); + if (!isArray(insert)) { + insert = [insert]; + } + if (isNaN(index)) { + index = arr.length; + } + insert.forEach((el, i) => { + arr.splice(index + i, 0, el); + }); + return arr; +} diff --git a/src/array/methods.js b/src/array/methods.js index 8401a6bf2..2fb0ceb28 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -9,6 +9,7 @@ export { default as filter } from './filter'; export { default as find } from './find'; export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; +export { default as insert } from './insert'; export { default as intersect } from './intersect'; export { default as isEmpty } from './isEmpty'; export { default as map } from './map'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 39b1d984d..a5bfdc529 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -89,55 +89,6 @@ namespace('Array', function () { test([user1], [[user1, user2]], false, 'array of objects 1:2'); }); - method('insert', function() { - - test([1,2,3], [4], [1,2,3,4], '[1,2,3] + 4'); - test(['a','b','c'], ['d'], ['a','b','c','d'], '[a,b,c] + d'); - test([{a:1},{a:2}], [{a:3}], [{a:1},{a:2},{a:3}], '[a:1,a:2] + a:3'); - test([1,2,3], [[3,4,5]], [1,2,3,3,4,5], '[1,2,3] + [3,4,5]'); - test(['a','b','c'], [['c','d','e']], ['a','b','c','c','d','e'], '[a,b,c] + [c,d,e]'); - test([1,2,3], [[1,2,3]], [1,2,3,1,2,3], '[1,2,3] + [1,2,3]'); - test([1,2,3], [[3,2,1]], [1,2,3,3,2,1], '[1,2,3] + [3,2,1]'); - test([], [[3]], [3], '[] + [3]'); - test([3], [[]], [3], '[3] + []'); - test([], [[]], [], '[] + []'); - test([null], [[]], [null], '[null] + []'); - test([null], [[null]], [null, null], '[null] + [null]'); - test([false], [[false]], [false, false], '[false] + [false]'); - test([false], [[0]], [false, 0], '[false] + [0]'); - test([false], [[null]], [false, null], '[false] + [null]'); - test([false], nestedUndefined, safeArray(false, undefined), '[false] + [undefined]'); - test([{a:1},{b:2}], [[{b:2},{c:3}]], [{a:1},{b:2},{b:2},{c:3}], '[a:1,b:2] + [b:2,c:3]'); - test([1,1,3], [[1,5,6]], [1,1,3,1,5,6], '[1,1,3] + [1,5,6]'); - test([1,2,3], [[4,5,6]], [1,2,3,4,5,6], '[1,2,3] + [4,5,6]'); - test([1,2,3], [1], [1,2,3,1], '[1,2,3] + 1'); - - test([1,2,3], [4, 1], [1,4,2,3], 'index 1 | 4'); - test(['a','b','c'], ['d', 1], ['a','d','b','c'], 'index 1 | d'); - test([{a:1},{a:2}], [{a:3}, 1], [{a:1},{a:3},{a:2}], 'index 1 | a:3'); - test([1,2,3], [4, 2], [1,2,4,3], 'index 2 | 4'); - test(['a','b','c'], ['d', 2], ['a','b','d','c'], 'index 2 | d'); - test([{a:1},{a:2}], [{a:3}, 2], [{a:1},{a:2},{a:3}], 'index 2 | a:3'); - test(['a','b','c'], ['d', 5], ['a','b','c','d'], 'index 5 | d'); - - test(['a','b','c'], ['d', 0], ['d','a','b','c'], 'index 0 | d'); - test(['a','b','c'], ['d', -1], ['a','b','d','c'], 'index -1 | d'); - test(['a','b','c'], ['d', -2], ['a','d','b','c'], 'index -2 | d'); - test(['a','b','c'], ['d', -3], ['d','a','b','c'], 'index -3 | d'); - test(['a','b','c'], ['d', -4], ['d','a','b','c'], 'index -4 | d'); - test(['a','b','c'], ['d', null], ['d','a','b','c'], 'null index | d'); - test(['a','b','c'], safeArray('d', undefined), ['a','b','c','d'], 'undefined index | d'); - test(['a','b','c'], ['d', 'a'], ['a','b','c','d'], 'index a | d'); - test(['a','b','c'], ['d', NaN], ['a','b','c','d'], 'index NaN | d'); - - test(['a','b','c'], ['d', '0'], ['d','a','b','c'], 'string numerals should also be recognized'); - - var arr = [1,2,3]; - run(arr, 'insert', [4]); - equal(arr, [1,2,3,4], 'should affect the original array'); - - }); - method('removeAt', function() { test([1,2,2,3], [1,2,2,3], 'numeric | no argument'); test([1,2,2,3], [0], [2,2,3], 'numeric | 0'); diff --git a/test/tests/array.js b/test/tests/array.js index 88cebacd4..f3b222cc4 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2678,4 +2678,31 @@ namespace('Array', function() { }); + describeInstance('insert', function(insert) { + + it('should insert element at a specific index', function() { + assertArrayEqual(insert([1,2], 3, 0), [3,1,2]); + assertArrayEqual(insert([1,2], 3, 1), [1,3,2]); + assertArrayEqual(insert([1,2], 3, 2), [1,2,3]); + assertArrayEqual(insert([1,2], 3, 3), [1,2,3]); + }); + + it('should insert multiple elements at a specific index', function() { + assertArrayEqual(insert([1,4], [2,3], 0), [2,3,1,4]); + assertArrayEqual(insert([1,4], [2,3], 1), [1,2,3,4]); + assertArrayEqual(insert([1,4], [2,3], 2), [1,4,2,3]); + assertArrayEqual(insert([1,4], [2,3], 3), [1,4,2,3]); + }); + + it('should handle irregular input', function() { + assertArrayEqual(insert([1,2], 3), [1,2,3]); + assertArrayEqual(insert([1,2], 3, null), [3,1,2]); + assertArrayEqual(insert([1,2], 3, undefined), [1,2,3]); + assertError(() => { insert(null); }); + assertError(() => { insert('8'); }); + assertError(() => { insert(8); }); + }); + + }); + }); From b912d6c5bb6ebef2470979386f69bbac5e43ea8c Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 21:55:37 +0900 Subject: [PATCH 095/191] Added Array#compact --- CHANGELOG.md | 1 + src/array/compact.js | 23 +++++++++++ src/array/define.js | 1 + src/array/methods.js | 1 + src/util/object.js | 4 +- src/util/typeChecks.js | 8 +--- test/OLD/tests/array.js | 90 ----------------------------------------- test/tests/array.js | 28 +++++++++++++ 8 files changed, 58 insertions(+), 98 deletions(-) create mode 100644 src/array/compact.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 565fd76e3..690ccd546 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,7 @@ call `Function#lock` first in the chain to achieve the same effect. `Array#insert` for this instead. - Removed `Array#append` second argument to add element at a specific index. Use `Array#insert` for this instead. +- Removed `all` flag from `Array#compact`. Use `Array#filter` here instead. TODO: diff --git a/src/array/compact.js b/src/array/compact.js new file mode 100644 index 000000000..7ffa3fa55 --- /dev/null +++ b/src/array/compact.js @@ -0,0 +1,23 @@ +import { isNaN } from '../util/typeChecks'; +import { assertArray } from '../util/assertions'; + +/** + * Returns a new array with all instances of `null`, `undefined`, and `NaN` + * removed. + * + * @param {Array} arr - The array. + * + * @returns {Array} + * + * @example + * + * [1,null,2].compact() -> [1,2] + * [1,NaN,2].compact() -> [1,2] + * [1,undefined,2].compact() -> [1,2] + * [0,1,2].compact() -> [0,1,2] + * + **/ +export default function compact(arr) { + assertArray(arr); + return arr.filter((el) => el != null && !isNaN(el)); +} diff --git a/src/array/define.js b/src/array/define.js index 014b1e6de..ea17434be 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -5,6 +5,7 @@ defineInstance('add', methods.add); defineInstance('append', methods.append); defineInstance('at', methods.at); defineInstance('average', methods.average); +defineInstance('compact', methods.compact); defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); defineInstance('every', methods.every); diff --git a/src/array/methods.js b/src/array/methods.js index 2fb0ceb28..ab9766f2f 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -2,6 +2,7 @@ export { default as add } from './add'; export { default as append } from './append'; export { default as at } from './at'; export { default as average } from './average'; +export { default as compact } from './compact'; export { default as count } from './count'; export { default as every } from './every'; export { default as exclude } from './exclude'; diff --git a/src/util/object.js b/src/util/object.js index 4df0b5590..15399d9c9 100644 --- a/src/util/object.js +++ b/src/util/object.js @@ -1,4 +1,4 @@ -import { isPrimitive, isObject, isRealNaN } from './typeChecks'; +import { isPrimitive, isObject, isNaN } from './typeChecks'; import { hasOwnProperty, forEachProperty } from './helpers'; import { isClass, classToString } from './class'; @@ -33,7 +33,7 @@ export function serialize(obj, refs = [], stack = []) { const sign = 1 / obj === -Infinity ? '-' : ''; // Return quickly for primitives to save cycles - if (isPrimitive(obj, type) && !isRealNaN(obj)) { + if (isPrimitive(obj, type) && !isNaN(obj)) { return type + sign + obj; } diff --git a/src/util/typeChecks.js b/src/util/typeChecks.js index 3689c8bef..d3017e152 100644 --- a/src/util/typeChecks.js +++ b/src/util/typeChecks.js @@ -9,7 +9,8 @@ export const isRegExp = buildClassCheck('RegExp'); export const isError = buildClassCheck('Error'); -export const isArray = Array.isArray || buildClassCheck('Array'); +export const isArray = Array.isArray; +export const isNaN = Number.isNaN; export const isSet = buildClassCheck('Set', typeof Set !== 'undefined' && Set); export const isMap = buildClassCheck('Map', typeof Map !== 'undefined' && Map); @@ -30,11 +31,6 @@ export function isPrimitive(obj, type) { return obj == null || type === 'string' || type === 'number' || type === 'boolean'; } -export function isRealNaN(obj) { - // This is only true of NaN - return obj != null && obj !== obj; -} - export function isObject(obj, type) { // Protect against null. return !!obj && (type || typeof obj) === 'object'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index a5bfdc529..a50d7a72d 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -192,96 +192,6 @@ namespace('Array', function () { test(['a','b','c'], [-4], [], '-4'); }); - method('compact', function() { - var f1 = function() {}; - var f2 = function() {}; - - test([1,2,3], [1,2,3], '1,2,3'); - test([1,2,null,3], [1,2,3], '1,2,null,3'); - test([1,2,undefined,3], [1,2,3], '1,2,undefined,3'); - test(threeUndefined, [], 'undefined,undefined,undefined'); - test([null,null,null], [], 'null,null,null'); - test([NaN,NaN,NaN], [], 'NaN,NaN,NaN'); - test(['','',''], ['','',''], 'empty strings'); - test([false,false,false], [false,false,false], 'false is left alone'); - test([0,1,2], [0,1,2], '0,1,2'); - test([], [], 'empty array'); - test(['a','b','c'], ['a','b','c'], 'a,b,c'); - test([f1, f2], [f1, f2], 'functions'); - test([[null]], [[null]], 'does not deeply compact'); - test([null,[null],[false,[null,undefined,3]]], [[null],[false,[null,undefined,3]]], 'does not deeply compact | complex'); - - test([false,false,false], [true], [], 'falsy | false is removed'); - test([0,0], [true], [], 'falsy | 0'); - test(['',''], [true], [], 'falsy | empty string'); - test([' ',' '], [true], [' ',' '], 'falsy | strings with spaces are kept'); - test([8,3], [true], [8,3], 'falsy | numbers are kept'); - test([false,undefined,false,null,NaN], [true], [], 'falsy | others are also handled'); - }); - - method('groupBy', function() { - - var people = [ - { name: 'mary', age: 52, hair: 'blonde' }, - { name: 'edmund', age: 27, hair: 'blonde' }, - { name: 'jim', age: 27, hair: 'brown' }, - { name: 'ronnie', age: 13, hair: 'brown' } - ]; - - test([], {}, 'empty array'); - test([1,1,2,2,3,3,4], {1:[1,1],2:[2,2],3:[3,3],4:[4]}, '1,1,2,2,3,3,4'); - test(['a','b','c','a','e','c'], {'a':['a','a'],'b':['b'],'c':['c','c'],'e':['e']}, 'a,b,c,a,e,c'); - test([{a:1,b:5},{a:8,b:5},{a:8,b:3}], ['a'], {8:[{a:8,b:5},{a:8,b:3}],1:[{a:1,b:5}]}, 'grouping by "a"'); - test([{a:1,b:5},{a:8,b:5},{a:8,b:3}], [function(el) { return el['a']; }], {8:[{a:8,b:5},{a:8,b:3}],1:[{a:1,b:5}]}, 'grouping by "a" by function'); - - - test(people, [function(p) { return p.age; }], {27: [{name:'edmund',age:27,hair:'blonde'},{name:'jim',age:27,hair:'brown'}],52:[{name:'mary',age:52,hair:'blonde'}],13:[{name:'ronnie',age:13,hair:'brown'}]}, 'grouping people by age'); - - test([1,2,3], oneUndefined, { 1: [1], 2: [2], 3: [3] }, 'undefined'); - test([1,2,3], [null], { 1: [1], 2: [2], 3: [3] }, 'null'); - test([1,2,3], [4], { 'undefined': [1,2,3] }, 'number'); - - var counter = 0; - var expectedGroups = [['one','two'],['three']], expectedKeys = ['3','5'], groups = [], keys = []; - var fn = function(group, key) { - groups.push(group); - keys.push(key); - counter++; - } - run(['one','two','three'], 'groupBy', ['length', fn]); - equal(counter, 2, 'should allow a callback fn'); - equal(groups, expectedGroups, 'Groups should be equal'); - equal(keys, expectedKeys, 'Keys should be equal'); - - var arr1 = ['a','b','c']; - var arr2 = ['d','e','f']; - var fn = function(el, i) { - return arr2[i]; - }; - var obj = run(arr1, 'groupBy', [fn]); - - var fn = function(el,i,a) { - equal(this, [1], 'scope should be the array'); - equal(i, 0, 'second param should be the index'); - equal(a, [1], 'third param should also be the array'); - } - run([1], 'groupBy', [fn]); - - equal(obj, { 'd':['a'],'e':['b'],'f':['c'] }, 'should use an index'); - - var arr = [ - {id:1,a:{b:{c:'x'}}}, - {id:2,a:{b:{c:'x'}}}, - {id:3,a:{b:{c:'y'}}} - ]; - var expected = { - x: [{id:1,a:{b:{c:'x'}}}, {id:2,a:{b:{c:'x'}}}], - y: [{id:3,a:{b:{c:'y'}}}] - }; - test(arr, ['a.b.c'], expected, 'grouping by deep dot operator'); - - }); - method('inGroups', function() { test([1,2,3,4,5,6,7,8,9,10], [1], [[1,2,3,4,5,6,7,8,9,10]], 'in groups of 1'); test([1,2,3,4,5,6,7,8,9,10], [2], [[1,2,3,4,5],[6,7,8,9,10]], 'in groups of 2'); diff --git a/test/tests/array.js b/test/tests/array.js index f3b222cc4..fabc98607 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2705,4 +2705,32 @@ namespace('Array', function() { }); + describeInstance('compact', function(compact) { + + it('should remove null and undefined', function() { + assertArrayEqual(compact([1,null,2]), [1,2]); + assertArrayEqual(compact([1,undefined,2]), [1,2]); + assertArrayEqual(compact([null, null]), []); + assertArrayEqual(compact([undefined, undefined]), []); + }); + + it('should remove NaN', function() { + assertArrayEqual(compact([NaN]), []); + assertArrayEqual(compact([0,NaN,1]), [0,1]); + }); + + it('should not remove false, 0, or empty strings', function() { + assertArrayEqual(compact(['']), ['']); + assertArrayEqual(compact([0]), [0]); + assertArrayEqual(compact([false]), [false]); + }); + + it('should handle irregular input', function() { + assertError(() => { compact(null); }); + assertError(() => { compact('8'); }); + assertError(() => { compact(8); }); + }); + + }); + }); From 9ad355dd562ba64fe968659fc442391577022f09 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 22:19:50 +0900 Subject: [PATCH 096/191] Added Array#zip --- src/array/define.js | 1 + src/array/methods.js | 1 + src/array/zip.js | 27 +++++++++++++++++++++++++++ test/OLD/tests/array.js | 8 -------- test/tests/array.js | 18 ++++++++++++++++++ 5 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 src/array/zip.js diff --git a/src/array/define.js b/src/array/define.js index ea17434be..508da41f3 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -32,3 +32,4 @@ defineInstance('subtract', methods.subtract); defineInstance('sum', methods.sum); defineInstance('union', methods.union); defineInstance('unique', methods.unique); +defineInstance('zip', methods.zip); diff --git a/src/array/methods.js b/src/array/methods.js index ab9766f2f..cc716a52f 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -29,3 +29,4 @@ export { default as subtract } from './subtract'; export { default as sum } from './sum'; export { default as union } from './union'; export { default as unique } from './unique'; +export { default as zip } from './zip'; diff --git a/src/array/zip.js b/src/array/zip.js new file mode 100644 index 000000000..15f45c468 --- /dev/null +++ b/src/array/zip.js @@ -0,0 +1,27 @@ +import { assertArray } from '../util/assertions'; + +/** + * Merges multiple arrays together in a "zipper" fashion where the elements of + * the resulting array are "all elements at index 0", "all elements at index 1", + * etc. + * + * @extra Useful when you have associated data that is split over separated + * arrays. If the arrays passed have more elements than the original array, + * they will be discarded. If they have fewer elements, the missing elements + * will filled with `null`. + * + * @returns {Array} + * + * @example + * + * [1,2,3].zip([4,5,6]) -> [[1,2], [3,4], [5,6]] + * + **/ +export default function zip(arr, ...args) { + assertArray(arr); + return arr.map((el, i) => { + return [el, ...args.map((arr) => { + return (i in arr) ? arr[i] : null; + })]; + }); +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index a50d7a72d..b53bbbe71 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -256,12 +256,4 @@ namespace('Array', function () { }); - method('zip', function() { - test([1, 2, 3], [[1], [2], [3]], 'one array'); - test([1, 2, 3], [[4, 5, 6]], [[1, 4], [2, 5], [3, 6]], 'two arrays'); - test([1, 2, 3], [[4, 5, 6], [7, 8, 9]], [[1, 4, 7], [2, 5, 8], [3, 6, 9]], 'three arrays'); - test([1, 2], [[4, 5, 6], [7, 8, 9]], [[1, 4, 7], [2, 5, 8]], 'constrained by length of first'); - test([4, 5, 6], [[1, 2], [8]], [[4, 1, 8], [5, 2, null], [6, null, null]], 'filled with null'); - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index fabc98607..7ca0c1d32 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2733,4 +2733,22 @@ namespace('Array', function() { }); + describeInstance('zip', function(zip) { + + it('should handle basic functionality', function() { + assertArrayEqual(zip([1, 2, 3]), [[1], [2], [3]]); + assertArrayEqual(zip([1, 2, 3], [4, 5, 6]), [[1, 4], [2, 5], [3, 6]]); + assertArrayEqual(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]), [[1, 4, 7], [2, 5, 8], [3, 6, 9]]); + assertArrayEqual(zip([1, 2], [4, 5, 6], [7, 8, 9]), [[1, 4, 7], [2, 5, 8]]); + assertArrayEqual(zip([4, 5, 6], [1, 2], [8]), [[4, 1, 8], [5, 2, null], [6, null, null]]); + }); + + it('should handle irregular input', function() { + assertError(() => { zip(null); }); + assertError(() => { zip('8'); }); + assertError(() => { zip(8); }); + }); + + }); + }); From 2f66e44e26d147923119b778ead44d0d6cba5825 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Fri, 4 Sep 2020 23:41:03 +0900 Subject: [PATCH 097/191] Added Array#inGroupsOf --- src/array/define.js | 1 + src/array/inGroupsOf.js | 40 +++++++++++++++++++++++++++++++++ src/array/methods.js | 1 + test/OLD/tests/array.js | 49 ----------------------------------------- test/tests/array.js | 46 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 49 deletions(-) create mode 100644 src/array/inGroupsOf.js diff --git a/src/array/define.js b/src/array/define.js index 508da41f3..335f0bc65 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -13,6 +13,7 @@ defineInstance('filter', methods.filter); defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); +defineInstance('inGroupsOf', methods.inGroupsOf); defineInstance('insert', methods.insert); defineInstance('intersect', methods.intersect); defineInstance('isEmpty', methods.isEmpty); diff --git a/src/array/inGroupsOf.js b/src/array/inGroupsOf.js new file mode 100644 index 000000000..6039545ea --- /dev/null +++ b/src/array/inGroupsOf.js @@ -0,0 +1,40 @@ +import { assertArray, assertPositiveInteger } from '../util/assertions'; + +/** + * Groups the array into arrays of `n` elements. + * + * @param {Array} arr - The array. + * @param {number} n - The number of elements in the resulting groups. Must be a + * positive integer. + * @param {any} [padding] - When passed, will pad the last array to be of equal + * length as the rest. + * + * @returns {Array} + * + * @example + * + * [1,2,3,4].inGroupsOf(2) -> [[1,2], [3,4]] + * [1,2,3,4,5].inGroupsOf(2) -> [[1,2], [3,4], [5]] + * [1,2,3,4,5].inGroupsOf(2, null) -> [[1,2], [3,4], [5,null]] + * + **/ +export default function inGroupsOf(arr, n, padding) { + assertArray(arr); + assertPositiveInteger(n); + const result = []; + const len = Math.ceil(arr.length / n); + const pad = arguments.length === 3; + for (let i = 0; i < len; i++) { + const group = []; + for (let j = 0; j < n; j++) { + const idx = i * n + j; + if (idx in arr) { + group.push(arr[idx]); + } else if (pad) { + group.push(padding); + } + } + result.push(group); + } + return result; +} diff --git a/src/array/methods.js b/src/array/methods.js index cc716a52f..94a53ef11 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -10,6 +10,7 @@ export { default as filter } from './filter'; export { default as find } from './find'; export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; +export { default as inGroupsOf } from './inGroupsOf'; export { default as insert } from './insert'; export { default as intersect } from './intersect'; export { default as isEmpty } from './isEmpty'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index b53bbbe71..d283abb94 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -207,53 +207,4 @@ namespace('Array', function () { test([1,2,3,4,5,6,7,8,9,10], [7, null], [[1,2],[3,4],[5,6],[7,8],[9,10],[null,null],[null,null]], 'pad with null | in groups of 7'); }); - method('inGroupsOf', function() { - - test([1,2,3,4,5,6,7,8,9,10], [3], [[1,2,3],[4,5,6],[7,8,9],[10,null,null]], 'groups of 3 | 1 to 10'); - test([1,2,3,4,5,6,7,8,9], [3], [[1,2,3],[4,5,6],[7,8,9]], 'groups of 3 | 1 to 9'); - test([1,2,3,4,5,6,7,8], [3], [[1,2,3],[4,5,6],[7,8,null]], 'groups of 3 | 1 to 8'); - test([1,2,3,4,5,6,7], [3], [[1,2,3],[4,5,6],[7,null,null]], 'groups of 3 | 1 to 7'); - test([1,2,3,4,5,6], [3], [[1,2,3],[4,5,6]], 'groups of 3 | 1 to 6'); - test([1,2,3,4,5], [3], [[1,2,3],[4,5,null]], 'groups of 3 | 1 to 5'); - test([1,2,3,4], [3], [[1,2,3],[4,null,null]], 'groups of 3 | 1 to 4'); - test([1,2,3], [3], [[1,2,3]], 'groups of 3 | 1 to 3'); - test([1,2], [3], [[1,2,null]], 'groups of 3 | 1 to 2'); - test([1], [3], [[1,null,null]], 'groups of 3 | 1'); - - test([1,2,3,4,5,6,7,8,9,10], [3, null], [[1,2,3],[4,5,6],[7,8,9],[10, null, null]], 'groups of 3 | pad with null | 1 to 10'); - test([1,2,3,4,5,6,7,8,9], [3, null], [[1,2,3],[4,5,6],[7,8,9]], 'groups of 3 | pad with null | 1 to 9'); - test([1,2,3,4,5,6,7,8], [3, null], [[1,2,3],[4,5,6],[7,8, null]], 'groups of 3 | pad with null | 1 to 8'); - test([1,2,3,4,5,6,7], [3, null], [[1,2,3],[4,5,6],[7, null, null]], 'groups of 3 | pad with null | 1 to 7'); - test([1,2,3,4,5,6], [3, null], [[1,2,3],[4,5,6]], 'groups of 3 | pad with null | 1 to 6'); - test([1,2,3,4,5], [3, null], [[1,2,3],[4,5,null]], 'groups of 3 | pad with null | 1 to 5'); - test([1,2,3,4], [3, null], [[1,2,3],[4,null,null]], 'groups of 3 | pad with null | 1 to 4'); - test([1,2,3], [3, null], [[1,2,3]], 'groups of 3 | pad with null | 1 to 3'); - test([1,2], [3, null], [[1,2,null]], 'groups of 3 | pad with null | 1 to 2'); - test([1], [3, null], [[1,null,null]], 'groups of 3 | pad with null | 1'); - - test([1], [3, ' '], [[1,' ',' ']], 'pad with spaces'); - test([1], [3, true], [[1,true,true]], 'pad with true'); - test([1], [3, false], [[1,false,false]], 'pad with false'); - - test([1], [], [[1]], 'no argument'); - test([1], [1, null], [[1]], 'pad with null | no argument'); - - test([1], [0], [1], '0'); - test([1], [0, null], [1], 'pad with null | 0'); - - test([1], [3, null], [[1, null, null]], 'pad with null | 3'); - test([1], [1, null], [[1]], 'pad with null | 1'); - test([], [3], [], 'empty array'); - test([], [3, null], [], 'pad with null | empty array'); - test([null], [3], [[null,null,null]], '[null] in groups of 3'); - test([null], [3, null], [[null,null,null]], 'pad with null | [null] in groups of 3'); - test([1], safeArray(3, undefined), [[1,null,null]], 'passing undefined reverts to null'); - - // Issue #142 - inGroupsOf corrupting array length - var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; - run(arr, 'inGroupsOf', [3]); - equal(arr.length, 20, 'does not corrupt original array length'); - - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index 7ca0c1d32..41c9b6c37 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2751,4 +2751,50 @@ namespace('Array', function() { }); + describeInstance('inGroupsOf', function(inGroupsOf) { + + it('should group elements', function() { + assertArrayEqual(inGroupsOf([1,2,3,4,5,6], 2), [[1,2],[3,4],[5,6]]); + assertArrayEqual(inGroupsOf([1,2,3,4,5,6], 3), [[1,2,3],[4,5,6]]); + assertArrayEqual(inGroupsOf([1,2,3], 1), [[1],[2],[3]]); + assertArrayEqual(inGroupsOf([1,2], 1), [[1],[2]]); + assertArrayEqual(inGroupsOf([1], 1), [[1]]); + assertArrayEqual(inGroupsOf([], 1), []); + assertArrayEqual(inGroupsOf([], 2), []); + assertArrayEqual(inGroupsOf([], 100), []); + }); + + it('should group elements without padding', function() { + assertArrayEqual(inGroupsOf([1,2,3,4,5], 3), [[1,2,3],[4,5]]); + }); + + it('should group elements with padding', function() { + assertArrayEqual(inGroupsOf([1,2,3,4,5], 3, null), [[1,2,3],[4,5,null]]); + assertArrayEqual(inGroupsOf([1,2,3,4,5], 2, null), [[1,2],[3,4],[5,null]]); + assertArrayEqual(inGroupsOf([1], 3, null), [[1,null,null]]); + }); + + it('should work as expected on sparse arrays', function() { + const arr = [1]; + arr[3] = 3; + assertArrayEqual(inGroupsOf(arr, 2, null), [[1,null],[null,3]]); + }); + + it('should handle issue #142', () => { + const arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; + inGroupsOf(arr, 3); + assertEqual(arr.length, 20); + }); + + it('should handle irregular input', function() { + assertError(() => { inGroupsOf([], null); }); + assertError(() => { inGroupsOf([], -1); }); + assertError(() => { inGroupsOf([], 0); }); + assertError(() => { inGroupsOf(null); }); + assertError(() => { inGroupsOf('8'); }); + assertError(() => { inGroupsOf(8); }); + }); + + }); + }); From 352f022dfe504c649de797ba0c27451afae73da5 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 5 Sep 2020 13:34:23 +0900 Subject: [PATCH 098/191] Added Array#inGroups --- src/array/define.js | 1 + src/array/inGroups.js | 39 ++++++++++++++++++++++++++++++++++ src/array/inGroupsOf.js | 4 ++-- src/array/methods.js | 1 + test/OLD/tests/array.js | 15 -------------- test/tests/array.js | 46 +++++++++++++++++++++++++++++++++++++---- 6 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 src/array/inGroups.js diff --git a/src/array/define.js b/src/array/define.js index 335f0bc65..654a9065e 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -13,6 +13,7 @@ defineInstance('filter', methods.filter); defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); defineInstance('groupBy', methods.groupBy); +defineInstance('inGroups', methods.inGroups); defineInstance('inGroupsOf', methods.inGroupsOf); defineInstance('insert', methods.insert); defineInstance('intersect', methods.intersect); diff --git a/src/array/inGroups.js b/src/array/inGroups.js new file mode 100644 index 000000000..d4264c1cf --- /dev/null +++ b/src/array/inGroups.js @@ -0,0 +1,39 @@ +import { assertArray, assertPositiveInteger } from '../util/assertions'; + +/** + * Groups the array into `n` arrays. + * + * @param {Array} arr - The array. + * @param {number} n - The number of groups. Must be a positive integer. + * @param {any} [padding] - When passed, will pad the last array to be of equal + * length as the rest. + * + * @returns {Array} + * + * @example + * + * [1,2,3,4,5,6].inGroups(2) -> [[1,2,3], [4,5,6]] + * [1,2,3,4,5,6].inGroups(3) -> [[1,2], [3,4], [5,6]] + * [1,2,3,4,5,6].inGroups(3, null) -> [[1,2], [3,4], [5,null]] + * + **/ +export default function inGroups(arr, n, padding) { + assertArray(arr); + assertPositiveInteger(n); + const result = []; + const pad = arguments.length === 3; + const size = Math.ceil(arr.length / n); + for (let i = 0; i < n; i++) { + const group = []; + for (let j = 0; j < size; j++) { + const idx = i * size + j; + if (idx in arr) { + group.push(arr[idx]); + } else if (pad) { + group.push(padding); + } + } + result.push(group); + } + return result; +} diff --git a/src/array/inGroupsOf.js b/src/array/inGroupsOf.js index 6039545ea..c7936d950 100644 --- a/src/array/inGroupsOf.js +++ b/src/array/inGroupsOf.js @@ -22,9 +22,9 @@ export default function inGroupsOf(arr, n, padding) { assertArray(arr); assertPositiveInteger(n); const result = []; - const len = Math.ceil(arr.length / n); const pad = arguments.length === 3; - for (let i = 0; i < len; i++) { + const size = Math.ceil(arr.length / n); + for (let i = 0; i < size; i++) { const group = []; for (let j = 0; j < n; j++) { const idx = i * n + j; diff --git a/src/array/methods.js b/src/array/methods.js index 94a53ef11..e801bc3fc 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -10,6 +10,7 @@ export { default as filter } from './filter'; export { default as find } from './find'; export { default as findIndex } from './findIndex'; export { default as groupBy } from './groupBy'; +export { default as inGroups } from './inGroups'; export { default as inGroupsOf } from './inGroupsOf'; export { default as insert } from './insert'; export { default as intersect } from './intersect'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index d283abb94..a28b64bf2 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -192,19 +192,4 @@ namespace('Array', function () { test(['a','b','c'], [-4], [], '-4'); }); - method('inGroups', function() { - test([1,2,3,4,5,6,7,8,9,10], [1], [[1,2,3,4,5,6,7,8,9,10]], 'in groups of 1'); - test([1,2,3,4,5,6,7,8,9,10], [2], [[1,2,3,4,5],[6,7,8,9,10]], 'in groups of 2'); - test([1,2,3,4,5,6,7,8,9,10], [3], [[1,2,3,4],[5,6,7,8],[9,10]], 'in groups of 3'); - test([1,2,3,4,5,6,7,8,9,10], [4], [[1,2,3],[4,5,6],[7,8,9],[10]], 'in groups of 4'); - test([1,2,3,4,5,6,7,8,9,10], [5], [[1,2],[3,4],[5,6],[7,8],[9,10]], 'in groups of 5'); - test([1,2,3,4,5,6,7,8,9,10], [6], [[1,2],[3,4],[5,6],[7,8],[9,10],[]], 'in groups of 6'); - test([1,2,3,4,5,6,7,8,9,10], [7], [[1,2],[3,4],[5,6],[7,8],[9,10],[],[]], 'in groups of 7'); - test([1,2,3,4,5,6,7,8,9,10], [3, null], [[1,2,3,4],[5,6,7,8],[9,10,null,null]], 'pad with null | in groups of 3'); - test([1,2,3,4,5,6,7,8,9,10], [4, null], [[1,2,3],[4,5,6],[7,8,9],[10,null,null]], 'pad with null | in groups of 4'); - test([1,2,3,4,5,6,7,8,9,10], [5, null], [[1,2],[3,4],[5,6],[7,8],[9,10]], 'pad with null | in groups of 5'); - test([1,2,3,4,5,6,7,8,9,10], [6, null], [[1,2],[3,4],[5,6],[7,8],[9,10],[null,null]], 'pad with null | in groups of 6'); - test([1,2,3,4,5,6,7,8,9,10], [7, null], [[1,2],[3,4],[5,6],[7,8],[9,10],[null,null],[null,null]], 'pad with null | in groups of 7'); - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index 41c9b6c37..b84bc847a 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2751,6 +2751,48 @@ namespace('Array', function() { }); + describeInstance('inGroups', function(inGroups) { + + it('should group elements', function() { + assertArrayEqual(inGroups([1,2,3,4,5,6], 1), [[1,2,3,4,5,6]]); + assertArrayEqual(inGroups([1,2,3,4,5,6], 2), [[1,2,3],[4,5,6]]); + assertArrayEqual(inGroups([1,2,3,4,5,6], 3), [[1,2],[3,4],[5,6]]); + assertArrayEqual(inGroups([1,2,3,4,5], 2), [[1,2,3],[4,5]]); + assertArrayEqual(inGroups([1,2], 1), [[1,2]]); + assertArrayEqual(inGroups([1], 1), [[1]]); + assertArrayEqual(inGroups([], 1), [[]]); + assertArrayEqual(inGroups([], 2), [[],[]]); + }); + + it('should group elements with padding', function() { + assertArrayEqual(inGroups([1,2,3,4,5], 2, null), [[1,2,3],[4,5,null]]); + assertArrayEqual(inGroups([1,2,3,4,5], 3, null), [[1,2],[3,4],[5,null]]); + assertArrayEqual(inGroups([1], 2, null), [[1],[null]]); + }); + + it('should work as expected on sparse arrays', function() { + const arr = [1]; + arr[3] = 3; + assertArrayEqual(inGroups(arr, 2, null), [[1,null],[null,3]]); + }); + + it('should handle issue #142', () => { + const arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; + inGroups(arr, 3); + assertEqual(arr.length, 20); + }); + + it('should handle irregular input', function() { + assertError(() => { inGroups([], null); }); + assertError(() => { inGroups([], -1); }); + assertError(() => { inGroups([], 0); }); + assertError(() => { inGroups(null); }); + assertError(() => { inGroups('8'); }); + assertError(() => { inGroups(8); }); + }); + + }); + describeInstance('inGroupsOf', function(inGroupsOf) { it('should group elements', function() { @@ -2764,10 +2806,6 @@ namespace('Array', function() { assertArrayEqual(inGroupsOf([], 100), []); }); - it('should group elements without padding', function() { - assertArrayEqual(inGroupsOf([1,2,3,4,5], 3), [[1,2,3],[4,5]]); - }); - it('should group elements with padding', function() { assertArrayEqual(inGroupsOf([1,2,3,4,5], 3, null), [[1,2,3],[4,5,null]]); assertArrayEqual(inGroupsOf([1,2,3,4,5], 2, null), [[1,2],[3,4],[5,null]]); From 2c86c5e7037281a795e7b599b3d5e81a600f916a Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 5 Sep 2020 14:00:01 +0900 Subject: [PATCH 099/191] Added Array#first/last/from/to --- src/array/define.js | 4 ++ src/array/first.js | 26 +++++++++++ src/array/from.js | 22 ++++++++++ src/array/last.js | 26 +++++++++++ src/array/methods.js | 4 ++ src/array/to.js | 22 ++++++++++ test/OLD/tests/array.js | 50 --------------------- test/tests/array.js | 96 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 200 insertions(+), 50 deletions(-) create mode 100644 src/array/first.js create mode 100644 src/array/from.js create mode 100644 src/array/last.js create mode 100644 src/array/to.js diff --git a/src/array/define.js b/src/array/define.js index 654a9065e..e4f7d9402 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -12,12 +12,15 @@ defineInstance('every', methods.every); defineInstance('filter', methods.filter); defineInstance('find', methods.find); defineInstance('findIndex', methods.findIndex); +defineInstance('first', methods.first); +defineInstance('from', methods.from); defineInstance('groupBy', methods.groupBy); defineInstance('inGroups', methods.inGroups); defineInstance('inGroupsOf', methods.inGroupsOf); defineInstance('insert', methods.insert); defineInstance('intersect', methods.intersect); defineInstance('isEmpty', methods.isEmpty); +defineInstance('last', methods.last); defineInstance('map', methods.map); defineInstance('max', methods.max); defineInstance('maxAll', methods.maxAll); @@ -32,6 +35,7 @@ defineInstance('some', methods.some); defineInstance('sortBy', methods.sortBy); defineInstance('subtract', methods.subtract); defineInstance('sum', methods.sum); +defineInstance('to', methods.to); defineInstance('union', methods.union); defineInstance('unique', methods.unique); defineInstance('zip', methods.zip); diff --git a/src/array/first.js b/src/array/first.js new file mode 100644 index 000000000..ec2f842d8 --- /dev/null +++ b/src/array/first.js @@ -0,0 +1,26 @@ +import { assertArray, assertPositiveInteger } from '../util/assertions'; + +/** + * Returns the first element(s) of the array. + * + * @param {Array} arr - The array. + * @param {number} [n] - When passed returns the first `n` elements in the + * array, otherwise returns the first element. Must be a positive integer. + * + * @returns {any} + * + * @example + * + * [1,2,3].first() -> 1 + * [1,2,3].first(2) -> [1,2] + * + **/ +export default function first(arr, n) { + assertArray(arr); + if (arguments.length === 2) { + assertPositiveInteger(n); + return arr.slice(0, n); + } else { + return arr[0]; + } +} diff --git a/src/array/from.js b/src/array/from.js new file mode 100644 index 000000000..41b041c2c --- /dev/null +++ b/src/array/from.js @@ -0,0 +1,22 @@ +import { assertArray, assertInteger } from '../util/assertions'; + +/** + * Returns elements in the array from the given index. + * + * @param {Array} arr - The array. + * @param {number} n - The index of the array to start at. May be negative. + * Must be an integer. + * + * @returns {Array} + * + * @example + * + * [1,2,3].from(1) -> [2,3] + * [1,2,3].from(2) -> [3] + * + **/ +export default function from(arr, n) { + assertArray(arr); + assertInteger(n); + return arr.slice(n); +} diff --git a/src/array/last.js b/src/array/last.js new file mode 100644 index 000000000..92cce6789 --- /dev/null +++ b/src/array/last.js @@ -0,0 +1,26 @@ +import { assertArray, assertPositiveInteger } from '../util/assertions'; + +/** + * Returns the last element(s) of the array. + * + * @param {Array} arr - The array. + * @param {number} [n] - When passed returns the last `n` elements in the + * array, otherwise returns the last element. Must be a positive integer. + * + * @returns {any} + * + * @example + * + * [1,2,3].last() -> 3 + * [1,2,3].last(2) -> [2,3] + * + **/ +export default function last(arr, n) { + assertArray(arr); + if (arguments.length === 2) { + assertPositiveInteger(n); + return arr.slice(-n); + } else { + return arr[arr.length - 1]; + } +} diff --git a/src/array/methods.js b/src/array/methods.js index e801bc3fc..3629feb4a 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -9,12 +9,15 @@ export { default as exclude } from './exclude'; export { default as filter } from './filter'; export { default as find } from './find'; export { default as findIndex } from './findIndex'; +export { default as first } from './first'; +export { default as from } from './from'; export { default as groupBy } from './groupBy'; export { default as inGroups } from './inGroups'; export { default as inGroupsOf } from './inGroupsOf'; export { default as insert } from './insert'; export { default as intersect } from './intersect'; export { default as isEmpty } from './isEmpty'; +export { default as last } from './last'; export { default as map } from './map'; export { default as max } from './max'; export { default as maxAll } from './maxAll'; @@ -29,6 +32,7 @@ export { default as some } from './some'; export { default as sortBy } from './sortBy'; export { default as subtract } from './subtract'; export { default as sum } from './sum'; +export { default as to } from './to'; export { default as union } from './union'; export { default as unique } from './unique'; export { default as zip } from './zip'; diff --git a/src/array/to.js b/src/array/to.js new file mode 100644 index 000000000..96243e94f --- /dev/null +++ b/src/array/to.js @@ -0,0 +1,22 @@ +import { assertArray, assertInteger } from '../util/assertions'; + +/** + * Returns elements in the array up to the given index. + * + * @param {Array} arr - The array. + * @param {number} n - The index of the array to end at. May be negative. + * Must be an integer. + * + * @returns {Array} + * + * @example + * + * [1,2,3].to(1) -> [1] + * [1,2,3].to(2) -> [1,2] + * + **/ +export default function to(arr, n) { + assertArray(arr); + assertInteger(n); + return arr.slice(0, n); +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index a28b64bf2..2d21dc9d7 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -142,54 +142,4 @@ namespace('Array', function () { }); - method('first', function() { - test(['a','b','c'], 'a', 'no argument'); - test(['a','b','c'], [1], ['a'], '1'); - test(['a','b','c'], [2], ['a','b'], '2'); - test(['a','b','c'], [3], ['a','b','c'], '3'); - test(['a','b','c'], [4], ['a','b','c'], '4'); - test(['a','b','c'], [-1], [], '-1'); - test(['a','b','c'], [-2], [], '-2'); - test(['a','b','c'], [-3], [], '-3'); - }); - - - method('last', function() { - test(['a','b','c'], 'c', 'no argument'); - test(['a','b','c'], [1], ['c'], '1'); - test(['a','b','c'], [2], ['b','c'], '2'); - test(['a','b','c'], [3], ['a','b','c'], '3'); - test(['a','b','c'], [4], ['a','b','c'], '4'); - test(['a','b','c'], [-1], [], '-1'); - test(['a','b','c'], [-2], [], '-2'); - test(['a','b','c'], [-3], [], '-3'); - test(['a','b','c'], [-4], [], '-4'); - }); - - method('from', function() { - test(['a','b','c'], ['a','b','c'], 'no argument'); - test(['a','b','c'], [1], ['b','c'], ''); - test(['a','b','c'], [2], ['c'], '2'); - test(['a','b','c'], [3], [], '3'); - test(['a','b','c'], [4], [], '4'); - test(['a','b','c'], [-1], ['c'], '-1'); - test(['a','b','c'], [-2], ['b','c'], '-2'); - test(['a','b','c'], [-3], ['a','b','c'], '-3'); - test(['a','b','c'], [-4], ['a','b','c'], '-4'); - }); - - - method('to', function() { - test(['a','b','c'], ['a','b','c'], 'no argument'); - test(['a','b','c'], [0], [], 'no argument'); - test(['a','b','c'], [1], ['a'], '1'); - test(['a','b','c'], [2], ['a','b'], '2'); - test(['a','b','c'], [3], ['a','b','c'], '3'); - test(['a','b','c'], [4], ['a','b','c'], '4'); - test(['a','b','c'], [-1], ['a','b'], '-1'); - test(['a','b','c'], [-2], ['a'], '-2'); - test(['a','b','c'], [-3], [], '-3'); - test(['a','b','c'], [-4], [], '-4'); - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index b84bc847a..4bc15a0ff 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2835,4 +2835,100 @@ namespace('Array', function() { }); + describeInstance('first', function(first) { + + it('should get the first element with no argument', () => { + assertEqual(first(['a','b','c']), 'a'); + }); + + it('should get the first n elements by argument', () => { + assertArrayEqual(first(['a','b','c'], 1), ['a']); + assertArrayEqual(first(['a','b','c'], 2), ['a','b']); + assertArrayEqual(first(['a','b','c'], 3), ['a','b','c']); + assertArrayEqual(first(['a','b','c'], 4), ['a','b','c']); + }); + + it('should handle irregular input', function() { + assertError(() => { first([], null); }); + assertError(() => { first([], -1); }); + assertError(() => { first([], 0); }); + assertError(() => { first(null); }); + assertError(() => { first('8'); }); + assertError(() => { first(8); }); + }); + + }); + + describeInstance('last', function(last) { + + it('should get the last element with no argument', () => { + assertEqual(last(['a','b','c']), 'c'); + }); + + it('should get the last n elements by argument', () => { + assertArrayEqual(last(['a','b','c'], 1), ['c']); + assertArrayEqual(last(['a','b','c'], 2), ['b','c']); + assertArrayEqual(last(['a','b','c'], 3), ['a','b','c']); + assertArrayEqual(last(['a','b','c'], 4), ['a','b','c']); + }); + + it('should handle irregular input', function() { + assertError(() => { last([], null); }); + assertError(() => { last([], -1); }); + assertError(() => { last([], 0); }); + assertError(() => { last(null); }); + assertError(() => { last('8'); }); + assertError(() => { last(8); }); + }); + + }); + + describeInstance('from', function(from) { + + it('should get elements from an index', () => { + assertArrayEqual(from(['a','b','c'], 0), ['a','b','c']); + assertArrayEqual(from(['a','b','c'], 1), ['b','c']); + assertArrayEqual(from(['a','b','c'], 2), ['c']); + assertArrayEqual(from(['a','b','c'], 3), []); + assertArrayEqual(from(['a','b','c'], 4), []); + assertArrayEqual(from(['a','b','c'], -1), ['c']); + assertArrayEqual(from(['a','b','c'], -2), ['b','c']); + assertArrayEqual(from(['a','b','c'], -3), ['a','b','c']); + assertArrayEqual(from(['a','b','c'], -4), ['a','b','c']); + }); + + it('should handle irregular input', function() { + assertError(() => { from([]); }); + assertError(() => { from([], null); }); + assertError(() => { from(null); }); + assertError(() => { from('8'); }); + assertError(() => { from(8); }); + }); + + }); + + describeInstance('to', function(to) { + + it('should get elements to an index', () => { + assertArrayEqual(to(['a','b','c'], 0), []); + assertArrayEqual(to(['a','b','c'], 1), ['a']); + assertArrayEqual(to(['a','b','c'], 2), ['a','b']); + assertArrayEqual(to(['a','b','c'], 3), ['a','b','c']); + assertArrayEqual(to(['a','b','c'], 4), ['a','b','c']); + assertArrayEqual(to(['a','b','c'], -1), ['a','b']); + assertArrayEqual(to(['a','b','c'], -2), ['a']); + assertArrayEqual(to(['a','b','c'], -3), []); + assertArrayEqual(to(['a','b','c'], -4), []); + }); + + it('should handle irregular input', function() { + assertError(() => { to([]); }); + assertError(() => { to([], null); }); + assertError(() => { to(null); }); + assertError(() => { to('8'); }); + assertError(() => { to(8); }); + }); + + }); + }); From 870d5194d3cc61ffbcff0014ac3c825b6e9dabe2 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 5 Sep 2020 14:00:53 +0900 Subject: [PATCH 100/191] Removed Array#flatten --- CHANGELOG.md | 1 + test/OLD/tests/array.js | 27 --------------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 690ccd546..30444dc5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,7 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `Array#append` second argument to add element at a specific index. Use `Array#insert` for this instead. - Removed `all` flag from `Array#compact`. Use `Array#filter` here instead. +- Removed `Array#flatten`. Use native `Array#flat` instead. TODO: diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 2d21dc9d7..24634b074 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -115,31 +115,4 @@ namespace('Array', function () { equal(arr, [1,3], 'should affect the original array'); }); - method('flatten', function() { - - test([1,2,3], [1,2,3], '1,2,3'); - test(['a','b','c'], ['a','b','c'], 'a,b,c'); - test([{a:1},{a:2},{a:1}], [{a:1},{a:2},{a:1}], 'a:1,a:2,a:1'); - test([[1],[2],[3]], [1,2,3], '[1],[2],[3]'); - test([[1,2],[3]], [1,2,3], '[1,2],[3]'); - test([[1,2,3]], [1,2,3], '[1,2,3]'); - test([['a'],['b'],['c']], ['a','b','c'], '[a],[b],[c]'); - test([['a','b'],['c']], ['a','b','c'], '[a,b],[c]'); - test([['a','b','c']], ['a','b','c'], '[a,b,c]'); - test([[{a:1}],[{a:2}],[{a:1}]], [{a:1},{a:2},{a:1}], '[a:1],[a:2],[a:1]'); - test([[{a:1},{a:2}],[{a:1}]], [{a:1},{a:2},{a:1}], '[a:1,a:2],[a:1]'); - test([[{a:1},{a:2},{a:1}]], [{a:1},{a:2},{a:1}], '[a:1,a:2,a:1]'); - test([[[['a','b'],'c',['d','e']],'f'],['g']], ['a','b','c','d','e','f','g'], '[[a,b],c,[d,e],f],g'); - - test([[[['a','b'],'c',['d','e']],'f'],['g']], [1], [[['a','b'],'c',['d','e']],'f','g'], 'can flatten only first level'); - test([[[['a','b'],'c',['d','e']],'f'],['g']], [false], ['a','b','c','d','e','f','g'], 'wont explode on false'); - test([[[['a','b'],'c',['d','e']],'f'],['g']], [true], [[['a','b'],'c',['d','e']],'f','g'], 'wont explode on true'); - - equal(run(oneUndefined, 'flatten').length, 1, 'should not compact arrays'); - - var arr = testGetSparseArray(2, 'a', testGetSparseArray(2, 'b'), 'c'); - test(arr, [], ['a','b','c'], 'works on sparse arrays'); - - }); - }); From e84e34fec30093feea159ba172ee350dcd376b51 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 5 Sep 2020 14:23:59 +0900 Subject: [PATCH 101/191] Added Array#removeAt --- src/array/define.js | 1 + src/array/methods.js | 1 + src/array/removeAt.js | 34 +++++++++++++++++++++++++++++++ test/OLD/tests/array.js | 26 ------------------------ test/tests/array.js | 45 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 src/array/removeAt.js diff --git a/src/array/define.js b/src/array/define.js index e4f7d9402..3a27b05e9 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -29,6 +29,7 @@ defineInstance('minAll', methods.minAll); defineInstance('median', methods.median); defineInstance('none', methods.none); defineInstance('remove', methods.remove); +defineInstance('removeAt', methods.removeAt); defineInstance('sample', methods.sample); defineInstance('shuffle', methods.shuffle); defineInstance('some', methods.some); diff --git a/src/array/methods.js b/src/array/methods.js index 3629feb4a..5e0947942 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -26,6 +26,7 @@ export { default as minAll } from './minAll'; export { default as median } from './median'; export { default as none } from './none'; export { default as remove } from './remove'; +export { default as removeAt } from './removeAt'; export { default as sample } from './sample'; export { default as shuffle } from './shuffle'; export { default as some } from './some'; diff --git a/src/array/removeAt.js b/src/array/removeAt.js new file mode 100644 index 000000000..e1134ff6e --- /dev/null +++ b/src/array/removeAt.js @@ -0,0 +1,34 @@ +import { assertArray, assertInteger } from '../util/assertions'; + +/** + * Removes element(s) from the array by index. + * + * @extra This method will modify the array! + * + * @param {Array} arr - The array. + * @param {number} start - The index of the array to start at. May be negative. + * Must be an integer. + * @param {number} [end] - The index of the array to end at. If not passed, + * will remove a single element. May be negative. Must be an integer. + * + * @returns {Array} + * + * @example + * + * [1,2,3].removeAt(0) -> [2, 3] + * [1,2,3,4].removeAt(1, 2) -> [1, 4] + * + **/ +export default function removeAt(arr, start, end) { + assertArray(arr); + if (arguments.length === 2) { + end = start; + } + assertInteger(start); + assertInteger(end); + arr.splice(start, end - start + 1); + if (start < 0 && end >= 0) { + arr.splice(0, end); + } + return arr; +} diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 24634b074..3eaad6f7a 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -89,30 +89,4 @@ namespace('Array', function () { test([user1], [[user1, user2]], false, 'array of objects 1:2'); }); - method('removeAt', function() { - test([1,2,2,3], [1,2,2,3], 'numeric | no argument'); - test([1,2,2,3], [0], [2,2,3], 'numeric | 0'); - test([1,2,2,3], [1], [1,2,3], 'numeric | 1'); - test([1,2,2,3], [2], [1,2,3], 'numeric | 2'); - test([1,2,2,3], [3], [1,2,2], 'numeric | 3'); - test([1,2,2,3], [4], [1,2,2,3], 'numeric | 4'); - test(['a','b','c','c'], ['a','b','c','c'], 'alphabet | no argument'); - test(['a','b','c','c'], [0], ['b','c','c'], 'alphabet | 0'); - test(['a','b','c','c'], [1], ['a','c','c'], 'alphabet | 1'); - test(['a','b','c','c'], [2], ['a','b','c'], 'alphabet | 2'); - test(['a','b','c','c'], [3], ['a','b','c'], 'alphabet | 3'); - test(['a','b','c','c'], [4], ['a','b','c','c'], 'alphabet | 4'); - test([{a:1},{a:2},{a:1}], [1], [{a:1},{a:1}], 'objects | 1'); - test([1,2,2,3], [0,1], [2,3], '0 to 1'); - test([1,2,2,3], [0,2], [3], '0 to 2'); - test([1,2,2,3], [1,2], [1,3], '1 to 2'); - test([1,2,2,3], [1,5], [1], '1 to 5'); - test([1,2,2,3], [0,5], [], '0 to 5'); - test([1,2,2,3], [null,5], [], 'also accepts null'); - - var arr = [1,2,3]; - run(arr, 'removeAt', [1]); - equal(arr, [1,3], 'should affect the original array'); - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index 4bc15a0ff..0f497b894 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2931,4 +2931,49 @@ namespace('Array', function() { }); + describeInstance('removeAt', function(removeAt) { + + it('should remove a single element', () => { + assertArrayEqual(removeAt([1,2,2,3], 0), [2,2,3]); + assertArrayEqual(removeAt([1,2,2,3], 1), [1,2,3]); + assertArrayEqual(removeAt([1,2,2,3], 2), [1,2,3]); + assertArrayEqual(removeAt([1,2,2,3], 3), [1,2,2]); + assertArrayEqual(removeAt([1,2,2,3], 4), [1,2,2,3]); + }); + + it('should remove multiple elements', () => { + assertArrayEqual(removeAt([1,2,2,3], 0, 1), [2,3]); + assertArrayEqual(removeAt([1,2,2,3], 0, 2), [3]); + assertArrayEqual(removeAt([1,2,2,3], 1, 2), [1,3]); + assertArrayEqual(removeAt([1,2,2,3], 1, 5), [1]); + assertArrayEqual(removeAt([1,2,2,3], 0, 5), []); + }); + + it('should accept negative indexes', () => { + assertArrayEqual(removeAt([1,2,2,3], -1), [1,2,2]); + assertArrayEqual(removeAt([1,2,2,3], -2), [1,2,3]); + assertArrayEqual(removeAt([1,2,2,3], -3, -2), [1,3]); + assertArrayEqual(removeAt([1,2,2,3], -2, 0), [1,2]); + assertArrayEqual(removeAt([1,2,2,3], -1, 1), [2,2]); + assertArrayEqual(removeAt([1,2,2,3], -2, 2), []); + assertArrayEqual(removeAt([1,2,3,4,5,6], -2, 2), [3,4]); + }); + + it('should modify the array', () => { + const arr = [1]; + removeAt(arr, 0); + assertEqual(arr.length, 0); + }); + + it('should handle irregular input', function() { + assertError(() => { removeAt([]); }); + assertError(() => { removeAt([], null); }); + assertError(() => { removeAt([], 0, null); }); + assertError(() => { removeAt(null); }); + assertError(() => { removeAt('8'); }); + assertError(() => { removeAt(8); }); + }); + + }); + }); From e267806bdf0eda3f1034100f7ec4487df7c6170d Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 7 Sep 2020 19:51:59 +0900 Subject: [PATCH 102/191] Added Object#isEqual and Array#isEqual. --- src/array/define.js | 1 + src/array/isEqual.js | 26 +++ src/array/methods.js | 1 + src/object/define.js | 1 + src/object/isEqual.js | 28 +++ src/object/methods.js | 1 + src/util/equality.js | 65 +++++++ src/util/helpers.js | 4 +- src/util/object.js | 130 +++++++------ test/.eslintrc | 2 +- test/OLD/tests/array.js | 30 --- test/OLD/tests/core.js | 3 - test/OLD/tests/dom.js | 84 --------- test/OLD/tests/equals.js | 391 --------------------------------------- test/OLD/tests/object.js | 31 ---- test/tests/array.js | 31 ++++ test/tests/object.js | 348 +++++++++++++++++++++++++++++++++- 17 files changed, 576 insertions(+), 601 deletions(-) create mode 100644 src/array/isEqual.js create mode 100644 src/object/isEqual.js create mode 100644 src/util/equality.js delete mode 100644 test/OLD/tests/core.js delete mode 100644 test/OLD/tests/dom.js delete mode 100644 test/OLD/tests/equals.js diff --git a/src/array/define.js b/src/array/define.js index 3a27b05e9..9180f0263 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -20,6 +20,7 @@ defineInstance('inGroupsOf', methods.inGroupsOf); defineInstance('insert', methods.insert); defineInstance('intersect', methods.intersect); defineInstance('isEmpty', methods.isEmpty); +defineInstance('isEqual', methods.isEqual); defineInstance('last', methods.last); defineInstance('map', methods.map); defineInstance('max', methods.max); diff --git a/src/array/isEqual.js b/src/array/isEqual.js new file mode 100644 index 000000000..25c30134f --- /dev/null +++ b/src/array/isEqual.js @@ -0,0 +1,26 @@ +import { isEqual as _isEqual } from '../util/equality'; + +/** + * Returns true if both arrays are deeply equal. + * + * @extra This function is an alias for `Object.isEqual`. Nested objects that + * cannot be observably distinguished from one another will be considered equal. + * Note that functions, class instances, browser host objects, and symbols are + * equal only by reference. Object members are deeply checked based on their + * non-inherited, enumerable properties. + * + * @param {Object} [arr1] - The first array to compare. `undefined` if not passed. + * @param {Object} [arr2] - The second array to compare. `undefined` if not passed. + * + * @returns {boolean} + * + * @example + * + * [1].isEqual([1]) -> true + * [1].isEqual([2]) -> false + * [1].isEqual([1,2]) -> false + * + **/ +export default function isEqual(arr1, arr2) { + return _isEqual(arr1, arr2); +} diff --git a/src/array/methods.js b/src/array/methods.js index 5e0947942..5c9d35d3f 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -17,6 +17,7 @@ export { default as inGroupsOf } from './inGroupsOf'; export { default as insert } from './insert'; export { default as intersect } from './intersect'; export { default as isEmpty } from './isEmpty'; +export { default as isEqual } from './isEqual'; export { default as last } from './last'; export { default as map } from './map'; export { default as max } from './max'; diff --git a/src/object/define.js b/src/object/define.js index 5856bf2c9..9cbf61ec8 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -7,6 +7,7 @@ defineInstance('every', methods.every); defineInstance('findKey', methods.findKey); defineInstance('forEach', methods.forEach); defineInstance('isEmpty', methods.isEmpty); +defineInstance('isEqual', methods.isEqual); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); defineInstance('median', methods.median); diff --git a/src/object/isEqual.js b/src/object/isEqual.js new file mode 100644 index 000000000..4461718df --- /dev/null +++ b/src/object/isEqual.js @@ -0,0 +1,28 @@ +import { isEqual as _isEqual } from '../util/equality'; + +/** + * Returns true if both objects are deeply equal. + * + * @extra Objects that cannot be observably distinguished from one another will + * be considered equal. Note that functions, class instances, browser host + * objects, and symbols are equal only by reference. Object members are deeply + * checked based on their non-inherited, enumerable properties. + * + * @param {Object} [obj1] - The first object to compare. `undefined` if not passed. + * @param {Object} [obj2] - The second object to compare. `undefined` if not passed. + * + * @returns {boolean} + * + * @example + * + * Object.isEqual(1, 1) -> true + * Object.isEqual(1, 2) -> false + * Object.isEqual([1], [1]) -> true + * Object.isEqual([1], [2]) -> false + * Object.isEqual({a:1}, {a:1}) -> true + * Object.isEqual({a:1}, {a:2}) -> false + * + **/ +export default function isEqual(obj1, obj2) { + return _isEqual(obj1, obj2); +} diff --git a/src/object/methods.js b/src/object/methods.js index e7550c3fe..eabfc1a80 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -4,6 +4,7 @@ export { default as every } from './every'; export { default as findKey } from './findKey'; export { default as forEach } from './forEach'; export { default as isEmpty } from './isEmpty'; +export { default as isEqual } from './isEqual'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; export { default as median } from './median'; diff --git a/src/util/equality.js b/src/util/equality.js new file mode 100644 index 000000000..033f1c354 --- /dev/null +++ b/src/util/equality.js @@ -0,0 +1,65 @@ +import { isObject, isSet, isMap } from './typeChecks'; +import { isSerializable, iterateWithCyclicCheck } from './object'; +import { classToString } from './class'; + +export function isEqual(a, b, stack = []) { + + if (a === b) { + // Return quickly up front when matched by reference, + // but be careful about 0 !== -0. + return a !== 0 || 1 / a === 1 / b; + } + + if (isObject(a) && isObject(b)) { + const aTag = classToString(a); + const bTag = classToString(b); + + if (aTag !== bTag) { + return false; + } + + if (isSerializable(a, aTag) && isSerializable(b, bTag)) { + return objectIsEqual(a, b, stack); + } + } + + // Handle NaN + if (a !== a && b !== b) { + return true; + } + + return false; +} + +function objectIsEqual(a, b, stack) { + + if (isSet(a)) { + return isSet(b) && objectIsEqual(Array.from(a), Array.from(b), stack); + } else if (isMap(a)) { + return isMap(b) && objectIsEqual(Array.from(a), Array.from(b), stack); + } else if (isObject(a.valueOf())) { + + if (a.length !== b.length) { + // perf: Quickly returning up front for arrays. + return false; + } + + let count = 0; + let propsEqual = true; + + iterateWithCyclicCheck(a, false, stack, (key, val, cyc, stack) => { + if (!cyc && (!(key in b) || !isEqual(val, b[key], stack))) { + propsEqual = false; + } + count++; + return propsEqual; + }); + + if (!propsEqual || count !== Object.keys(b).length) { + return false; + } + } + + // Stringifying the value handles NaN, wrapped primitives, dates, and errors in one go. + return a.valueOf().toString() === b.valueOf().toString(); +} diff --git a/src/util/helpers.js b/src/util/helpers.js index df2020449..28766d33a 100644 --- a/src/util/helpers.js +++ b/src/util/helpers.js @@ -8,7 +8,9 @@ export function hasOwnProperty(obj, prop) { export function forEachProperty(obj, fn) { for (let key in obj) { if (!hasOwnProperty(obj, key)) continue; - if (fn.call(obj, key, obj[key], obj) === false) break; + if (fn.call(obj, key, obj[key], obj) === false) { + break; + } } } diff --git a/src/util/object.js b/src/util/object.js index 15399d9c9..bdc121980 100644 --- a/src/util/object.js +++ b/src/util/object.js @@ -1,14 +1,23 @@ -import { isPrimitive, isObject, isNaN } from './typeChecks'; +import { + isPrimitive, + isObject, + isSet, + isMap, + isError, + isNaN, +} from './typeChecks'; import { hasOwnProperty, forEachProperty } from './helpers'; import { isClass, classToString } from './class'; const objectProto = Object.prototype; export function isPlainObject(obj, classTag) { - return isObject(obj) - && isClass(obj, 'Object', classTag) - && hasValidPlainObjectPrototype(obj) - && hasOwnEnumeratedProperties(obj); + return ( + isObject(obj) && + isClass(obj, 'Object', classTag) && + hasValidPlainObjectPrototype(obj) && + hasOwnEnumeratedProperties(obj) + ); } // A function that will serialize objects holding an array of refs @@ -20,50 +29,7 @@ export function getSerializer() { }; } -// Serializes an object in a way that will provide a token unique -// to the type, class, and value of an object. Host objects, class -// instances etc are not serializable, and are held in an array -// of references that will return the index as a unique identifier -// for the object. This array is passed from outside so that the -// calling function can decide how to dispose of this array. -export function serialize(obj, refs = [], stack = []) { - const type = typeof obj; - - // Check for -0 - const sign = 1 / obj === -Infinity ? '-' : ''; - - // Return quickly for primitives to save cycles - if (isPrimitive(obj, type) && !isNaN(obj)) { - return type + sign + obj; - } - - const className = classToString(obj); - - let value = ''; - if (!isSerializable(obj, className)) { - let index = refs.indexOf(obj); - if (index === -1) { - index = refs.length; - refs.push(obj); - } - return index; - } else if (isObject(obj)) { - value = serializeDeep(obj, refs, stack) + obj.toString(); - } else if (obj.valueOf) { - value = obj.valueOf(); - } - return type + className + sign + value; -} - -function serializeDeep(obj, refs, stack) { - let result = ''; - iterateWithCyclicCheck(obj, true, stack, (key, val, cyc, stack) => { - result += cyc ? 'CYC' : key + serialize(val, refs, stack); - }); - return result; -} - -function isSerializable(obj, classTag) { +export function isSerializable(obj, classTag) { // Only known objects can be serialized. This notably excludes functions, // host objects, Symbols (which are matched by reference), and instances // of classes. The latter can arguably be matched by value, but @@ -75,9 +41,8 @@ function isSerializable(obj, classTag) { // This method for checking for cyclic structures was egregiously stolen from // the ingenious method by @kitcambridge from the Underscore script: // https://github.com/documentcloud/underscore/issues/240 -function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { - - function next(val, key) { +export function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { + function next(key, val) { let cyc = false; // Allowing a step into the structure before triggering this check to save @@ -93,8 +58,9 @@ function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { } stack.push(val); - fn(key, val, cyc, stack); + const ret = fn(key, val, cyc, stack); stack.pop(); + return ret; } function iterateWithSortedKeys() { @@ -102,7 +68,9 @@ function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { // does not matter but stringified order does. const keys = Object.keys(obj).sort(); for (let key of keys) { - next(obj[key], key); + if (next(key, obj[key]) === false) { + break; + } } } @@ -113,6 +81,51 @@ function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { } } +// Serializes an object in a way that will provide a token unique +// to the type, class, and value of an object. Host objects, class +// instances etc are not serializable, and are held in an array +// of references that will return the index as a unique identifier +// for the object. This array is passed from outside so that the +// calling function can decide how to dispose of this array. +function serialize(obj, refs = [], stack = []) { + const type = typeof obj; + + // Check for -0 + const sign = 1 / obj === -Infinity ? '-' : ''; + + // Return quickly for primitives to save cycles + if (isPrimitive(obj, type) && !isNaN(obj)) { + return type + sign + obj; + } + + const className = classToString(obj); + + let value = ''; + if (!isSerializable(obj, className)) { + let index = refs.indexOf(obj); + if (index === -1) { + index = refs.length; + refs.push(obj); + } + return index; + } else if (isSet(obj) || isMap(obj)) { + value = serialize(Array.from(obj), refs, stack); + } else if (!isError(obj) && isObject(obj)) { + value = serializeDeep(obj, refs, stack) + obj.toString(); + } else if (obj.valueOf) { + value = obj.valueOf(); + } + return type + className + sign + value; +} + +function serializeDeep(obj, refs, stack) { + let result = ''; + iterateWithCyclicCheck(obj, true, stack, (key, val, cyc, stack) => { + result += cyc ? 'CYC' : key + serialize(val, refs, stack); + }); + return result; +} + // Add core types as known so that they can be checked by value below, // notably excluding Functions and adding Arguments and Error. const KNOWN_CLASS_TAGS = [ @@ -155,9 +168,12 @@ function hasValidPlainObjectPrototype(obj) { // robust way of ensuring this if the global has been hijacked). Note that // accessing the constructor directly (without "in" or "hasOwnProperty") // will throw a permissions error in IE8 on cross-domain windows. - return (!hasConstructor && !hasToString) - || (hasConstructor && !hasOwnProperty(obj, 'constructor') - && hasOwnProperty(obj.constructor.prototype, 'isPrototypeOf')); + return ( + (!hasConstructor && !hasToString) || + (hasConstructor && + !hasOwnProperty(obj, 'constructor') && + hasOwnProperty(obj.constructor.prototype, 'isPrototypeOf')) + ); } function hasOwnEnumeratedProperties(obj) { diff --git a/test/.eslintrc b/test/.eslintrc index 57a36e015..52ddcf864 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,6 +1,6 @@ { "env": { - "es6": false, + "es6": true, "node": true, "browser": true, }, diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index 3eaad6f7a..fa10b2f72 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -59,34 +59,4 @@ namespace('Array', function () { }); - method('isEqual', function() { - - test(['a'], [['a']], true, 'basic 1 element array'); - test(['a'], [['b']], false, 'basic 1 element array | inequal'); - test(['a','b','c'], [['a','b','c']], true, '3 element array'); - test(['a','b','c'], [['a','b','d']], false, '3 element array | inequal'); - - test(['a','b'], [{0:'a',1:'b',length:2}], false, 'object with length is not egal with array'); - - test([0], [[0]], true, 'arrays of numbers are equal'); - test([undefined], [[undefined]], true, 'arrays of undefined are equal'); - test([null], [[null]], true, 'arrays of null are equal'); - test([NaN], [[NaN]], true, 'arrays of NaN are equal'); - test(testGetSparseArray(4, 'a'), [testGetSparseArray(4, 'a')], true, 'sparse arrays are equal'); - - test([], [[]], true, 'empty arrays are equal'); - test([], [{}], false, 'empty array is not equal to empty object'); - - var args = (function(){ return arguments; })('a','b','c'); - test(['a','b','c'], [args], false, 'array is not egal with arguments object'); - - var user1 = { name: 'Larry' }; - var user2 = { name: 'David' }; - - test([user1, user2], [[user1, user2]], true, 'array of objects is equal'); - test([user1, user2], [[user2, user1]], false, 'array of objects is not equal if not in the same order'); - test([user1, user2], [[user1]], false, 'array of objects 2:1'); - test([user1], [[user1, user2]], false, 'array of objects 1:2'); - }); - }); diff --git a/test/OLD/tests/core.js b/test/OLD/tests/core.js deleted file mode 100644 index c0d79d3cc..000000000 --- a/test/OLD/tests/core.js +++ /dev/null @@ -1,3 +0,0 @@ -namespace('Core', function() { - 'use strict'; -}); diff --git a/test/OLD/tests/dom.js b/test/OLD/tests/dom.js deleted file mode 100644 index 3fda5ff56..000000000 --- a/test/OLD/tests/dom.js +++ /dev/null @@ -1,84 +0,0 @@ -namespace('Array', function () { - 'use strict'; - - var tags = 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,big,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,datalist,dd,del,details,dfn,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,img,input,ins,kbd,label,legend,li,link,map,mark,menu,meta,meter,nav,noframes,noscript,object,ol,optgroup,option,output,p,param,pre,progress,q,rp,rt,ruby,s,samp,script,section,select,small,source,span,strike,strong,style,sub,summary,sup,table,tbody,td,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr'.split(','); - - for (var i = 0; i < tags.length; i++) { - - var tag = tags[i]; - - var el1 = document.createElement(tag); - var el2 = document.createElement(tag); - - method('unique', function() { - test([el1], [el1], 'DOM Elements | 1 element identical by reference'); - test([[el1]], [[el1]], 'DOM Elements | deep nested'); - test([el1,el1], [el1], 'DOM Elements | 2 elements identical by reference'); - test([el1,el1,el1], [el1], 'DOM Elements | 3 elements identical by reference'); - test([el1,el2], [el1,el2], 'DOM Elements | 2 elements different by reference'); - }); - - - method('subtract', function() { - test([el1], [[el1]], [], 'DOM Elements | [a] - [a]'); - test([el1], [[el2]], [el1], 'DOM Elements | [a] - [b]'); - test([el1,el2], [[el2]], [el1], 'DOM Elements | [a,b] - [b]'); - test([el1,el2], [[el1,el2]], [], 'DOM Elements | [a,b] - [a,b]'); - }); - - method('intersect', function() { - test([el1], [[el2]], [], 'DOM Elements | [a] & [b]'); - test([el1], [[el1]], [el1], 'DOM Elements | [a] & [a]'); - test([el1,el2], [[el2]], [el2], 'DOM Elements | [a,b] & [b]'); - test([el1,el2], [[el1,el2]], [el1,el2], 'DOM Elements | [a,b] & [b]'); - }); - - method('every', function() { - test([el1,el2], [el1], false, 'DOM Elements | a in [a,b]'); - test([el1,el2], [el2], false, 'DOM Elements | b in [a,b]'); - test([el1], [el1], true, 'DOM Elements | a in [a]'); - test([el1], [el2], false, 'DOM Elements | b in [a]'); - }); - - } - -}); - -namespace('Object', function() { - - method('isObject', function() { - if(!Sugar.Object.isObject) return; - test(Object, [document], false, 'document does not respond to isObject'); - }); - - method('clone', function() { - if(!Sugar.Object.clone) return; - - // Issue #307 Object.clone should error when cloning unknown types. - raisesError(function(){ run(Object, 'clone', [document.body]); }, 'raises an error if trying to clone a DOM element'); - raisesError(function(){ run(Object, 'clone', [new MouseEvent('click')]); }, 'raises an error if trying to a browser event'); - - }); - - method('isFunction', function() { - if(!Sugar.Object.isFunction) return; - test(Object, [document.createElement('embed')], false, 'not true for embed objects'); - }); - - // Confirmed that these tests pass, but avoid subjecting the user - // to external frames constantly popping up on each test run. - xgroup('Cross Domain Access', function() { - - var iframe = document.createElement('iframe'); - iframe.style.display = 'none'; - iframe.src = 'http://www.foo.com/'; - document.body.appendChild(iframe); - equal(run(Object, 'isObject', [iframe.contentWindow]), false, 'Cross Domain iframe should not be a plain object'); - - var win = window.open('http://foo.com/', '', 'top=0,left=0,width=0,height=0'); - equal(run(Object, 'isObject', [win]), false, 'Cross Domain Popup window should not be a plain object'); - win && win.close(); - - }); - -}); diff --git a/test/OLD/tests/equals.js b/test/OLD/tests/equals.js deleted file mode 100644 index dbe0e3cff..000000000 --- a/test/OLD/tests/equals.js +++ /dev/null @@ -1,391 +0,0 @@ -namespace('Object | Equality', function() { - 'use strict'; - - // These tests also shamelessly stolen from the Underscore.js test suite. - // Careful checks for cyclical references, equality between primitives and - // wrappers, and more. Sugar's callObjectEqual should now be considered "egal". - - function callObjectEqual(a, b) { - if (!isDefaultMode() && !canTestPrimitiveScope) { - // If the environment doesn't allow null scope, then there's no way - // to predict how the scope will be mangled by running "a" through it, - // so run isEqual as a static method instead. This is simulating a real - // world situation as well as there is no way to map isEqual to Object - // prototype and have it work for string primitives when strict mode is - // not available, so the user will in that case have to go through the - // static method as well. Similarly, chainables would have to go through - // a significant tapdance to get working right with null scope issues, - // and the performance penalties and indescrepancy with extended mode - // is not worth the benefits. - return run(Object, 'isEqual', [a, b]); - } - return run(a, 'isEqual', [b]); - } - - function createSet(str) { - var s = new Set(); - if (str) { - s.add(str); - } - return s; - } - - function createMap(arr) { - var m = new Map(); - if (arr) { - m.set(arr[0], arr[1]); - } - return m; - } - - function createTypedArray(ArrayClass, src) { - var arr = new ArrayClass(src.length); - for (var i = 0; i < src.length; i++) { - arr[i] = src[i]; - } - return arr; - } - - function assertTypedArrayEquality(ArrayClass) { - - function callTypedArrayEqual(ArrayClass, s1, s2, expected) { - var arr1 = createTypedArray(ArrayClass, s1); - var arr2 = createTypedArray(ArrayClass, s2); - equal(callObjectEqual(arr1, arr2), expected, ArrayClass.name + ' | ' + expected); - } - - callTypedArrayEqual(ArrayClass, [], [], true); - callTypedArrayEqual(ArrayClass, [256], [], false); - callTypedArrayEqual(ArrayClass, [], [256], false); - callTypedArrayEqual(ArrayClass, [256], [256], true); - - } - - function First() { - this.value = 1; - } - First.prototype.value = 1; - - function Second() { - this.value = 1; - } - Second.prototype.value = 2; - - - group('Basic equality and identity comparisons', function() { - equal(callObjectEqual(0, 0), true, "0 is equal to 0"); - equal(callObjectEqual(-0, -0), true, "-0 is equal to -0"); - equal(callObjectEqual(0, -0), false, "0 is not equal to -0"); - equal(callObjectEqual(-0, 0), false, "Commutative equality is implemented for 0 and -0"); - - equal(callObjectEqual(), true, "undefined is equal to undefined"); - equal(callObjectEqual(null, null), true, "null is equal to null"); - equal(callObjectEqual(null, undefined), false, "null is not equal to undefined"); - equal(callObjectEqual(undefined, null), false, "Commutative equality is implemented for null and undefined"); - }); - - group('String object and primitive comparisons', function() { - equal(callObjectEqual("Curly", "Curly"), true, "Identical string primitives are equal"); - equal(callObjectEqual(new String("Curly"), new String("Curly")), true, "String objects with identical primitive values are equal"); - - equal(callObjectEqual("Curly", "Larry"), false, "String primitives with different values are not equal"); - equal(callObjectEqual(new String("Curly"), "Curly"), false, "String primitives and their corresponding object wrappers are not equal"); - equal(callObjectEqual("Curly", new String("Curly")), false, "Commutative equality is implemented for string objects and primitives"); - equal(callObjectEqual(new String("Curly"), new String("Larry")), false, "String objects with different primitive values are not equal"); - equal(callObjectEqual(new String("Curly"), {toString: function(){ return "Curly"; }}), false, "String objects and objects with a custom toString method are not equal"); - }); - - group('Number object and primitive comparisons', function() { - equal(callObjectEqual(75, 75), true, "Identical number primitives are equal"); - equal(callObjectEqual(new Number(75), new Number(75)), true, "Number objects with identical primitive values are equal"); - - equal(callObjectEqual(75, new Number(75)), false, "Number primitives and their corresponding object wrappers are not equal"); - equal(callObjectEqual(new Number(75), 75), false, "Commutative equality is implemented for number objects and primitives"); - equal(callObjectEqual(new Number(75), new Number(63)), false, "Number objects with different primitive values are not equal"); - equal(callObjectEqual(new Number(63), {valueOf: function(){ return 63; }}), false, "Number objects and objects with a valueOf method are not equal"); - }); - - group('Comparisons involving NaN', function() { - equal(callObjectEqual(NaN, NaN), true, "NaN is equal to NaN"); - equal(callObjectEqual(61, NaN), false, "A number primitive is not equal to NaN"); - equal(callObjectEqual(new Number(79), NaN), false, "A number object is not equal to NaN"); - equal(callObjectEqual(Infinity, NaN), false, "Infinity is not equal to NaN"); - }); - - group('Boolean object and primitive comparisons', function() { - equal(callObjectEqual(true, true), true, "Identical boolean primitives are equal"); - equal(callObjectEqual(new Boolean, new Boolean), true, "Boolean objects with identical primitive values are equal"); - equal(callObjectEqual(true, new Boolean(true)), false, "Boolean primitives and their corresponding object wrappers are not equal"); - equal(callObjectEqual(new Boolean(true), true), false, "Commutative equality is implemented for booleans"); - equal(callObjectEqual(new Boolean(true), new Boolean), false, "Boolean objects with different primitive values are not equal"); - }); - - - group('Common type coercions', function() { - equal(callObjectEqual(true, new Boolean(false)), false, "Boolean objects are not equal to the boolean primitive true"); - equal(callObjectEqual("75", 75), false, "String and number primitives with like values are not equal"); - equal(callObjectEqual(new Number(63), new String(63)), false, "String and number objects with like values are not equal"); - equal(callObjectEqual(75, "75"), false, "Commutative equality is implemented for like string and number values"); - equal(callObjectEqual(0, ""), false, "Number and string primitives with like values are not equal"); - equal(callObjectEqual(1, true), false, "Number and boolean primitives with like values are not equal"); - equal(callObjectEqual(new Boolean(false), new Number(0)), false, "Boolean and number objects with like values are not equal"); - equal(callObjectEqual(false, new String("")), false, "Boolean primitives and string objects with like values are not equal"); - equal(callObjectEqual(1256428800000, new Date(Date.UTC(2009, 9, 25))), false, "Dates and their corresponding numeric primitive values are not equal"); - }); - - group('Dates', function() { - equal(callObjectEqual(new Date(2009, 9, 25), new Date(2009, 9, 25)), true, "Date objects referencing identical times are equal"); - equal(callObjectEqual(new Date(2009, 9, 25), new Date(2009, 9, 25, 0, 0, 0, 1)), false, "Date objects 1ms apart"); - equal(callObjectEqual(new Date(2009, 9, 25), new Date(2009, 11, 13)), false, "Date objects referencing different times are not equal"); - equal(callObjectEqual(new Date(2009, 11, 13), { - getTime: function(){ - return 12606876e5; - } - }), false, "Date objects and objects with a getTime method are not equal"); - equal(callObjectEqual(new Date("Curly"), new Date("Curly")), true, "Invalid dates are equal"); - }); - - group('Functions', function() { - equal(callObjectEqual(First, Second), false, "Different functions with identical bodies and source code representations are not equal"); - }); - - group('Regexes', function() { - equal(callObjectEqual(/(?:)/gim, /(?:)/gim), true, "RegExps with equivalent patterns and flags are equal"); - equal(callObjectEqual(/(?:)/g, /(?:)/gi), false, "RegExps with equivalent patterns and different flags are not equal"); - equal(callObjectEqual(/Moe/gim, /Curly/gim), false, "RegExps with different patterns and equivalent flags are not equal"); - equal(callObjectEqual(/(?:)/gi, /(?:)/g), false, "Commutative equality is implemented for RegExps"); - equal(callObjectEqual(/Curly/g, {source: "Larry", global: true, ignoreCase: false, multiline: false}), false, "RegExps and RegExp-like objects are not equal"); - }); - - group('Empty arrays, array-like objects, and object literals', function() { - equal(callObjectEqual({}, {}), true, "Empty object literals are equal"); - equal(callObjectEqual([], []), true, "Empty array literals are equal"); - equal(callObjectEqual([{}], [{}]), true, "Empty nested arrays and objects are equal"); - equal(callObjectEqual({length: 0}, []), false, "Array-like objects and arrays are not equal."); - equal(callObjectEqual([], {length: 0}), false, "Commutative equality is implemented for array-like objects"); - - equal(callObjectEqual({}, []), false, "Object literals and array literals are not equal"); - equal(callObjectEqual([], {}), false, "Commutative equality is implemented for objects and arrays"); - equal(callObjectEqual((function(){ return arguments; })(), (function(){ return arguments; })()), true, "Empty arguments objects are equal"); - }); - - group('Arrays with primitive and object values', function() { - equal(callObjectEqual([1, true, "Larry", true], [1, true, "Larry", true]), true, "Arrays containing identical primitives are equal"); - equal(callObjectEqual([/Moe/g, new Date(2009, 9, 25)], [/Moe/g, new Date(2009, 9, 25)]), true, "Arrays containing equivalent elements are equal"); - }); - - group('Multi-dimensional arrays', function() { - var a = [new Number(47), false, true, "Larry", /Moe/, new Date(2009, 11, 13), ['running', 'biking', new String('programming')], {a: 47}]; - var b = [new Number(47), false, true, "Larry", /Moe/, new Date(2009, 11, 13), ['running', 'biking', new String('programming')], {a: 47}]; - equal(callObjectEqual(a, b), true, "Arrays containing nested arrays and objects are recursively compared"); - - // Overwrite the methods defined in ES 5.1 section 15.4.4. - a.forEach = a.map = a.filter = a.every = a.indexOf = a.lastIndexOf = a.some = a.reduce = a.reduceRight = null; - b.pop = b.reverse = b.shift = b.slice = b.splice = b.concat = b.sort = b.unshift = null; - - // Array elements and properties. - equal(callObjectEqual(a, b), false, "Arrays with different overwritten inherited properties are not equal"); - a.push("White Rocks"); - equal(callObjectEqual(a, b), false, "Arrays of different lengths are not equal"); - a.push("East Boulder"); - b.push("Gunbarrel Ranch", true, "Teller Farm"); - equal(callObjectEqual(a, b), false, "Arrays of identical lengths containing different elements are not equal"); - }); - - group('Sparse arrays', function() { - equal(callObjectEqual(Array(3), Array(3)), true, "Sparse arrays of identical lengths are equal"); - equal(callObjectEqual(Array(3), Array(6)), false, "Sparse arrays of different lengths are not equal when both are empty"); - equal(callObjectEqual(Array(3), safeArray(undefined, undefined, undefined)), false, "Sparse arrays are not treated as dense"); - }); - - group('Simple objects', function() { - equal(callObjectEqual({a: "Curly", b: 1, c: true}, {a: "Curly", b: 1, c: true}), true, "Objects containing identical primitives are equal"); - equal(callObjectEqual({a: /Curly/g, b: new Date(2009, 11, 13)}, {a: /Curly/g, b: new Date(2009, 11, 13)}), true, "Objects containing equivalent members are equal"); - equal(callObjectEqual({a: 63, b: 75}, {a: 61, b: 55}), false, "Objects of identical sizes with different values are not equal"); - equal(callObjectEqual({a: 63, b: 75}, {a: 61, c: 55}), false, "Objects of identical sizes with different property names are not equal"); - equal(callObjectEqual({a: 1, b: 2}, {a: 1}), false, "Objects of different sizes are not equal"); - equal(callObjectEqual({a: 1}, {a: 1, b: 2}), false, "Commutative equality is implemented for objects"); - equal(callObjectEqual({x: 1, y: undefined}, {x: 1, z: 2}), false, "Objects with identical keys and different values are not equivalent"); - - // A contains nested objects and arrays. - var a = { - name: new String("Moe Howard"), - age: new Number(77), - stooge: true, - hobbies: ["acting"], - film: { - name: "Sing a Song of Six Pants", - release: new Date(1947, 9, 30), - stars: [new String("Larry Fine"), true, "Shemp Howard"], - minutes: new Number(16), - seconds: 54 - } - }; - - // B contains equivalent nested objects and arrays. - var b = { - name: new String("Moe Howard"), - age: new Number(77), - stooge: true, - hobbies: ["acting"], - film: { - name: "Sing a Song of Six Pants", - release: new Date(1947, 9, 30), - stars: [new String("Larry Fine"), true, "Shemp Howard"], - minutes: new Number(16), - seconds: 54 - } - }; - equal(callObjectEqual(a, b), true, "Objects with nested equivalent members are recursively compared"); - }); - - group('Instances', function() { - equal(callObjectEqual(new First, new First), false, "Object instances are not equal"); - equal(callObjectEqual(new First, new Second), false, "Objects with different constructors and identical own properties are not equal"); - equal(callObjectEqual({value: 1}, new First), false, "Object instances and objects sharing equivalent properties are not identical"); - equal(callObjectEqual({value: 2}, new Second), false, "The prototype chain of objects should not be examined"); - }); - - group('Circular Arrays', function() { - var a, b; - (a = []).push(a); - (b = []).push(b); - equal(callObjectEqual(a, b), true, "Arrays containing circular references are equal"); - a.push(new String("Larry")); - b.push(new String("Larry")); - equal(callObjectEqual(a, b), true, "Arrays containing circular references and equivalent properties are equal"); - a.push("Shemp"); - b.push("Curly"); - equal(callObjectEqual(a, b), false, "Arrays containing circular references and different properties are not equal"); - }); - - group('Circular Objects', function() { - var a, b; - a = {abc: null}; - b = {abc: null}; - a.abc = a; - b.abc = b; - equal(callObjectEqual(a, b), true, "Objects containing circular references are equal"); - a.def = 75; - b.def = 75; - equal(callObjectEqual(a, b), true, "Objects containing circular references and equivalent properties are equal"); - a.def = new Number(75); - b.def = new Number(63); - equal(callObjectEqual(a, b), false, "Objects containing circular references and different properties are not equal"); - }); - - group('Cyclic Structures', function() { - var a, b; - a = [{abc: null}]; - b = [{abc: null}]; - (a[0].abc = a).push(a); - (b[0].abc = b).push(b); - equal(callObjectEqual(a, b), true, "Cyclic structures are equal"); - a[0].def = "Larry"; - b[0].def = "Larry"; - equal(callObjectEqual(a, b), true, "Cyclic structures containing equivalent properties are equal"); - a[0].def = new String("Larry"); - b[0].def = new String("Curly"); - equal(callObjectEqual(a, b), false, "Cyclic structures containing different properties are not equal"); - }); - - group('Complex Circular References', function() { - var a, b; - a = {foo: {b: {foo: {c: {foo: null}}}}}; - b = {foo: {b: {foo: {c: {foo: null}}}}}; - a.foo.b.foo.c.foo = a; - b.foo.b.foo.c.foo = b; - equal(callObjectEqual(a, b), true, "Cyclic structures with nested and identically-named properties are equal"); - }) - - group('Custom isEqual methods', function() { - var isEqualObj = {isEqual: function (o) { return o.isEqual == this.isEqual; }, unique: {}}; - var isEqualObjClone = {isEqual: isEqualObj.isEqual, unique: {}}; - - equal(callObjectEqual(isEqualObj, isEqualObjClone), true, 'Both objects implement identical isEqual methods'); - equal(callObjectEqual(isEqualObjClone, isEqualObj), true, 'Commutative equality is implemented for objects with custom isEqual methods'); - equal(callObjectEqual(isEqualObj, {}), false, 'Objects that do not implement equivalent isEqual methods are not equal'); - equal(callObjectEqual({}, isEqualObj), false, 'Commutative equality is implemented for objects with different isEqual methods'); - }); - - group('Errors', function() { - if (new TypeError('foo').toString() === '[object Error]') { - // Unfortunately these tests won't pass in < IE8 as Error objects seem to have - // no way to distinguish their type, as calling toString on both the objects - // themselves and their constructor only returns [object Error]. - return; - } - - function assertErrorPasses(ErrorClass) { - var name = ErrorClass.name; - equal(callObjectEqual(new ErrorClass('foo'), new ErrorClass('foo')), true, name + ' | foo == foo'); - equal(callObjectEqual(new ErrorClass('foo'), new ErrorClass('bar')), false, name + ' | foo != bar'); - } - - assertErrorPasses(Error); - assertErrorPasses(TypeError); - assertErrorPasses(RangeError); - assertErrorPasses(EvalError); - assertErrorPasses(ReferenceError); - assertErrorPasses(SyntaxError); - assertErrorPasses(URIError); - - equal(callObjectEqual(new TypeError('foo'), new RangeError('foo')), false, 'different types are never equal'); - - }); - - group('Sets', function() { - if (typeof Set === 'undefined') return; - equal(callObjectEqual(createSet(), createSet()), true, '{} == {}'); - equal(callObjectEqual(createSet('a'), createSet()), false, '{a} != {}'); - equal(callObjectEqual(createSet('a'), createSet()), false, '{} != {a}'); - equal(callObjectEqual(createSet('a'), createSet('a')), true, '{a} == {a}'); - equal(callObjectEqual(createSet('a'), createSet('b')), false, '{a} != {b}'); - equal(callObjectEqual(createSet([5]), createSet([5])), true, '{5} == {5}'); - equal(callObjectEqual(createSet([5]), createSet([10])), false, '{5} != {10}'); - - equal(callObjectEqual(createSet([[1,2,3]]), createSet([[1,2,3]])), true, '{1,2,3} == {1,2,3}'); - equal(callObjectEqual(createSet([[1,2,3]]), createSet([[1,2]])), false, '{1,2,3} != {1,2}'); - equal(callObjectEqual(createSet([{a:'a'}]), createSet([{a:'a'}])), true, '{a:a} == {a:a}'); - equal(callObjectEqual(createSet([{a:'a'}]), createSet([{a:'b'}])), false, '{a:a} != {a:b}'); - }); - - group('Maps', function() { - if (typeof Map === 'undefined') return; - equal(callObjectEqual(createMap(), createMap()), true, 'empty == empty'); - equal(callObjectEqual(createMap(['a','a']), createMap(['a','a'])), true, 'a => a == a => a'); - equal(callObjectEqual(createMap(['a','a']), createMap(['a','b'])), false, 'a => a != a => b'); - equal(callObjectEqual(createMap(['a','a']), createMap(['b','a'])), false, 'a => a != a => b'); - }); - - group('Typed Arrays', function() { - if (typeof ArrayBuffer === 'undefined') return; - - assertTypedArrayEquality(Int8Array); - assertTypedArrayEquality(Uint8Array); - assertTypedArrayEquality(Int16Array); - assertTypedArrayEquality(Uint16Array); - assertTypedArrayEquality(Int32Array); - assertTypedArrayEquality(Uint32Array); - assertTypedArrayEquality(Float32Array); - assertTypedArrayEquality(Float64Array); - - equal(callObjectEqual(createTypedArray(Int8Array, [256]), createTypedArray(Int32Array, [256])), false, 'different types are never equal'); - }); - - group('Uint8ClampedArray', function() { - if (typeof Uint8ClampedArray === 'undefined') return; - assertTypedArrayEquality(Uint8ClampedArray); - }); - - group('Symbols', function() { - if (typeof Symbol === 'undefined') return; - var sym = Symbol('a'); - equal(callObjectEqual(Symbol('a'), Symbol('a')), false, 'Symbols are never equivalent'); - equal(callObjectEqual(sym, sym), true, 'Symbols are still equal by reference'); - equal(callObjectEqual(Object(sym), sym), false, 'First symbol wrapped by Object'); - equal(callObjectEqual(Object(sym), Object(sym)), false, 'Both symbols wrapped by object'); - }); - -}); - diff --git a/test/OLD/tests/object.js b/test/OLD/tests/object.js index 34e68325c..514d4d28d 100644 --- a/test/OLD/tests/object.js +++ b/test/OLD/tests/object.js @@ -1883,37 +1883,6 @@ namespace('Object', function () { }); - method('isEqual', function() { - - function assertChainableEqual(obj1, obj2, result, message) { - var obj = new Sugar.Object(obj1); - equal(obj.isEqual(obj2).raw, result, message); - } - - test({ broken: 'wear' }, [{ broken: 'wear' }], true, 'objects are equal'); - test({ broken: 'wear' }, [{ broken: 'jumpy' }], false, 'objects are not equal'); - test({}, [{}], true, 'empty objects are equal'); - test({}, [{ broken: 'wear' }], false, '1st empty'); - test({ broken: 'wear' }, [{}], false, '2nd empty'); - - test({x:1,y:undefined}, [{x:1,z:2}], false, 'undefined keys'); - - assertChainableEqual({broken:'wear'},{broken:'wear'}, true, 'chainable is equal'); - assertChainableEqual({},{}, true, 'empty chainable is equal to empty object'); - assertChainableEqual({},[], false, 'empty object chainable is not equal to empty array'); - assertChainableEqual([],{}, false, 'empty array chainable is not equal to empty object'); - - var obj1 = {foo:'bar'}; - test({a:obj1,b:obj1}, [{a:obj1,b:obj1}], true, 'multiple references will not choke'); - - var obj1 = { foo: 'bar' }; - obj1.moo = obj1; - test(obj1, [{foo:'bar',moo:obj1}], true, 'cyclical references handled'); - - test(Object, [undefined, 'one'], false, 'string to undefined'); - - }); - method('tap', function() { var fn = function(first) { diff --git a/test/tests/array.js b/test/tests/array.js index 0f497b894..9764c64dd 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -2976,4 +2976,35 @@ namespace('Array', function() { }); + describeInstance('isEqual', function(isEqual) { + + // Note comprehensive tests are run through Object#isEqual. + + it('should handle basic array equality', function() { + assertEqual(isEqual([], []), true); + assertEqual(isEqual([1], [1]), true); + assertEqual(isEqual([1], [2]), false); + assertEqual(isEqual([2], [1]), false); + assertEqual(isEqual([1], [1,2]), false); + assertEqual(isEqual([1,2], [1]), false); + }); + + it('should function as expected for nested cases', function() { + assertEqual(isEqual([[1,2,3]], [[1,2,3]]), true); + assertEqual(isEqual([[1,2,3]], [[1,2,4]]), false); + assertEqual(isEqual([1], {0:1,length:1}), false); + assertEqual(isEqual([1,'a',{a:1}], [1,'a',{a:1}]), true); + assertEqual(isEqual([1,'a',{a:1}], [1,'a',{a:2}]), false); + assertEqual(isEqual([1,'a',{a:1}], [1,'b',{a:1}]), false); + }); + + it('should distinguish sparse and dense arrays', function() { + assertEqual(isEqual(new Array(3), new Array(3)), true); + assertEqual(isEqual(new Array(3), new Array(6)), false); + assertEqual(isEqual(new Array(6), new Array(3)), false); + assertEqual(isEqual([,1], [undefined,1]), false); + }); + + }); + }); diff --git a/test/tests/object.js b/test/tests/object.js index d45e057a9..55615a15d 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -1477,7 +1477,7 @@ namespace('Object', function () { }); it('should correctly iterate when initial value is undefined', function() { - reduce({a:1}, (acc, key, val, obj) => { + reduce({a:1}, (acc) => { assertEqual(acc, undefined); }, undefined); }); @@ -1504,7 +1504,7 @@ namespace('Object', function () { if (a) { this.a = a; } - }; + } assertTrue(isEmpty(new Foo)); assertFalse(isEmpty(new Foo(1))); }); @@ -1532,7 +1532,7 @@ namespace('Object', function () { if (a) { this.a = a; } - }; + } assertEqual(size(new Foo), 0); assertEqual(size(new Foo(1)), 1); }); @@ -1545,4 +1545,346 @@ namespace('Object', function () { }); + describeInstance('isEqual', function(isEqual) { + + it('should handle primitives', function() { + assertEqual(isEqual(1, 1), true); + assertEqual(isEqual(1, 2), false); + assertEqual(isEqual(2, 1), false); + assertEqual(isEqual('a', 'a'), true); + assertEqual(isEqual('a', 'b'), false); + assertEqual(isEqual('b', 'a'), false); + assertEqual(isEqual(true, true), true); + assertEqual(isEqual(true, false), false); + assertEqual(isEqual(false, true), false); + }); + + it('should handle irregular primitive cases', function() { + assertEqual(isEqual(0, 0), true); + assertEqual(isEqual(-0, -0), true); + assertEqual(isEqual(-0, 0), false); + assertEqual(isEqual(0, -0), false); + assertEqual(isEqual(NaN, NaN), true); + assertEqual(isEqual(Infinity, Infinity), true); + assertEqual(isEqual(-Infinity, -Infinity), true); + assertEqual(isEqual(Infinity, -Infinity), false); + assertEqual(isEqual(-Infinity, Infinity), false); + assertEqual(isEqual(Infinity, NaN), false); + assertEqual(isEqual(NaN, Infinity), false); + assertEqual(isEqual(null, null), true); + assertEqual(isEqual(null, undefined), false); + assertEqual(isEqual(undefined, null), false); + assertEqual(isEqual(undefined, undefined), true); + }); + + it('should function as expected with insufficient arguments', function() { + assertEqual(isEqual(), true); + assertEqual(isEqual(undefined), true); + assertEqual(isEqual(null), false); + assertEqual(isEqual(''), false); + assertEqual(isEqual(NaN), false); + assertEqual(isEqual(0), false); + }); + + it('should distinguish primitives from wrapped counterparts', function() { + assertEqual(isEqual(new String('a'), new String('a')), true); + assertEqual(isEqual('a', new String('a')), false); + assertEqual(isEqual(new String('a'), 'a'), false); + assertEqual(isEqual(new String('a'), new String('b')), false); + assertEqual(isEqual(new String('a'), { toString: () => 'a' }), false); + + assertEqual(isEqual(new Number(1), new Number(1)), true); + assertEqual(isEqual(1, new Number(1)), false); + assertEqual(isEqual(new Number(1), 1), false); + assertEqual(isEqual(new Number(1), new Number(2)), false); + assertEqual(isEqual(new Number(1), { valueOf: () => 1 }), false); + + assertEqual(isEqual(new Boolean, new Boolean), true); + assertEqual(isEqual(true, new Boolean(true)), false); + assertEqual(isEqual(new Boolean(true), true), false); + assertEqual(isEqual(new Boolean(true), new Boolean(false)), false); + }); + + it('should distinguish common type coercions', function() { + assertEqual(isEqual('1', 1), false); + assertEqual(isEqual(1, '1'), false); + assertEqual(isEqual(new Number(1), new String(1)), false); + assertEqual(isEqual(new String(1), new Number(1)), false); + assertEqual(isEqual('', false), false); + assertEqual(isEqual(false, ''), false); + assertEqual(isEqual(0, ''), false); + assertEqual(isEqual('', 0), false); + assertEqual(isEqual(0, false), false); + assertEqual(isEqual(false, 0), false); + assertEqual(isEqual(1, true), false); + assertEqual(isEqual(true, 1), false); + assertEqual(isEqual(1599470036490, new Date(1599470036490)), false); + assertEqual(isEqual(new Date(1599470036490), 1599470036490), false); + }); + + it('should handle plain objects', function() { + assertEqual(isEqual({}, {}), true); + assertEqual(isEqual({a:1}, {a:1}), true); + assertEqual(isEqual({a:1}, {a:2}), false); + assertEqual(isEqual({a:1,b:2}, {a:1,b:2}), true); + assertEqual(isEqual({a:1,b:2}, {a:1}), false); + assertEqual(isEqual({b:2}, {a:1,b:2}), false); + }); + + it('should distinguish missing keys', function() { + assertEqual(isEqual({a:undefined}, {}), false); + assertEqual(isEqual({}, {a:undefined}), false); + }); + + it('should distinguish object types', function() { + assertEqual(isEqual([], {}), false); + assertEqual(isEqual({}, []), false); + assertEqual(isEqual([{}], [{}]), true); + assertEqual(isEqual([[]], [[]]), true); + assertEqual(isEqual([[]], [{}]), false); + assertEqual(isEqual([{}], [[]]), false); + assertEqual(isEqual(new Set(), {}), false); + assertEqual(isEqual(new Map(), {}), false); + assertEqual(isEqual({length:0}, []), false); + assertEqual(isEqual([], {length:0}), false); + }); + + it('should handle object references', function() { + const obj1 = {a:1}; + const obj2 = {a:1}; + assertEqual(isEqual({a:obj1,b:obj1}, {a:obj1,b:obj1}), true); + assertEqual(isEqual({a:obj2,b:obj1}, {a:obj1,b:obj1}), true); + assertEqual(isEqual({a:obj1,b:obj2}, {a:obj1,b:obj1}), true); + assertEqual(isEqual({a:obj1,b:obj1}, {a:obj2,b:obj1}), true); + assertEqual(isEqual({a:obj1,b:obj1}, {a:obj1,b:obj2}), true); + }); + + it('should handle cyclic references', function() { + const obj = {a:1}; + obj.b = obj; + assertEqual(isEqual({a:obj,b:obj}, {a:obj,b:obj}), true); + assertEqual(isEqual({a:obj,b:obj}, {a:obj}), false); + assertEqual(isEqual({a:obj}, {a:obj,b:obj}), false); + + const arr = []; + arr.push(arr); + assertEqual(isEqual(arr, arr), true); + assertEqual(isEqual([arr], [arr]), true); + assertEqual(isEqual([arr], [arr, arr]), false); + assertEqual(isEqual([arr, arr], [arr]), false); + }); + + it('should complex nested objects', function() { + assertEqual(isEqual({ + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','b','c'], + } + }, { + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','b','c'], + } + }), true); + assertEqual(isEqual({ + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','b','c'], + } + }, { + obj: { + a: 'b', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','b','c'], + } + }), false); + assertEqual(isEqual({ + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','b','c'], + } + }, { + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','a','c'], + } + }), false); + assertEqual(isEqual({ + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 1), + e: new String('a'), + f: ['a','b','c'], + } + }, { + obj: { + a: 'a', + b: 1, + c: true, + d: new Date(2000, 0, 2), + e: new String('a'), + f: ['a','b','c'], + } + }), false); + }); + + it('should function as expected for arrays', function() { + assertEqual(isEqual([], []), true); + assertEqual(isEqual([], [1]), false); + assertEqual(isEqual([1], []), false); + assertEqual(isEqual([1], [1]), true); + assertEqual(isEqual([1], [2]), false); + assertEqual(isEqual([1], ['1']), false); + assertEqual(isEqual([1,2,3], [1,2,3]), true); + assertEqual(isEqual([1,2,3], [1,2,4]), false); + assertEqual(isEqual([1], {0:1,length:1}), false); + assertEqual(isEqual([1,'a',{a:1}], [1,'a',{a:1}]), true); + assertEqual(isEqual([1,'a',{a:1}], [1,'a',{a:2}]), false); + assertEqual(isEqual([1,'a',{a:1}], [1,'b',{a:1}]), false); + }); + + it('should handle object references inside arrays', function() { + const obj1 = {a:1}; + const obj2 = {a:2}; + assertEqual(isEqual([obj1, obj2], [obj1, obj2]), true); + assertEqual(isEqual([obj1, obj2], [obj2, obj1]), false); + assertEqual(isEqual([obj1, obj2], [obj1]), false); + assertEqual(isEqual([obj1], [obj1, obj2]), false); + }); + + it('should distinguish arrays and arguments', function() { + const args1 = (function() { + return arguments; + })('a','b','c'); + const args2 = (function() { + return arguments; + })('a','b','c'); + assertEqual(isEqual(args1, args2), true); + assertEqual(isEqual(['a','b','c'], args1), false); + assertEqual(isEqual(args1, ['a','b','c']), false); + }); + + it('should handle irregular array cases', function() { + assertEqual(isEqual([], {}), false); + assertEqual(isEqual([0], [0]), true); + assertEqual(isEqual([undefined], [undefined]), true); + assertEqual(isEqual([null], [null]), true); + assertEqual(isEqual([NaN], [NaN]), true); + }); + + it('should distinguish sparse and dense arrays', function() { + assertEqual(isEqual(new Array(3), new Array(3)), true); + assertEqual(isEqual(new Array(3), new Array(6)), false); + assertEqual(isEqual(new Array(6), new Array(3)), false); + assertEqual(isEqual([,1], [undefined,1]), false); + }); + + it('should function as expected for dates', function() { + assertEqual(isEqual(new Date(2020, 8, 7), new Date(2020, 8, 7)), true); + assertEqual(isEqual(new Date(2020, 8, 7), new Date(2020, 8, 8)), false); + assertEqual(isEqual(new Date(2020, 8, 7), new Date(2020, 8, 7, 0, 0, 0, 1)), false); + assertEqual(isEqual(new Date(1599470036490), { getTime: () => 1599470036490 }), false); + assertEqual(isEqual({ getTime: () => 1599470036490 }, new Date(1599470036490)), false); + assertEqual(isEqual(new Date('Invalid'), new Date('Invalid')), true); + }); + + it('should function as expected for functions', function() { + const fn1 = () => {}; + const fn2 = () => {}; + assertEqual(isEqual(fn1, fn1), true); + assertEqual(isEqual(fn1, fn2), false); + assertEqual(isEqual(fn2, fn1), false); + }); + + it('should function as expected for regexes', function() { + assertEqual(isEqual(/a/, /a/), true); + assertEqual(isEqual(/a/, /a/i), false); + assertEqual(isEqual(/a/i, /a/), false); + assertEqual(isEqual(/a/gim, /a/gim), true); + assertEqual(isEqual(/a/gim, /b/gim), false); + assertEqual(isEqual(/b/gim, /a/gim), false); + }); + + it('should function as expected for class instances', function() { + function Foo(val) { + this.value = val; + } + assertEqual(isEqual(new Foo, new Foo), false); + assertEqual(isEqual({value: 1}, new Foo(1)), false); + assertEqual(isEqual(new Foo(1), {value: 1}), false); + }); + + it('should function as expected for sets', function() { + assertEqual(isEqual(new Set([1]), new Set([1])), true); + assertEqual(isEqual(new Set([1]), new Set([2])), false); + assertEqual(isEqual(new Set([2]), new Set([1])), false); + }); + + it('should function as expected for maps', function() { + assertEqual(isEqual(new Map([[1,1]]), new Map([[1,1]])), true); + assertEqual(isEqual(new Map([[1,1]]), new Map([[1,2]])), false); + assertEqual(isEqual(new Map([[1,2]]), new Map([[1,1]])), false); + }); + + it('should function as expected for typed arrays', function() { + assertEqual(isEqual([1], Uint8Array.from(1)), false); + assertEqual(isEqual(Uint8Array.from(1), [1]), false); + assertEqual(isEqual(Int8Array.from(1), Int8Array.from(1)), true); + assertEqual(isEqual(Int8Array.from(1), Uint8Array.from(1)), false); + assertEqual(isEqual(Int16Array.from(1), Int32Array.from(1)), false); + assertEqual(isEqual(Int32Array.from(1), Int16Array.from(1)), false); + assertEqual(isEqual(Float32Array.from(1), Float32Array.from(1)), true); + assertEqual(isEqual(Float32Array.from(1), Float64Array.from(1)), false); + assertEqual(isEqual(Float64Array.from(1), Float32Array.from(1)), false); + }); + + it('should only return true for symbols by reference', function() { + const sym = Symbol('a'); + assertEqual(isEqual(sym, sym), true); + assertEqual(isEqual(Symbol('a'), Symbol('a')), false); + assertEqual(isEqual(Object(sym), sym), false); + assertEqual(isEqual(Object(sym), Object(sym)), false); + }); + + it('should function as expected for errors', function() { + assertEqual(isEqual(new Error, new Error), true); + assertEqual(isEqual(new Error('a'), new Error('a')), true); + assertEqual(isEqual(new TypeError('a'), new TypeError('a')), true); + assertEqual(isEqual(new Error, new TypeError), false); + assertEqual(isEqual(new TypeError, new Error), false); + }); + + it('should function as expected with overwritten isEqual', function() { + assertEqual(isEqual({}, { + isEqual: () => true, + }), false); + }); + + }); + }); From b330e298b9e42f15c445d1ae63700cce30d86d91 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 7 Sep 2020 21:42:05 +0900 Subject: [PATCH 103/191] Added Array#clone. --- src/array/clone.js | 21 +++++++++++++++++++++ src/array/define.js | 1 + src/array/methods.js | 1 + test/tests/array.js | 28 ++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 src/array/clone.js diff --git a/src/array/clone.js b/src/array/clone.js new file mode 100644 index 000000000..f248c3f08 --- /dev/null +++ b/src/array/clone.js @@ -0,0 +1,21 @@ +import { assertArray } from '../util/assertions'; + +/** + * Returns a shallow copy of the array. + * + * @extra This method is intended as a more readable alias for `Array#concat`. + * Use `Object.clone` instead for a deep clone. + * + * @param {Array} arr - The array to clone. + * + * @returns {Array} + * + * @example + * + * [1,2].clone() -> [1,2] + * + **/ +export default function clone(arr) { + assertArray(arr); + return arr.concat(); +} diff --git a/src/array/define.js b/src/array/define.js index 9180f0263..fae28e27d 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -5,6 +5,7 @@ defineInstance('add', methods.add); defineInstance('append', methods.append); defineInstance('at', methods.at); defineInstance('average', methods.average); +defineInstance('clone', methods.clone); defineInstance('compact', methods.compact); defineInstance('count', methods.count); defineInstance('exclude', methods.exclude); diff --git a/src/array/methods.js b/src/array/methods.js index 5c9d35d3f..d68d3fef6 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -2,6 +2,7 @@ export { default as add } from './add'; export { default as append } from './append'; export { default as at } from './at'; export { default as average } from './average'; +export { default as clone } from './clone'; export { default as compact } from './compact'; export { default as count } from './count'; export { default as every } from './every'; diff --git a/test/tests/array.js b/test/tests/array.js index 9764c64dd..50926d661 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -3007,4 +3007,32 @@ namespace('Array', function() { }); + describeInstance('clone', function(clone) { + + it('should handle basic arrays', function() { + assertArrayEqual(clone([]), []); + assertArrayEqual(clone([1,2,3]), [1,2,3]); + }); + + it('should clone nested arrays', function() { + assertArrayEqual(clone([{a:1}]), [{a:1}]); + }); + + it('should be shallow', function() { + const obj = {}; + assertEqual(clone([obj])[0], obj); + }); + + it('should work as expected on shallow arrays', function() { + assertArrayEqual(clone([,,]), [,,]); + }); + + it('should handle irregular input', function() { + assertError(() => { clone(null); }); + assertError(() => { clone('8'); }); + assertError(() => { clone(8); }); + }); + + }); + }); From 7418ec25f129ea6d355d628df749a82326d74ee9 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Mon, 7 Sep 2020 22:04:10 +0900 Subject: [PATCH 104/191] Added Array.construct --- src/array/construct.js | 28 ++++++++++++++++++++++++++++ src/array/define.js | 4 +++- src/array/methods.js | 1 + test/OLD/tests/array.js | 19 ------------------- test/tests/array.js | 23 +++++++++++++++++++++++ 5 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 src/array/construct.js diff --git a/src/array/construct.js b/src/array/construct.js new file mode 100644 index 000000000..4ed2a69a5 --- /dev/null +++ b/src/array/construct.js @@ -0,0 +1,28 @@ +import { assertNonNegativeInteger, assertFunction } from '../util/assertions'; + +/** + * Constructs an array of `n` length from the values returned by the provided + * function. + * + * @param {number} n - The intended length of the array. + * @param {indexMapFn} fn - The function whose return values determine resulting + * elements in the array. + * + * @returns {Array} + * + * @callback indexMapFn + * + * i The index of the current iteration. + * + * @example + * + * Array.construct(4, (i) => { + * return i * i; + * }); -> [0, 1, 4] + * + **/ +export default function construct(n, fn) { + assertNonNegativeInteger(n); + assertFunction(fn); + return Array.from(new Array(n), (el, i) => fn(i)); +} diff --git a/src/array/define.js b/src/array/define.js index fae28e27d..fb8c06c61 100644 --- a/src/array/define.js +++ b/src/array/define.js @@ -1,6 +1,8 @@ -import { defineInstance } from '../core/array'; +import { defineStatic, defineInstance } from '../core/array'; import * as methods from './methods'; +defineStatic('construct', methods.construct); + defineInstance('add', methods.add); defineInstance('append', methods.append); defineInstance('at', methods.at); diff --git a/src/array/methods.js b/src/array/methods.js index d68d3fef6..d0e7264da 100644 --- a/src/array/methods.js +++ b/src/array/methods.js @@ -4,6 +4,7 @@ export { default as at } from './at'; export { default as average } from './average'; export { default as clone } from './clone'; export { default as compact } from './compact'; +export { default as construct } from './construct'; export { default as count } from './count'; export { default as every } from './every'; export { default as exclude } from './exclude'; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js index fa10b2f72..4f9e50d0b 100644 --- a/test/OLD/tests/array.js +++ b/test/OLD/tests/array.js @@ -40,23 +40,4 @@ namespace('Array', function () { test(Array, [args], ['a','b','c'], 'works on arguments object'); }); - method('construct', function() { - - function square(i) { - return i * i; - } - test(Array, [3, square], [0,1,4], 'basic array construction'); - test(Array, ['3', square], [0,1,4], 'numeric string creates the array'); - - test(Array, [3], safeArray(undefined, undefined, undefined), 'no function becomes all undefined'); - test(Array, [0], [], '0 constructs an empty array'); - test(Array, [null], [], 'null constructs an empty array'); - test(Array, [3, parseInt], [0,1,2], 'works with parseInt'); - test(Array, [], [], 'no arguments is an empty array'); - test(Array, [NaN], [], 'NaN is an empty array'); - test(Array, [undefined], [], 'NaN is an empty array'); - test(Array, ['foo'], [], 'non-numeric string is empty array'); - - }); - }); diff --git a/test/tests/array.js b/test/tests/array.js index 50926d661..f51ae3529 100644 --- a/test/tests/array.js +++ b/test/tests/array.js @@ -3,6 +3,29 @@ namespace('Array', function() { + describeStatic('construct', function(construct) { + + it('should handle basic construction', function () { + assertArrayEqual(construct(3, (n) => n * n), [0,1,4]); + }); + + it('should work with parseInt', function () { + assertArrayEqual(construct(3, parseInt), [0, 1, 2]); + }); + + it('should handle irregular input', function () { + assertArrayEqual(construct(0, i => i), []); + assertError(() => { construct(); }); + assertError(() => { construct(-1, (i) => i); }); + assertError(() => { construct(2.2, (i) => i); }); + assertError(() => { construct('3', (i) => i); }); + assertError(() => { construct(NaN, (i) => i); }); + assertError(() => { construct(null, (i) => i); }); + assertError(() => { construct(undefined, (i) => i); }); + }); + + }); + describeInstance('groupBy', function(groupBy) { var basic = [ From 3f80b1aca693f74f0dbcd8b5afb3a3e98afbc914 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Tue, 8 Sep 2020 16:56:11 +0900 Subject: [PATCH 105/191] Removed Array.create and added chainable constructor factories. --- CHANGELOG.md | 3 +- package.json | 2 +- src/core/array.js | 27 ++++++++++++++-- src/core/function.js | 23 +++++++++++-- src/core/index.js | 10 +++++- src/core/number.js | 22 +++++++++++-- src/core/object.js | 30 +++++++++++++---- src/core/regexp.js | 23 +++++++++++-- src/core/string.js | 22 +++++++++++-- test/OLD/tests/array.js | 43 ------------------------ test/tests/chainable.js | 72 ++++++++++++++++++++++++++++++++++++----- yarn.lock | 8 ++--- 12 files changed, 211 insertions(+), 74 deletions(-) delete mode 100644 test/OLD/tests/array.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 30444dc5a..d5207a143 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,7 +105,8 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `Array#append` second argument to add element at a specific index. Use `Array#insert` for this instead. - Removed `all` flag from `Array#compact`. Use `Array#filter` here instead. -- Removed `Array#flatten`. Use native `Array#flat` instead. +- Removed `Array#flatten`. Use native `Array#flat` here instead. +- Removed `Array.create`. Use native `Array.from` here instead. TODO: diff --git a/package.json b/package.json index 37ffc696c..aafd8c46f 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.35", + "ready-test": "^1.0.36", "sinon": "^9.0.2", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/core/array.js b/src/core/array.js index 262b5f15e..df152b12e 100644 --- a/src/core/array.js +++ b/src/core/array.js @@ -1,6 +1,28 @@ import { createNamespace } from '../core'; -export const Array = createNamespace('Array'); +/** + * Creates a new wrapped Array chainable. + * + * @param {any} [arr] - The array to wrap. If a non-array iterable such as a + * string is passed it will be converted to an array with `Array.from`. + * Default is an empty array. + * + * @returns {SugarChainable} + * + * @example + * + * new Sugar.Array(); + * new Sugar.Array([1,2,3]); + * new Sugar.Array('abc'); + * + **/ +const Namespace = createNamespace('Array', (arg) => { + if (arg && !Array.isArray(arg)) { + return Array.from(arg); + } else { + return arg || []; + } +}); export const { extend, @@ -8,4 +30,5 @@ export const { defineInstance, defineStaticAlias, defineInstanceAlias, -} = Array; +} = Namespace; +export { Namespace as Array }; diff --git a/src/core/function.js b/src/core/function.js index 55df90190..9583857d3 100644 --- a/src/core/function.js +++ b/src/core/function.js @@ -1,6 +1,24 @@ import { createNamespace } from '../core'; -export const Function = createNamespace('Function'); +/** + * Creates a new wrapped Function chainable. + * + * @param {Function} fn - The function to wrap. Will throw an error if not + * provided. + * + * @returns {SugarChainable} + * + * @example + * + * new Sugar.Function(() => {}); + * + **/ +const Namespace = createNamespace('Function', (fn) => { + if (!fn) { + throw new Error('Function required'); + } + return fn; +}); export const { extend, @@ -8,4 +26,5 @@ export const { defineInstance, defineStaticAlias, defineInstanceAlias, -} = Function; +} = Namespace; +export { Namespace as Function }; diff --git a/src/core/index.js b/src/core/index.js index 9a16d6e5e..3fddc966c 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -22,7 +22,7 @@ export const VERSION = 'edge'; * * @returns {Function} SugarChainableConstructor */ -export function createNamespace(globalName) { +export function createNamespace(globalName, factory) { if (!globalContext[globalName]) { throw new Error(`Built-in class ${globalName} does not exist`); @@ -96,6 +96,14 @@ export function createNamespace(globalName) { defineAliases(globalName, defineInstance, str, fn); } + constructor(...args) { + if (factory) { + super(factory(...args)); + } else { + super(...args); + } + } + } mapNativeToChainable(globalName, SugarChainable); diff --git a/src/core/number.js b/src/core/number.js index ed7dbfcc4..613229637 100644 --- a/src/core/number.js +++ b/src/core/number.js @@ -1,6 +1,23 @@ import { createNamespace } from '../core'; -export const Number = createNamespace('Number') +/** + * Creates a new wrapped Number chainable. + * + * @param {any} [n] - The number to wrap. Non-numbers will be coerced. + * `0` by default. + * + * @returns {SugarChainable} + * + * @example + * + * new Sugar.Number(); + * new Sugar.Number(5); + * new Sugar.Number('5'); + * + **/ +const Namespace = createNamespace('Number', (n = 0) => { + return Number(n); +}) export const { extend, @@ -8,4 +25,5 @@ export const { defineInstance, defineStaticAlias, defineInstanceAlias, -} = Number; +} = Namespace; +export { Namespace as Number }; diff --git a/src/core/object.js b/src/core/object.js index a787a69da..a983693fc 100644 --- a/src/core/object.js +++ b/src/core/object.js @@ -1,9 +1,28 @@ +import { isMap, isObject } from '../util/typeChecks'; import { createNamespace } from '../core'; -// Webpack has an issue with calling Object() -// on exported modules, creating a conflict -// here, so need to rename. -const Namespace = createNamespace('Object'); +/** + * Creates a new wrapped Object chainable. + * + * @param {Object} [obj] - The object to wrap. Will convert Map to an object. + * Will throw an error if a non-object is passed. Default is an empty object. + * + * @returns {SugarChainable} + * + * @example + * + * new Sugar.Object(); + * new Sugar.Object({a:1}); + * + **/ +const Namespace = createNamespace('Object', (obj = {}) => { + if (isMap(obj)) { + return Object.fromEntries(obj.entries()); + } else if (!isObject(obj)) { + throw new Error('Object required'); + } + return obj; +}); export const { extend, @@ -12,5 +31,4 @@ export const { defineStaticAlias, defineInstanceAlias, } = Namespace; - -export { Namespace as Object } +export { Namespace as Object }; diff --git a/src/core/regexp.js b/src/core/regexp.js index 5c7105c9a..ec64c9943 100644 --- a/src/core/regexp.js +++ b/src/core/regexp.js @@ -1,6 +1,24 @@ import { createNamespace } from '../core'; -export const RegExp = createNamespace('RegExp'); +/** + * Creates a new wrapped RegExp chainable. + * + * @param {RegExp} reg - The regex to wrap. Will throw an error if not + * provided. + * + * @returns {SugarChainable} + * + * @example + * + * new Sugar.RegExp(/abc/); + * + **/ +const Namespace = createNamespace('RegExp', (reg) => { + if (!reg) { + throw new TypeError('RegExp required'); + } + return reg; +}); export const { extend, @@ -8,4 +26,5 @@ export const { defineInstance, defineStaticAlias, defineInstanceAlias, -} = RegExp; +} = Namespace; +export { Namespace as RegExp }; diff --git a/src/core/string.js b/src/core/string.js index 46555235a..f643ed070 100644 --- a/src/core/string.js +++ b/src/core/string.js @@ -1,6 +1,23 @@ import { createNamespace } from '../core'; -export const String = createNamespace('String'); +/** + * Creates a new wrapped String chainable. + * + * @param {any} [n] - The string to wrap. Non-strings will be coerced. + * `0` by default. + * + * @returns {SugarChainable} + * + * @example + * + * new Sugar.String(); + * new Sugar.String('a'); + * new Sugar.String(5); + * + **/ +const Namespace = createNamespace('String', (str = '') => { + return String(str); +}); export const { extend, @@ -8,4 +25,5 @@ export const { defineInstance, defineStaticAlias, defineInstanceAlias, -} = String; +} = Namespace; +export { Namespace as String }; diff --git a/test/OLD/tests/array.js b/test/OLD/tests/array.js deleted file mode 100644 index 4f9e50d0b..000000000 --- a/test/OLD/tests/array.js +++ /dev/null @@ -1,43 +0,0 @@ -namespace('Array', function () { - 'use strict'; - - group('Chainable', function() { - var arr = [1,2,3]; - var arrayLike = { 0: 1, 1: 2, 2: 3, length: 3 }; - var args = (function() { return arguments; })('a','b','c'); - var Soup = function() {}; Soup.prototype = [1,2,3]; var inst = new Soup(); - - equal(new Sugar.Array(arr).raw === arr, true, 'should simply wrap an existing array'); - equal(new Sugar.Array(inst).raw === inst, true, 'should simply wrap an inherited array'); - - equal(new Sugar.Array().raw, [], 'no argument produces empty array'); - equal(new Sugar.Array(undefined).raw, [], 'undefined is the same as no argument'); - equal(new Sugar.Array(8).raw, [8], 'non-object argument wraps in array'); - equal(new Sugar.Array('abc').raw, ['a','b','c'], 'string is split into array'); - equal(new Sugar.Array(null).raw, [null], 'null is wrapped'); - equal(new Sugar.Array(arrayLike).raw, [1,2,3], 'accepts array-likes'); - equal(new Sugar.Array(args).raw, ['a','b','c'], 'works on arguments object'); - }); - - method('create', function() { - var arrayLike = { 0: 1, 1: 2, 2: 3, length: 3 } - var args = (function() { return arguments; })('a','b','c'); - var Soup = function() {}; Soup.prototype = [1,2,3]; var inst = new Soup(); - - var arr = [1,2,3]; - equal(run(Array, 'create', [arr]) === arr, true, 'should return a reference by default'); - - var arr = [1,2,3]; - equal(run(Array, 'create', [arr, true]) === arr, false, 'should clone the array with argument'); - - equal(run(Array, 'create', [inst]) === inst, true, 'should return reference to inherited'); - test(Array, [], 'no argument produces empty array'); - test(Array, [undefined], [], 'undefined is the same as no argument'); - test(Array, [8], [8], 'non-object argument wraps in array'); - test(Array, ['abc'], ['a','b','c'], 'string is split into array'); - test(Array, [null], [null], 'null is wrapped'); - test(Array, [arrayLike], [1,2,3], 'accepts array-likes'); - test(Array, [args], ['a','b','c'], 'works on arguments object'); - }); - -}); diff --git a/test/tests/chainable.js b/test/tests/chainable.js index e10b2fa14..7db6ba775 100644 --- a/test/tests/chainable.js +++ b/test/tests/chainable.js @@ -6,6 +6,8 @@ describe('Chainable', function() { Sugar.createNamespace('String'); Sugar.createNamespace('Object'); Sugar.createNamespace('Array'); + Sugar.createNamespace('RegExp'); + Sugar.createNamespace('Function'); describe('Constructor', function() { @@ -19,6 +21,64 @@ describe('Chainable', function() { }); }); + it('should correctly construct numbers', function() { + assertEqual(new Sugar.Number().raw, 0); + assertEqual(new Sugar.Number(null).raw, 0); + assertEqual(new Sugar.Number(5).raw, 5); + assertEqual(new Sugar.Number('5').raw, 5); + assertEqual(new Sugar.Number([]).raw, 0); + assertEqual(new Sugar.Number(undefined).raw, 0); + assertNaN(new Sugar.Number('a').raw); + }); + + it('should correctly construct strings', function() { + assertEqual(new Sugar.String().raw, ''); + assertEqual(new Sugar.String(null).raw, 'null'); + assertEqual(new Sugar.String(5).raw, '5'); + assertEqual(new Sugar.String('5').raw, '5'); + assertEqual(new Sugar.String([]).raw, ''); + assertEqual(new Sugar.String(undefined).raw, ''); + assertEqual(new Sugar.String('a').raw, 'a'); + }); + + it('should correctly construct arrays', function() { + assertArrayEqual(new Sugar.Array().raw, []); + assertArrayEqual(new Sugar.Array(null).raw, []); + assertArrayEqual(new Sugar.Array(undefined).raw, []); + assertArrayEqual(new Sugar.Array('abc').raw, ['a','b','c']); + assertArrayEqual(new Sugar.Array({a:1}).raw, []); + assertArrayEqual(new Sugar.Array(new Set([1,2,3])).raw, [1,2,3]); + assertArrayEqual(new Sugar.Array(new Map([[1,2]])).raw, [[1,2]]); + }); + + it('should correctly construct objects', function() { + assertObjectEqual(new Sugar.Object().raw, {}); + assertObjectEqual(new Sugar.Object(undefined).raw, {}); + assertObjectEqual(new Sugar.Object({a:1}).raw, {a:1}); + assertObjectEqual(new Sugar.Object(new Map([['a',1]])).raw, {a:1}); + assertError(() => { + new Sugar.Object(null); + }); + assertError(() => { + new Sugar.Object('abc'); + }); + }); + + it('should correctly construct regexes', function() { + assertRegExpEqual(new Sugar.RegExp(/abc/).raw, /abc/); + assertError(() => { + new Sugar.RegExp(); + }); + }); + + it('should correctly wrap Functions or throw', function() { + const fn = () => {}; + assertEqual(new Sugar.Function(fn).raw, fn); + assertError(() => { + new Sugar.Function(); + }); + }); + }); describe('Instance Methods', function() { @@ -148,8 +208,8 @@ describe('Chainable', function() { delete Sugar.String.add; }); - it('should not coerce non-primitives', function() { - assertEqual(typeof new Sugar.Number(new Number(1)).valueOf(), 'object'); + it('should coerce non-primitives', function() { + assertEqual(new Sugar.Number(new Number(1)).raw, 1); }); }); @@ -235,12 +295,8 @@ describe('Chainable', function() { it('should be equivalent to calling prototype.toString', function() { assertEqual( - new Sugar.Object(null).toString().raw, - Object.prototype.toString.call(null) - ); - assertEqual( - new Sugar.Object(undefined).toString().raw, - Object.prototype.toString.call(undefined) + new Sugar.Object({}).toString().raw, + Object.prototype.toString.call({}) ); }); diff --git a/yarn.lock b/yarn.lock index b38269244..5ea9fccea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3513,10 +3513,10 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -ready-test@^1.0.35: - version "1.0.35" - resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.35.tgz#28c0a3560068e0c0947ba72d29bcf55d804371ef" - integrity sha512-3Yp2p4IJYO1SSjRSbRSKi8pxaNZU2B9itXuMcZ+pgov3Q2gMIks4S6RFPA5uEG5KFAET2vKcjljj9acVxlImrA== +ready-test@^1.0.36: + version "1.0.36" + resolved "https://registry.yarnpkg.com/ready-test/-/ready-test-1.0.36.tgz#f08d27b1d70094b156093ee8077cae97e9c2ce17" + integrity sha512-wGkmF3vzFftct+aXRUtrAZ0iUcY8y2QCH3knmsJ/j/MeA3rf4I/FAEGzmGQuxtia4dQymJTU+nwd4sj8U8XEJQ== dependencies: argv "^0.0.2" chalk "^4.1.0" From 58880b5237a3a2267c9e2e641c90ce0ea83161ea Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Wed, 9 Sep 2020 00:01:03 +0900 Subject: [PATCH 106/191] Allow escaping in RegExp chainable factory. --- src/core/regexp.js | 11 ++++++++--- src/regexp/escape.js | 20 +++++++++++++++++++- src/util/regexp.js | 14 -------------- test/tests/chainable.js | 8 ++++++++ 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/core/regexp.js b/src/core/regexp.js index ec64c9943..ba97bace7 100644 --- a/src/core/regexp.js +++ b/src/core/regexp.js @@ -1,4 +1,6 @@ import { createNamespace } from '../core'; +import { isRegExp } from '../util/typeChecks'; +import { escapeRegExp } from '../util/regexp'; /** * Creates a new wrapped RegExp chainable. @@ -13,11 +15,14 @@ import { createNamespace } from '../core'; * new Sugar.RegExp(/abc/); * **/ -const Namespace = createNamespace('RegExp', (reg) => { - if (!reg) { +const Namespace = createNamespace('RegExp', (arg) => { + if (!arg) { throw new TypeError('RegExp required'); + } else if (!isRegExp(arg)) { + return RegExp(escapeRegExp(String(arg))); + } else { + return arg; } - return reg; }); export const { diff --git a/src/regexp/escape.js b/src/regexp/escape.js index f835b745f..4fec89e95 100644 --- a/src/regexp/escape.js +++ b/src/regexp/escape.js @@ -1 +1,19 @@ -export { escapeRegExp as default } from '../util/regexp'; +import { escapeRegExp } from '../util/regexp'; + +/** + * Escapes all RegExp tokens in a string. + * + * @param {string} str - The string to escape. + * + * @example + * + * RegExp.escape('really?') -> 'really\?' + * RegExp.escape('yes.') -> 'yes\.' + * RegExp.escape('(not really)') -> '\(not really\)' + * + * @param {string} str + * + **/ +export default function escape(str) { + return escapeRegExp(str); +} diff --git a/src/util/regexp.js b/src/util/regexp.js index f04cae611..7bc704e5f 100644 --- a/src/util/regexp.js +++ b/src/util/regexp.js @@ -2,20 +2,6 @@ import { isString } from './typeChecks'; const ESCAPE_REG = /([\\/'*+?|()[\]{}.^$-])/g; -/** - * Escapes all RegExp tokens in a string. - * - * @param {string} str - The string to escape. - * - * @example - * - * RegExp.escape('really?') -> 'really\?' - * RegExp.escape('yes.') -> 'yes\.' - * RegExp.escape('(not really)') -> '\(not really\)' - * - * @param {string} str - * - **/ export function escapeRegExp(str) { if (!isString(str)) { str = String(str); diff --git a/test/tests/chainable.js b/test/tests/chainable.js index 7db6ba775..40208f1b9 100644 --- a/test/tests/chainable.js +++ b/test/tests/chainable.js @@ -66,9 +66,17 @@ describe('Chainable', function() { it('should correctly construct regexes', function() { assertRegExpEqual(new Sugar.RegExp(/abc/).raw, /abc/); + assertRegExpEqual(new Sugar.RegExp(5).raw, /5/); + assertRegExpEqual(new Sugar.RegExp('?').raw, /\?/); assertError(() => { new Sugar.RegExp(); }); + assertError(() => { + new Sugar.RegExp(null); + }); + assertError(() => { + new Sugar.RegExp(undefined); + }); }); it('should correctly wrap Functions or throw', function() { From ec53426f7238dfd584c3298a7a153db449e32718 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 10 Sep 2020 14:42:58 +0900 Subject: [PATCH 107/191] searchFn -> matchFn in docs and ensure @callback --- src/array/count.js | 8 +++++++- src/array/every.js | 8 +++++++- src/array/exclude.js | 4 ++-- src/array/filter.js | 4 ++-- src/array/find.js | 4 ++-- src/array/findIndex.js | 4 ++-- src/array/none.js | 8 +++++++- src/array/remove.js | 4 ++-- src/array/some.js | 8 +++++++- src/object/count.js | 8 +++++++- src/object/every.js | 8 +++++++- src/object/findKey.js | 8 +++++++- src/object/none.js | 8 +++++++- src/object/rejectValues.js | 8 +++++++- src/object/removeValues.js | 8 +++++++- src/object/selectValues.js | 8 +++++++- src/object/some.js | 8 +++++++- 17 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/array/count.js b/src/array/count.js index 6c07b71c3..ccda7611a 100644 --- a/src/array/count.js +++ b/src/array/count.js @@ -5,7 +5,7 @@ import { assertArray } from '../util/assertions'; * Counts elements in the array. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to determine elements that will be + * @param {any|matchFn} match - A matcher to determine elements that will be * counted. When a function is passed a truthy return value will match the * element. Primitives will directly match elements. Can also be a Date object * to match dates, a RegExp which will test against strings, or a plain object @@ -16,6 +16,12 @@ import { assertArray } from '../util/assertions'; * * @returns {number} * + * @callback matchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * * @example * * ['a','b','a'].count('a') -> 2 diff --git a/src/array/every.js b/src/array/every.js index 177760451..2b132da88 100644 --- a/src/array/every.js +++ b/src/array/every.js @@ -7,7 +7,7 @@ const nativeFn = Array.prototype.every; * Returns true if every element in the array matches input. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to determine elements that will be + * @param {any|matchFn} match - A matcher to determine elements that will be * checked. When a function is passed a truthy return value will match the * element. Primitives will directly match elements. Can also be a Date object * to match dates, a RegExp which will test against strings, or a plain object @@ -16,6 +16,12 @@ const nativeFn = Array.prototype.every; * * @returns {boolean} * + * @callback matchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * * @example * * ['a','b','c'].every('a') -> false diff --git a/src/array/exclude.js b/src/array/exclude.js index 6d524f9de..66fdcb3cd 100644 --- a/src/array/exclude.js +++ b/src/array/exclude.js @@ -9,7 +9,7 @@ import { assertArray } from '../util/assertions'; * array in place. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to find the elements to exclude. When a + * @param {any|matchFn} match - A matcher to find the elements to exclude. When a * function is passed a truthy return value will match the element. Primitives * will directly match elements. Can also be a Date object to match dates, a * RegExp which will test against strings, or a plain object which will perform @@ -20,7 +20,7 @@ import { assertArray } from '../util/assertions'; * * @returns {Array} * - * @callback searchFn + * @callback matchFn * * el The element of the current iteration. * i The index of the current iteration. diff --git a/src/array/filter.js b/src/array/filter.js index 6cb12e934..79fe4189d 100644 --- a/src/array/filter.js +++ b/src/array/filter.js @@ -7,7 +7,7 @@ const nativeFn = Array.prototype.filter; * Returns a new array with matched elements. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to find the elements to include. When a + * @param {any|matchFn} match - A matcher to find the elements to include. When a * function is passed a truthy return value will match the element. Primitives * will directly match elements. Can also be a Date object to match dates, a * RegExp which will test against strings, or a plain object which will perform @@ -18,7 +18,7 @@ const nativeFn = Array.prototype.filter; * * @returns {Array} * - * @callback searchFn + * @callback matchFn * * el The element of the current iteration. * i The index of the current iteration. diff --git a/src/array/find.js b/src/array/find.js index 648993dea..01e573c5f 100644 --- a/src/array/find.js +++ b/src/array/find.js @@ -6,7 +6,7 @@ import { forEachSparse } from '../util/array'; * Returns the first element in the array that matches input. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to find the elements to include. When a + * @param {any|matchFn} match - A matcher to find the elements to include. When a * function is passed a truthy return value will match the element. Primitives * will directly match elements. Can also be a Date object to match dates, a * RegExp which will test against strings, or a plain object which will perform @@ -17,7 +17,7 @@ import { forEachSparse } from '../util/array'; * * @returns {any} * - * @callback searchFn + * @callback matchFn * * el The element of the current iteration. * i The index of the current iteration. diff --git a/src/array/findIndex.js b/src/array/findIndex.js index 6c731af7c..f5e5a05b8 100644 --- a/src/array/findIndex.js +++ b/src/array/findIndex.js @@ -6,7 +6,7 @@ import { forEachSparse } from '../util/array'; * Returns the index of the first element in the array that matches input. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to find the elements to include. When a + * @param {any|matchFn} match - A matcher to find the elements to include. When a * function is passed a truthy return value will match the element. Primitives * will directly match elements. Can also be a Date object to match dates, a * RegExp which will test against strings, or a plain object which will perform @@ -17,7 +17,7 @@ import { forEachSparse } from '../util/array'; * * @returns {number} * - * @callback searchFn + * @callback matchFn * * el The element of the current iteration. * i The index of the current iteration. diff --git a/src/array/none.js b/src/array/none.js index b655e5a73..0859aacf9 100644 --- a/src/array/none.js +++ b/src/array/none.js @@ -4,7 +4,7 @@ import some from './some'; * Returns true if no elements in the array match input. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to determine elements that will be + * @param {any|matchFn} match - A matcher to determine elements that will be * checked. When a function is passed a truthy return value will match the * element. Primitives will directly match elements. Can also be a Date object * to match dates, a RegExp which will test against strings, or a plain object @@ -13,6 +13,12 @@ import some from './some'; * * @returns {boolean} * + * @callback matchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * * @example * * ['a','b','c'].none('a') -> false diff --git a/src/array/remove.js b/src/array/remove.js index 183e628f9..17bd922cd 100644 --- a/src/array/remove.js +++ b/src/array/remove.js @@ -8,7 +8,7 @@ import { assertArray } from '../util/assertions'; * non-destructive alias. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to find the elements to remove. When + * @param {any|matchFn} match - A matcher to find the elements to remove. When * a function is passed a truthy return value will match the element. Primitives * will directly match elements. Can also be a Date object to match dates, a * RegExp which will test against strings, or a plain object which will perform @@ -19,7 +19,7 @@ import { assertArray } from '../util/assertions'; * * @returns {Array} * - * @callback searchFn + * @callback matchFn * * el The element of the current iteration. * i The index of the current iteration. diff --git a/src/array/some.js b/src/array/some.js index 069b0560c..6dd26ac43 100644 --- a/src/array/some.js +++ b/src/array/some.js @@ -7,7 +7,7 @@ const nativeFn = Array.prototype.some; * Returns true if any element in the array matches input. * * @param {Array} arr - The array. - * @param {any|searchFn} match - A matcher to determine how elements are + * @param {any|matchFn} match - A matcher to determine how elements are * checked. When a function is passed a truthy return value will match the * element. Primitives will directly match elements. Can also be a Date object * to match dates, a RegExp which will test against strings, or a plain object @@ -18,6 +18,12 @@ const nativeFn = Array.prototype.some; * * @returns {boolean} * + * @callback matchFn + * + * el The element of the current iteration. + * i The index of the current iteration. + * arr A reference to the array. + * * @example * * ['a','b','c'].some('a') -> true diff --git a/src/object/count.js b/src/object/count.js index 04360aca5..9c44b358e 100644 --- a/src/object/count.js +++ b/src/object/count.js @@ -6,7 +6,7 @@ import { getMatcher } from '../util/matchers'; * Counts properties in the object matching input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are counted. + * @param {any|matchFn} match - A matcher to determine how values are counted. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -15,6 +15,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.count({a:1,b:2}, 1) -> 1 diff --git a/src/object/every.js b/src/object/every.js index 583fa50ec..58abd4a84 100644 --- a/src/object/every.js +++ b/src/object/every.js @@ -6,7 +6,7 @@ import { getMatcher } from '../util/matchers'; * Returns true if all values in the object match input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -15,6 +15,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {boolean} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.every({a:1,b:2}, 1) -> false diff --git a/src/object/findKey.js b/src/object/findKey.js index c91b25fab..6ea8ed98a 100644 --- a/src/object/findKey.js +++ b/src/object/findKey.js @@ -6,7 +6,7 @@ import { getMatcher } from '../util/matchers'; * Returns the first key whose value matches input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -15,6 +15,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {string|undefined} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.findKey({a:1,b:2}, 1) -> 'a' diff --git a/src/object/none.js b/src/object/none.js index 81b337342..cd862a5e9 100644 --- a/src/object/none.js +++ b/src/object/none.js @@ -5,7 +5,7 @@ import some from './some'; * Returns true if no value in the object matches input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -14,6 +14,12 @@ import some from './some'; * * @returns {boolean} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.none({a:1,b:2}, 1) -> false diff --git a/src/object/rejectValues.js b/src/object/rejectValues.js index 0721bb7fd..86a3800f5 100644 --- a/src/object/rejectValues.js +++ b/src/object/rejectValues.js @@ -6,7 +6,7 @@ import { getMatcher } from '../util/matchers'; * Returns a new object without properties matching input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -15,6 +15,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.rejectValues({a:1,b:2}, 1) -> {b:2} diff --git a/src/object/removeValues.js b/src/object/removeValues.js index 73422b3ee..b956d1a2f 100644 --- a/src/object/removeValues.js +++ b/src/object/removeValues.js @@ -9,7 +9,7 @@ import { getMatcher } from '../util/matchers'; * `excludeValues`. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -18,6 +18,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.removeValues({a:1,b:2}, 1) -> {b:2} diff --git a/src/object/selectValues.js b/src/object/selectValues.js index 29cd3b45e..73d33a315 100644 --- a/src/object/selectValues.js +++ b/src/object/selectValues.js @@ -6,7 +6,7 @@ import { getMatcher } from '../util/matchers'; * Returns a new object with properties matching input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -15,6 +15,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.selectValues({a:1,b:2}, 1) -> {a:1} diff --git a/src/object/some.js b/src/object/some.js index 14acd50fb..f64821fc2 100644 --- a/src/object/some.js +++ b/src/object/some.js @@ -6,7 +6,7 @@ import { getMatcher } from '../util/matchers'; * Returns true if any value in the object matches input. * * @param {Object} obj - The object. - * @param {any|searchFn} match - A matcher to determine how values are checked. + * @param {any|matchFn} match - A matcher to determine how values are checked. * When a function is passed a truthy return value will match. Primitives will * directly match values. Can also be a Date object to match dates, a RegExp * which will test against strings, or a plain object which will perform a @@ -15,6 +15,12 @@ import { getMatcher } from '../util/matchers'; * * @returns {boolean} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.some({a:1,b:2}, 1) -> true From a36c900e69c953da3f3b7931ee7bd4b9b28c2b50 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 10 Sep 2020 15:00:20 +0900 Subject: [PATCH 108/191] Allow function matcher in Object.selectKeys/removeKeys/rejectKeys. --- src/object/rejectKeys.js | 17 +++++++---- src/object/removeKeys.js | 17 +++++++---- src/object/removeValues.js | 1 - src/object/selectKeys.js | 17 +++++++---- src/util/keys.js | 39 ++++++++++++++++++------- test/tests/object.js | 60 ++++++++++++++++++++++++++++++++------ 6 files changed, 115 insertions(+), 36 deletions(-) diff --git a/src/object/rejectKeys.js b/src/object/rejectKeys.js index db9e9c338..dd51fb7a9 100644 --- a/src/object/rejectKeys.js +++ b/src/object/rejectKeys.js @@ -6,11 +6,18 @@ import { forEachProperty } from '../util/helpers'; * Returns a new object with keys not matching input. * * @param {Object} obj - The object. - * @param {...string|RegExp|Array} - The keys to be rejected. May be an array - * or a regex to test keys. + * @param {string|matchFn|RegExp|Array} match - The key(s) to be + * rejected. May be an array or a regex to test keys. When a function is + * passed a truthy return value will match. * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.rejectKeys({a:1,b:2}, 'a') -> {b:2} @@ -18,12 +25,12 @@ import { forEachProperty } from '../util/helpers'; * Object.rejectKeys({a:1,b:1}, ['a', 'b']) -> {} * **/ -export default function rejectKeys(obj, ...args) { +export default function rejectKeys(obj, match) { assertObject(obj); const result = {}; - const matcher = getKeyMatcher(args); + const matcher = getKeyMatcher(match); forEachProperty(obj, (key, val) => { - if (!matcher(key, obj)) { + if (!matcher(key, obj[key], obj)) { result[key] = val; } }); diff --git a/src/object/removeKeys.js b/src/object/removeKeys.js index ddb7e106c..c2ab849f3 100644 --- a/src/object/removeKeys.js +++ b/src/object/removeKeys.js @@ -9,11 +9,18 @@ import { forEachProperty } from '../util/helpers'; * `exclude`. * * @param {Object} obj - The object. - * @param {...string|RegExp|Array} - The keys to be removed. May be an array - * or a regex to test keys. + * @param {string|matchFn|RegExp|Array} match - The key(s) to be + * removed. May be an array or a regex to test keys. When a function is + * passed a truthy return value will match. * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.removeKeys({a:1,b:2}, 'a') -> {b:2} @@ -21,11 +28,11 @@ import { forEachProperty } from '../util/helpers'; * Object.removeKeys({a:1,b:1}, ['a', 'b']) -> {} * **/ -export default function removeKeys(obj, ...args) { +export default function removeKeys(obj, match) { assertObject(obj); - const matcher = getKeyMatcher(args); + const matcher = getKeyMatcher(match); forEachProperty(obj, (key) => { - if (matcher(key, obj)) { + if (matcher(key, obj[key], obj)) { delete obj[key]; } }); diff --git a/src/object/removeValues.js b/src/object/removeValues.js index b956d1a2f..bc1f04e0b 100644 --- a/src/object/removeValues.js +++ b/src/object/removeValues.js @@ -47,4 +47,3 @@ export default function removeValues(obj, match) { }); return obj; } - diff --git a/src/object/selectKeys.js b/src/object/selectKeys.js index 76caace0a..6175e3042 100644 --- a/src/object/selectKeys.js +++ b/src/object/selectKeys.js @@ -6,11 +6,18 @@ import { forEachProperty } from '../util/helpers'; * Returns a new object with keys matching input. * * @param {Object} obj - The object. - * @param {...string|RegExp|Array} - The keys to be selected. May be an array - * or a regex to test keys. + * @param {string|matchFn|RegExp|Array} match - The key(s) to be + * selected. May be an array or a regex to test keys. When a function is + * passed a truthy return value will match. * * @returns {Object} * + * @callback matchFn + * + * key The key of the current entry. + * val The value of the current entry. + * obj A reference to the object. + * * @example * * Object.selectKeys({a:1,b:2}, 'a') -> {a:1} @@ -18,12 +25,12 @@ import { forEachProperty } from '../util/helpers'; * Object.selectKeys({a:1,b:1}, ['a', 'b']) -> {a:1,b:2} * **/ -export default function selectKeys(obj, ...args) { +export default function selectKeys(obj, match) { assertObject(obj); const result = {}; - const matcher = getKeyMatcher(args); + const matcher = getKeyMatcher(match); forEachProperty(obj, (key, val) => { - if (matcher(key, obj)) { + if (matcher(key, obj[key], obj)) { result[key] = val; } }); diff --git a/src/util/keys.js b/src/util/keys.js index 3f744e075..77822bbf0 100644 --- a/src/util/keys.js +++ b/src/util/keys.js @@ -1,14 +1,31 @@ -import { isRegExp } from './typeChecks'; +import { isArray, isFunction, isRegExp } from './typeChecks'; -export function getKeyMatcher(args) { - args = args.flat(); +export function getKeyMatcher(arg) { + if (isFunction(arg)) { + return arg; + } else if (isArray(arg)) { + return getArrayMatcher(arg); + } else if (isRegExp(arg)) { + return getRegExpMatcher(arg); + } else { + return getDefaultMatcher(arg); + } +} + +function getArrayMatcher(arr) { + return (key) => { + return arr.includes(key); + } +} + +function getRegExpMatcher(reg) { + return (key) => { + return reg.test(key); + } +} + +function getDefaultMatcher(arg) { return (key) => { - return args.some((arg) => { - if (isRegExp(arg)) { - return arg.test(key); - } else { - return arg == key; - } - }); - }; + return key === arg; + } } diff --git a/test/tests/object.js b/test/tests/object.js index 55615a15d..7bd29893d 100644 --- a/test/tests/object.js +++ b/test/tests/object.js @@ -837,11 +837,11 @@ namespace('Object', function () { describeInstance('select,selectKeys', function(selectKeys) { - it('should select by enumerated arguments', function() { + it('should select by string argument', function() { assertObjectEqual(selectKeys({a:1,b:2}, 'a'), {a:1}); - assertObjectEqual(selectKeys({a:1,b:2}, 'a', 'b'), {a:1,b:2}); - assertObjectEqual(selectKeys({a:1,b:2}), {}); + assertObjectEqual(selectKeys({a:1,b:2}, 'b'), {b:2}); assertObjectEqual(selectKeys({a:1,b:2}, 'c'), {}); + assertObjectEqual(selectKeys({a:1,b:2}, ''), {}); }); it('should select by array argument', function() { @@ -851,6 +851,20 @@ namespace('Object', function () { assertObjectEqual(selectKeys({a:1,b:2}, ['c']), {}); }); + it('should select by function', function() { + assertObjectEqual(selectKeys({a:1,b:2}, (key) => key === 'a'), {a:1}); + assertObjectEqual(selectKeys({a:1,b:2}, (key) => key === 'b'), {b:2}); + assertObjectEqual(selectKeys({a:1,b:2}, (key) => key === 'c'), {}); + }); + + it('should pass correct arguments', function() { + selectKeys({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + it('should select by regex', function() { assertObjectEqual(selectKeys({a:1,b:2}, /a/), {a:1}); assertObjectEqual(selectKeys({a:1,b:2}, /[ab]/), {a:1,b:2}); @@ -875,11 +889,11 @@ namespace('Object', function () { describeInstance('reject,rejectKeys', function(rejectKeys) { - it('should reject by enumerated arguments', function() { + it('should reject by string argument', function() { assertObjectEqual(rejectKeys({a:1,b:2}, 'a'), {b:2}); - assertObjectEqual(rejectKeys({a:1,b:2}, 'a', 'b'), {}); - assertObjectEqual(rejectKeys({a:1,b:2}), {a:1,b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, 'b'), {a:1}); assertObjectEqual(rejectKeys({a:1,b:2}, 'c'), {a:1,b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, ''), {a:1,b:2}); }); it('should reject by array argument', function() { @@ -889,6 +903,20 @@ namespace('Object', function () { assertObjectEqual(rejectKeys({a:1,b:2}, ['c']), {a:1,b:2}); }); + it('should reject by function', function() { + assertObjectEqual(rejectKeys({a:1,b:2}, (key) => key === 'a'), {b:2}); + assertObjectEqual(rejectKeys({a:1,b:2}, (key) => key === 'b'), {a:1}); + assertObjectEqual(rejectKeys({a:1,b:2}, (key) => key === 'c'), {a:1,b:2}); + }); + + it('should pass correct arguments', function() { + rejectKeys({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + it('should reject by regex', function() { assertObjectEqual(rejectKeys({a:1,b:2}, /a/), {b:2}); assertObjectEqual(rejectKeys({a:1,b:2}, /[ab]/), {}); @@ -913,11 +941,11 @@ namespace('Object', function () { describeInstance('remove,removeKeys', function(removeKeys) { - it('should remove by enumerated arguments', function() { + it('should remove by string argument', function() { assertObjectEqual(removeKeys({a:1,b:2}, 'a'), {b:2}); - assertObjectEqual(removeKeys({a:1,b:2}, 'a', 'b'), {}); - assertObjectEqual(removeKeys({a:1,b:2}), {a:1,b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, 'b'), {a:1}); assertObjectEqual(removeKeys({a:1,b:2}, 'c'), {a:1,b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, ''), {a:1,b:2}); }); it('should remove by array argument', function() { @@ -927,6 +955,20 @@ namespace('Object', function () { assertObjectEqual(removeKeys({a:1,b:2}, ['c']), {a:1,b:2}); }); + it('should remove by function', function() { + assertObjectEqual(removeKeys({a:1,b:2}, (key) => key === 'a'), {b:2}); + assertObjectEqual(removeKeys({a:1,b:2}, (key) => key === 'b'), {a:1}); + assertObjectEqual(removeKeys({a:1,b:2}, (key) => key === 'c'), {a:1,b:2}); + }); + + it('should pass correct arguments', function() { + removeKeys({a:1}, function (key, val, obj) { + assertEqual(key, 'a'); + assertEqual(val, 1); + assertObjectEqual(obj, {a:1}); + }); + }); + it('should remove by regex', function() { assertObjectEqual(removeKeys({a:1,b:2}, /a/), {b:2}); assertObjectEqual(removeKeys({a:1,b:2}, /[ab]/), {}); From 6eb8fdaca772ff43c393f24ec4a3a74b7de4d50b Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Thu, 10 Sep 2020 15:02:44 +0900 Subject: [PATCH 109/191] Removed Object.subtract --- CHANGELOG.md | 4 +++- test/OLD/tests/object.js | 24 ------------------------ 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5207a143..ecfeac8d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -107,7 +107,9 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `all` flag from `Array#compact`. Use `Array#filter` here instead. - Removed `Array#flatten`. Use native `Array#flat` here instead. - Removed `Array.create`. Use native `Array.from` here instead. - +- Removed `Object.subtract`. For simple removal of keys use + `Object.reject(obj1, Object.keys(obj2)`. Otherwise use a matcher function + with `Object.reject` to reject if both keys and values match. TODO: diff --git a/test/OLD/tests/object.js b/test/OLD/tests/object.js index 514d4d28d..23fcb8334 100644 --- a/test/OLD/tests/object.js +++ b/test/OLD/tests/object.js @@ -2052,28 +2052,4 @@ namespace('Object', function () { test(Object, [null, {foo:'bar'}], {}, 'object on null produces empty'); }); - method('subtract', function() { - test({foo:'bar',moo:'car'}, [{foo:'bar',moo:'mar'}], {moo:'car'}, 'One key'); - test({foo:'bar',moo:'car'}, [{foo:'bar',moo:'car'}], {}, 'Both keys'); - test({foo:'bar',moo:'car'}, [{foo:'zar',moo:'zar'}], {foo:'bar',moo:'car'}, 'No keys'); - test({a:{foo:'bar'}}, [{a:{foo:'bar'}}], {}, 'Deep object matches'); - test({a:{foo:'bar'}}, [{a:{}}], {a:{foo:'bar'}}, 'Empty deep object does not match'); - test({a:{foo:'bar'}}, [{a:{foo:'bar',moo:'car'}}], {a:{foo:'bar'}}, 'Deep object with extra does not match'); - test({}, [{}], {}, 'Two empty produce empty'); - test({foo:'bar',moo:'car'}, [], {foo:'bar',moo:'car'}, 'No arguments produces original'); - test(Object, [null, {foo:'bar'}], null, 'object on null produces null'); - - if (canTestPrimitiveScope) { - test('foo', [], 'foo', 'no argument on primitive produces original'); - test('foo', ['str'], 'foo', 'primitive on primitive produces original'); - test('foo', [null], 'foo', 'null on primitive produces original'); - test('foo', [undefined], 'foo', 'undefined on primitive produces original'); - test('foo', [{foo:'bar'}], 'foo', 'object on primitive produces empty'); - } - - var obj = {foo:'bar'}; - var result = run(obj, 'subtract', []); - equal(result === obj, false, 'No arguments still produces new object'); - }); - }); From 8226473b04a88f5579e0cd82e59f901508aa5c56 Mon Sep 17 00:00:00 2001 From: Andrew Plummer Date: Sat, 12 Sep 2020 02:07:57 +0900 Subject: [PATCH 110/191] Added Object#merge/intersect/subtract --- CHANGELOG.md | 13 + package.json | 2 +- src/object/define.js | 3 + src/object/intersect.js | 46 +++ src/object/merge.js | 77 +++++ src/object/methods.js | 3 + src/object/rejectKeys.js | 3 + src/object/rejectValues.js | 2 +- src/object/removeKeys.js | 3 + src/object/removeValues.js | 2 +- src/object/selectKeys.js | 3 + src/object/selectValues.js | 2 +- src/object/subtract.js | 29 ++ src/util/equality.js | 18 +- src/util/helpers.js | 34 ++- src/util/object.js | 101 ++++--- test/.eslintrc | 1 + test/OLD/tests/object.js | 567 ------------------------------------- test/tests/array.js | 25 +- test/tests/object.js | 448 ++++++++++++++++++++++++++++- yarn.lock | 8 +- 21 files changed, 732 insertions(+), 658 deletions(-) create mode 100644 src/object/intersect.js create mode 100644 src/object/merge.js create mode 100644 src/object/subtract.js diff --git a/CHANGELOG.md b/CHANGELOG.md index ecfeac8d8..fa973abf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -110,6 +110,19 @@ call `Function#lock` first in the chain to achieve the same effect. - Removed `Object.subtract`. For simple removal of keys use `Object.reject(obj1, Object.keys(obj2)`. Otherwise use a matcher function with `Object.reject` to reject if both keys and values match. +- Changed `Object.merge` to no longer accept an options object. Deep merging is + now the default. Use `Object.assign` or spread syntax for a shallow merge. + The `resolve` option is now the third argument to `Object.merge` and must be + a function (no longer accepts a boolean argument). Returning `undefined` in + this function will now continue the merge as normal instead of aborting. + `hidden` and `descriptor` options are no longer supported. +- Changed `Object.merge` to no longer accept non-object arguments. An error + will be thrown here instead. +- Changed `Object.merge` to no longer treat undefined as a special value. If any + property exists in the source object (the second argument to merge) it will + always override the target. +- Changed `Object.merge` to no longer merge arrays. Use a resolve function here + to handle this on a per-case basis. TODO: diff --git a/package.json b/package.json index aafd8c46f..3542e9d74 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "eslint": "^7.4.0", "esm": "^3.2.25", "jsdoc": "^3.6.4", - "ready-test": "^1.0.36", + "ready-test": "^1.0.38", "sinon": "^9.0.2", "string-replace-loader": "^2.2.0", "webpack": "^4.41.0", diff --git a/src/object/define.js b/src/object/define.js index 9cbf61ec8..2b0842782 100644 --- a/src/object/define.js +++ b/src/object/define.js @@ -6,11 +6,13 @@ defineInstance('count', methods.count); defineInstance('every', methods.every); defineInstance('findKey', methods.findKey); defineInstance('forEach', methods.forEach); +defineInstance('intersect', methods.intersect); defineInstance('isEmpty', methods.isEmpty); defineInstance('isEqual', methods.isEqual); defineInstance('mapKeys', methods.mapKeys); defineInstance('mapValues', methods.mapValues); defineInstance('median', methods.median); +defineInstance('merge', methods.merge); defineInstance('maxKey', methods.maxKey); defineInstance('maxKeys', methods.maxKeys); defineInstance('minKey', methods.minKey); @@ -26,6 +28,7 @@ defineInstance('removeValues', methods.removeValues); defineInstance('select', methods.select); defineInstance('selectKeys', methods.selectKeys); defineInstance('selectValues', methods.selectValues); +defineInstance('subtract', methods.subtract); defineInstance('size', methods.size); defineInstance('some', methods.some); defineInstance('sum', methods.sum); diff --git a/src/object/intersect.js b/src/object/intersect.js new file mode 100644 index 000000000..7950abc47 --- /dev/null +++ b/src/object/intersect.js @@ -0,0 +1,46 @@ +import { assertObject } from '../util/assertions'; +import { hasOwnProperty, forEachProperty } from '../util/helpers'; + +/** + * Returns a new object with only properties that both objects have in common. + * + * @param {Object} obj1 - The first object. + * @param {Object} obj2 - The second object. + * @param {resolverFn} [resolver] - A function to determine the value when an + * intersection occurs. If this is not provided will take the value of the + * second object. + * + * @returns {Object} + * + * @callback resolverFn + * + * key The key of the current entry. + * val1 The value in `obj1` for the current entry. + * val2 The value in `obj2` for the current entry. + * obj1 A reference to `obj1`. + * obj2 A reference to `obj2`. + * + * @example + * + * Object.intersect({a:1}, {a:1,b:2}) -> {a:1} + * Object.intersect({a:1}, {a:2}) -> {a:1} + * Object.intersect({a:1}, {a:2}, (key, n1, n2) => n1 + n2) -> {a:3} + * + **/ +export default function intersect(obj1, obj2, resolver) { + assertObject(obj1); + assertObject(obj2); + const result = {}; + forEachProperty(obj1, (key) => { + if (hasOwnProperty(obj2, key)) { + let val; + if (resolver) { + val = resolver(key, obj1[key], obj2[key], obj1, obj2); + } else { + val = obj2[key]; + } + result[key] = val; + } + }); + return result; +} diff --git a/src/object/merge.js b/src/object/merge.js new file mode 100644 index 000000000..85d99e6e2 --- /dev/null +++ b/src/object/merge.js @@ -0,0 +1,77 @@ +import { isPlainObject, assertPlainObject, iterateWithCyclicCheck } from '../util/object'; +import { isFunction } from '../util/typeChecks'; +import { hasOwnProperty } from '../util/helpers'; + +/** + * Performs a deep merge of properties from source object(s) into a target + * object. + * + * @extra This method will modify the object! Use `add` for a non-destructive + * alias. Inherited and non-enumerable properties will not be merged. + * Enumerable getters will be merged by value only. An error will be thrown + * if either argument is not a "plain" object, created by either bracket + * syntax or `Object.create`. Cyclic objects will throw a TypeError. + * + * @param {Object} target - The target object. + * @param {...Object} - Sources are enumerated as arguments here. + * @param {resolverFn} [resolver] - A function to determine the value when a + * collision occurs. If `undefined` is returned, the merge will be handled + * normally. If this function is not provided, will take the value of the + * source object or deeply merge in the case of plain objects. Must be passed + * as the last argument. + * + * @returns {Object} + * + * @callback resolverFn + * + * key The key of the current entry. + * tVal The value in `target` for the current entry. + * sVal The value in `source` for the current entry. + * target A reference to the target object. + * source A reference to the source object. + * + * @example + * + * Object.merge({a:1}, {a:1,b:2}) -> {a:1,b:2} + * Object.merge({a:1,b:2}, {a:2}) -> {a:1,b:2} + * Object.merge({a:1,b:2}, {a:2}, (key, n1, n2) => n1 + n2) -> {a:3,b:2} + * + **/ +export default function merge(target, ...args) { + assertPlainObject(target); + let sources; + let resolver; + if (isFunction(args[args.length - 1])) { + sources = args.slice(0, -1); + resolver = args[args.length - 1]; + } else { + sources = args; + } + for (let source of sources) { + assertPlainObject(source); + mergeDeep(target, source, resolver); + } + return target; +} + +function mergeDeep(target, source, resolver, stack = []) { + iterateWithCyclicCheck(source, stack, (key, sVal, stack) => { + let val; + let tVal = target[key]; + let handled = false; + if (hasOwnProperty(target, key) && resolver) { + val = resolver(key, tVal, sVal, target, source); + if (val !== undefined) { + handled = true; + } + } + if (!handled) { + val = sVal; + if (isPlainObject(tVal) && isPlainObject(val)) { + val = mergeDeep(tVal, val, resolver, stack); + } + } + target[key] = val; + }); + return target; +} diff --git a/src/object/methods.js b/src/object/methods.js index eabfc1a80..61f3fc873 100644 --- a/src/object/methods.js +++ b/src/object/methods.js @@ -3,11 +3,13 @@ export { default as count } from './count'; export { default as every } from './every'; export { default as findKey } from './findKey'; export { default as forEach } from './forEach'; +export { default as intersect } from './intersect'; export { default as isEmpty } from './isEmpty'; export { default as isEqual } from './isEqual'; export { default as mapKeys } from './mapKeys'; export { default as mapValues } from './mapValues'; export { default as median } from './median'; +export { default as merge } from './merge'; export { default as maxKey } from './maxKey'; export { default as maxKeys } from './maxKeys'; export { default as minKey } from './minKey'; @@ -23,6 +25,7 @@ export { default as removeValues } from './removeValues'; export { default as select } from './select'; export { default as selectKeys } from './selectKeys'; export { default as selectValues } from './selectValues'; +export { default as subtract } from './subtract'; export { default as size } from './size'; export { default as some } from './some'; export { default as sum } from './sum'; diff --git a/src/object/rejectKeys.js b/src/object/rejectKeys.js index dd51fb7a9..c74e5506a 100644 --- a/src/object/rejectKeys.js +++ b/src/object/rejectKeys.js @@ -27,6 +27,9 @@ import { forEachProperty } from '../util/helpers'; **/ export default function rejectKeys(obj, match) { assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } const result = {}; const matcher = getKeyMatcher(match); forEachProperty(obj, (key, val) => { diff --git a/src/object/rejectValues.js b/src/object/rejectValues.js index 86a3800f5..ecc87e9eb 100644 --- a/src/object/rejectValues.js +++ b/src/object/rejectValues.js @@ -25,7 +25,7 @@ import { getMatcher } from '../util/matchers'; * * Object.rejectValues({a:1,b:2}, 1) -> {b:2} * Object.rejectValues({a:1,b:1}, 3) -> {a:1,b:1} - * Object.rejectValues({a:'a',b:'b'}, /[a-f]) -> {} + * Object.rejectValues({a:'a',b:'b'}, /[a-f]/) -> {} * Object.rejectValues(usersById, user => { * return user.age > 30; * }); -> an object with all users under 30 diff --git a/src/object/removeKeys.js b/src/object/removeKeys.js index c2ab849f3..55dd36d50 100644 --- a/src/object/removeKeys.js +++ b/src/object/removeKeys.js @@ -30,6 +30,9 @@ import { forEachProperty } from '../util/helpers'; **/ export default function removeKeys(obj, match) { assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } const matcher = getKeyMatcher(match); forEachProperty(obj, (key) => { if (matcher(key, obj[key], obj)) { diff --git a/src/object/removeValues.js b/src/object/removeValues.js index bc1f04e0b..fe36b9cf8 100644 --- a/src/object/removeValues.js +++ b/src/object/removeValues.js @@ -28,7 +28,7 @@ import { getMatcher } from '../util/matchers'; * * Object.removeValues({a:1,b:2}, 1) -> {b:2} * Object.removeValues({a:1,b:1}, 3) -> {a:1,b:1} - * Object.removeValues({a:'a',b:'b'}, /[a-f]) -> {} + * Object.removeValues({a:'a',b:'b'}, /[a-f]/) -> {} * Object.removeValues(usersById, user => { * return user.age > 30; * }); -> an object with all users under 30 diff --git a/src/object/selectKeys.js b/src/object/selectKeys.js index 6175e3042..161c1724c 100644 --- a/src/object/selectKeys.js +++ b/src/object/selectKeys.js @@ -27,6 +27,9 @@ import { forEachProperty } from '../util/helpers'; **/ export default function selectKeys(obj, match) { assertObject(obj); + if (arguments.length === 1) { + throw new Error('Match parameter required'); + } const result = {}; const matcher = getKeyMatcher(match); forEachProperty(obj, (key, val) => { diff --git a/src/object/selectValues.js b/src/object/selectValues.js index 73d33a315..d4858d7d8 100644 --- a/src/object/selectValues.js +++ b/src/object/selectValues.js @@ -25,7 +25,7 @@ import { getMatcher } from '../util/matchers'; * * Object.selectValues({a:1,b:2}, 1) -> {a:1} * Object.selectValues({a:1,b:1}, 3) -> {} - * Object.selectValues({a:'a',b:'b'}, /[a-f]) -> {a:'a',b:'b'} + * Object.selectValues({a:'a',b:'b'}, /[a-f]/) -> {a:'a',b:'b'} * Object.selectValues(usersById, user => { * return user.age > 30; * }); -> an object with all users over 30 diff --git a/src/object/subtract.js b/src/object/subtract.js new file mode 100644 index 000000000..4786516dd --- /dev/null +++ b/src/object/subtract.js @@ -0,0 +1,29 @@ +import { assertObject } from '../util/assertions'; +import { hasOwnProperty } from '../util/helpers'; +import { isEqual } from '../util/equality'; +import rejectKeys from './rejectKeys'; + +/** + * Returns a new object with properties in the second object removed. + * + * @extra Both keys and values must be equal for the property to be removed. + * Values will be tested for deep equality. + * + * @param {Object} obj1 - The first object. + * @param {Object} obj2 - The second object. + * + * @returns {Object} + * + * @example + * + * Object.subtract({a:1,b:2}, {b:2}) -> {a:1} + * Object.subtract({a:1}, {a:2}) -> {a:1} + * + **/ +export default function subtract(obj1, obj2) { + assertObject(obj1); + assertObject(obj2); + return rejectKeys(obj1, (key, val) => { + return hasOwnProperty(obj2, key) && isEqual(val, obj2[key]); + }); +} diff --git a/src/util/equality.js b/src/util/equality.js index 033f1c354..da802f16b 100644 --- a/src/util/equality.js +++ b/src/util/equality.js @@ -47,13 +47,17 @@ function objectIsEqual(a, b, stack) { let count = 0; let propsEqual = true; - iterateWithCyclicCheck(a, false, stack, (key, val, cyc, stack) => { - if (!cyc && (!(key in b) || !isEqual(val, b[key], stack))) { - propsEqual = false; - } - count++; - return propsEqual; - }); + try { + iterateWithCyclicCheck(a, stack, (key, val, stack) => { + if (!(key in b) || !isEqual(val, b[key], stack)) { + propsEqual = false; + } + count++; + return propsEqual; + }); + } catch(err) { + propsEqual = false; + } if (!propsEqual || count !== Object.keys(b).length) { return false; diff --git a/src/util/helpers.js b/src/util/helpers.js index 28766d33a..edaf89c80 100644 --- a/src/util/helpers.js +++ b/src/util/helpers.js @@ -1,5 +1,19 @@ const hasOwn = Object.prototype.hasOwnProperty; +const propertyIsEnumerable = Object.prototype.propertyIsEnumerable; + +// TODO: remove +export function arrayIncludes(arr, el) { + return arr.includes ? arr.includes(el) : arr.indexOf(el) !== -1; +} + +export function isDefined(o) { + return o !== undefined; +} + +export function isUndefined(o) { + return o === undefined; +} export function hasOwnProperty(obj, prop) { return !!obj && hasOwn.call(obj, prop); @@ -8,20 +22,18 @@ export function hasOwnProperty(obj, prop) { export function forEachProperty(obj, fn) { for (let key in obj) { if (!hasOwnProperty(obj, key)) continue; - if (fn.call(obj, key, obj[key], obj) === false) { + if (fn(key, obj[key], obj) === false) { break; } } } -export function arrayIncludes(arr, el) { - return arr.includes ? arr.includes(el) : arr.indexOf(el) !== -1; -} - -export function isDefined(o) { - return o !== undefined; -} - -export function isUndefined(o) { - return o === undefined; +export function forEachSymbol(obj, fn) { + for (let sym of Object.getOwnPropertySymbols(obj)) { + if (propertyIsEnumerable.call(obj, sym)) { + if (fn.call(obj, sym, obj[sym], obj) === false) { + break; + } + } + } } diff --git a/src/util/object.js b/src/util/object.js index bdc121980..3d8e73a74 100644 --- a/src/util/object.js +++ b/src/util/object.js @@ -6,20 +6,23 @@ import { isError, isNaN, } from './typeChecks'; -import { hasOwnProperty, forEachProperty } from './helpers'; +import { hasOwnProperty, forEachProperty, forEachSymbol } from './helpers'; import { isClass, classToString } from './class'; -const objectProto = Object.prototype; - export function isPlainObject(obj, classTag) { return ( - isObject(obj) && - isClass(obj, 'Object', classTag) && - hasValidPlainObjectPrototype(obj) && - hasOwnEnumeratedProperties(obj) + isObject(obj) + && isClass(obj, 'Object', classTag) + && hasValidPlainObjectPrototype(obj) ); } +export function assertPlainObject(obj) { + if (!isPlainObject(obj)) { + throw new TypeError('Plain object required'); + } +} + // A function that will serialize objects holding an array of refs // to distinguish non-serializable objects (class instances, host objects, etc). export function getSerializer() { @@ -41,9 +44,8 @@ export function isSerializable(obj, classTag) { // This method for checking for cyclic structures was egregiously stolen from // the ingenious method by @kitcambridge from the Underscore script: // https://github.com/documentcloud/underscore/issues/240 -export function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { +export function iterateWithCyclicCheck(obj, stack, fn) { function next(key, val) { - let cyc = false; // Allowing a step into the structure before triggering this check to save // cycles on standard JSON structures and also to try as hard as possible to @@ -52,33 +54,19 @@ export function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) { let i = stack.length; while (i--) { if (stack[i] === val) { - cyc = true; + throw new TypeError('Cannot iterate cyclic structure'); } } } stack.push(val); - const ret = fn(key, val, cyc, stack); + const ret = fn(key, val, stack); stack.pop(); return ret; } - function iterateWithSortedKeys() { - // Sorted keys is required for serialization, where object order - // does not matter but stringified order does. - const keys = Object.keys(obj).sort(); - for (let key of keys) { - if (next(key, obj[key]) === false) { - break; - } - } - } - - if (sortedKeys) { - iterateWithSortedKeys(); - } else { - forEachProperty(obj, next); - } + forEachProperty(obj, next); + forEachSymbol(obj, next); } // Serializes an object in a way that will provide a token unique @@ -102,12 +90,7 @@ function serialize(obj, refs = [], stack = []) { let value = ''; if (!isSerializable(obj, className)) { - let index = refs.indexOf(obj); - if (index === -1) { - index = refs.length; - refs.push(obj); - } - return index; + return serializeRef(obj, refs); } else if (isSet(obj) || isMap(obj)) { value = serialize(Array.from(obj), refs, stack); } else if (!isError(obj) && isObject(obj)) { @@ -119,11 +102,40 @@ function serialize(obj, refs = [], stack = []) { } function serializeDeep(obj, refs, stack) { - let result = ''; - iterateWithCyclicCheck(obj, true, stack, (key, val, cyc, stack) => { - result += cyc ? 'CYC' : key + serialize(val, refs, stack); - }); - return result; + try { + // Sorted keys are required for serialization, where object order + // does not matter but stringified order does. Symbols need to be + // serialized first before sorting. + const entries = []; + iterateWithCyclicCheck(obj, stack, (key, val, stack) => { + entries.push([serializeKey(key, refs), serialize(val, refs, stack)]); + }); + entries.sort((a, b) => { + return a[0] < b[0] ? -1 : 1; + }); + return entries.map((entry) => { + return entry.join(':'); + }).join(','); + } catch(err) { + return 'CYC'; + } +} + +function serializeKey(key, refs) { + if (typeof key === 'symbol') { + return 'sym' + serializeRef(key, refs); + } else { + return 'str' + key; + } +} + +function serializeRef(obj, refs) { + let index = refs.indexOf(obj); + if (index === -1) { + index = refs.length; + refs.push(obj); + } + return `ref${index}`; } // Add core types as known so that they can be checked by value below, @@ -175,16 +187,3 @@ function hasValidPlainObjectPrototype(obj) { hasOwnProperty(obj.constructor.prototype, 'isPrototypeOf')) ); } - -function hasOwnEnumeratedProperties(obj) { - // Plain objects are generally defined as having enumerated properties - // all their own, however in early IE environments without defineProperty, - // there may also be enumerated methods in the prototype chain, so check - // for both of these cases. - for (let key in obj) { - if (!hasOwnProperty(obj, key) && obj[key] !== objectProto[key]) { - return false; - } - } - return true; -} diff --git a/test/.eslintrc b/test/.eslintrc index 52ddcf864..ec2492fe3 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -45,6 +45,7 @@ assertUndefined: true, assertDateEqual: true, assertArrayEqual: true, + assertRegExpEqual: true, assertObjectEqual: true, assertInstanceOf: true, withNumberFormatter: true, diff --git a/test/OLD/tests/object.js b/test/OLD/tests/object.js index 23fcb8334..8158a8641 100644 --- a/test/OLD/tests/object.js +++ b/test/OLD/tests/object.js @@ -991,556 +991,6 @@ namespace('Object', function () { test({}, false, 'Object'); }); - method('merge', function() { - - // Basic no-conflict merging - - test({a:'a'}, [{b:'b'}], {a:'a',b:'b'}, 'string'); - test({a:'a'}, [{b:8}], {a:'a',b:8}, 'number'); - test({a:'a'}, [{b:true}], {a:'a',b:true}, 'boolean'); - test({a:'a'}, [{b:null}], {a:'a',b:null}, 'null'); - test({a:'a'}, [{b:undefined}], {a:'a'}, 'undefined will not merge'); - test({a:'a'}, [{b:NaN}], {a:'a',b:NaN}, 'NaN'); - test({a:'a'}, [{b:Infinity}], {a:'a',b:Infinity}, 'NaN'); - - test({a:'a'}, [{b:[1]}], {a:'a',b:[1]}, 'array'); - test({a:'a'}, [{b:{c:'c'}}], {a:'a',b:{c:'c'}}, 'object'); - - test({a:'a'}, ['aha'], {a:'a',0:'a',1:'h',2:'a'}, 'string has enumerated properties'); - test({a:'a'}, [undefined], {a:'a'}, 'undefined has no properties'); - test({a:'a'}, [NaN], {a:'a'}, 'undefined has no properties'); - test({a:'a'}, [null], {a:'a'}, 'null has no properties'); - test({a:'a'}, [8], {a:'a'}, 'number has no properties'); - test({}, [{}], {}, 'empty object has no properties'); - - // Simple merging with known types - - // TODO: Note that this test breaks