diff --git a/.idea/codingdojo.iml b/.idea/codingdojo.iml
new file mode 100644
index 0000000..24643cc
--- /dev/null
+++ b/.idea/codingdojo.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/dictionaries/giovanicascaes.xml b/.idea/dictionaries/giovanicascaes.xml
new file mode 100644
index 0000000..9b5f0cb
--- /dev/null
+++ b/.idea/dictionaries/giovanicascaes.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..97626ba
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..d23208f
--- /dev/null
+++ b/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..5411a1e
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/2016-11-05 - Javascript/index.js b/2016-11-05 - Javascript/index.js
index 1751872..bdabb67 100644
--- a/2016-11-05 - Javascript/index.js
+++ b/2016-11-05 - Javascript/index.js
@@ -1,86 +1,141 @@
-var test = require('tape');
+var unidades = ['', 'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove', 'dez', 'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito', 'dezenove'];
+var dezenas = ['', 'dez', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa'];
+var centenas = ['cem', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seissentos', 'setessentos', 'oitocentos', 'novecentos'];
+var demaisUnidades = [['mil', 'mil'], ['milhão', 'milhões'], ['bilhão', 'bilhões'], ['trilhão', 'trilhões'], ['quatrilhão', 'quatrilhões']];
-var arrayUnidade = ['zero', 'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove', 'dez', 'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito', 'dezenove'];
-var dezena = ['', 'dez', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa'];
+var and = ' e ';
-function capitalizeFirstLetter(string) {
- if (string == undefined || !string) return '';
- return string.charAt(0).toUpperCase() + string.slice(1);
-}
-
-function tratarNumero(valor, tipoNumero) {
- var unidadeMonetaria = '';
- var valorPorExtenso = '';
- var real = false;
- var valorEmInteiro = parseInt(valor);
- if (valorEmInteiro > 0){
- var valorDecimalInt = valorEmInteiro;
- var and = ' e ';
-
- if (tipoNumero == 'real') {
- unidadeMonetaria = valorDecimalInt > 1 ? 'reais' : 'real';
- real = true;
- } else {
- unidadeMonetaria = valorDecimalInt > 1 ? 'centavos' : 'centavo';
- }
+module.exports = {
+ converterValorParaExtenso: function (valor) {
+ var arrayValores = valor.split(',');
- var unidade = arrayUnidade[valorDecimalInt];
-
- if (valorDecimalInt <= 19) {
- valorPorExtenso += unidade;
- } else {
- console.log(valorPorExtenso);
- if(real){
-
- valorPorExtenso += and + dezena[valor.charAt(0)];
- }
- if (valor.charAt(1) != '0') {
- valorPorExtenso += and + arrayUnidade[valor.charAt(1)];
- }
- }
- valorPorExtenso += ' ' + unidadeMonetaria;
- }
- return valorPorExtenso;
-}
+ var reais = arrayValores[0];
+ var centavos = arrayValores[1];
-function tratarReais(reais) {
- return tratarNumero(reais, 'real');
-}
+ var valorPorExtenso = converterReais(reais);
-var converteValorEmExtenso = function(valor) {
- var arrayValores = valor.split(',');
+ if (parseInt(centavos) > 0) {
+ valorPorExtenso += and + converterCentavos(centavos);
+ }
- var valorPorExtenso = '';
+ valorPorExtenso = capitalizeFirstLetter(valorPorExtenso);
- var reais = arrayValores[0];
- var centavos = arrayValores[1];
- var reaisInt = parseInt(reais);
- var centavosInt = parseInt(centavos);
-
- var real = reaisInt > 1 ? 'reais' : 'real';
- var unidade = arrayUnidade[reais];
+ return valorPorExtenso;
+ }
+};
- valorPorExtenso = tratarReais(reais)
- if(centavos != '00') {
- valorPorExtenso += tratarNumero(centavos, 'centavo');
- }
+function converterReais(reais) {
+ return converterNumero(reais, true);
+}
- valorPorExtenso = capitalizeFirstLetter(valorPorExtenso);
-
- return valorPorExtenso;
+function converterCentavos(reais) {
+ return converterNumero(reais, false);
}
-test('testando cheque', function (t) {
+function converterNumero(valor, real) {
+ var valorPorExtenso = '';
+
+ var valorInt = parseInt(valor);
+
+ if (valorInt > 0) {
+ if (valorInt <= 19) {
+ valorPorExtenso += unidades[valorInt];
+ } else if (valorInt <= 99) {
+ var valorIntString = valorInt.toString();
+ valorPorExtenso += dezenas[valorIntString.charAt(0)];
+
+ if (valorIntString.charAt(1) != '0') {
+ valorPorExtenso += and + unidades[valorIntString.charAt(1)];
+ }
+ } else if (valorInt <= 999) {
+ var dezena = valor.substr(1, 2);
+ var dezenaInt = parseInt(dezena);
+
+ if (valor.charAt(0) == '1' && dezenaInt == 0) {
+ valorPorExtenso += centenas[0];
+ } else {
+ valorPorExtenso += centenas[valor.charAt(0)];
+
+ if (dezenaInt > 0) {
+ valorPorExtenso += and + converterNumero(dezena)
+ }
+ }
+ } else {
+ var tamanhoNumero = valor.length;
+ var tamanhoNumeroMod3 = tamanhoNumero % 3;
+
+ var countFirstNumbers = tamanhoNumeroMod3 == 0 ? 3 : tamanhoNumeroMod3;
+ var countUnidades = tamanhoNumeroMod3 == 0 ? Math.floor(tamanhoNumero / 3) - 1 : Math.floor(tamanhoNumero / 3);
+
+ var firstNumbers = valor.substr(0, countFirstNumbers);
+ var lastNumbers = valor.substr(countFirstNumbers);
+ var firstNumbersInt = parseInt(firstNumbers);
+ var lastNumbersInt = parseInt(lastNumbers);
+
+ if (firstNumbersInt > 0) {
+ valorPorExtenso += converterNumero(firstNumbers) + ' ' + demaisUnidades[countUnidades - 1][firstNumbersInt > 1 ? 1 : 0];
+ }
+
+ if (lastNumbersInt > 0) {
+ // Daqui...
+ if (lastNumbersInt <= 99) {
+ valorPorExtenso += and;
+ } else {
+ var verificouZeros = false;
+ var anexarAnd = false;
+
+ for (var i = countUnidades; i > 0; i--) {
+ var unidade = lastNumbers.substr(lastNumbers.length - (i * 3), 3);
+ var unidadeInt = parseInt(unidade);
+
+ if (unidadeInt == 0) {
+ if (!verificouZeros) {
+ lastNumbers = lastNumbers.substr(3);
+ countUnidades--;
+ }
+ } else {
+ verificouZeros = true;
+
+ if (i == 1 && countUnidades > 1) {
+ anexarAnd = false;
+ } else if (unidadeInt < 99 || unidade.substr(1, 2) == '00') {
+ if (!anexarAnd) {
+ anexarAnd = true;
+ } else {
+ anexarAnd = false;
+
+ break;
+ }
+ }
+ }
+ }
+
+ if (anexarAnd) {
+ valorPorExtenso += and;
+ } else {
+ valorPorExtenso += ' ';
+ }
+ }
+ // ...até aqui é só para verificar se deve adicionar o ' e ' ou ' '
+
+ valorPorExtenso += converterNumero(lastNumbers);
+ } else if (countUnidades > 1) {
+ valorPorExtenso += ' de';
+ }
+ }
+
+ if (real != undefined) {
+ if (real) {
+ valorPorExtenso += ' ' + (valorInt > 1 ? 'reais' : 'real');
+ } else {
+ valorPorExtenso += ' ' + (valorInt > 1 ? 'centavos' : 'centavo');
+ }
+ }
+ }
- t.equal(converteValorEmExtenso('1,00'), 'Um real', 'Deveria retornar Um real');
- t.equal(converteValorEmExtenso('2,00'), 'Dois reais', 'Deveria retornar Dois reais');
- t.equal(converteValorEmExtenso('3,00'), 'Três reais', 'Deveria retornar Tres reais');
- t.equal(converteValorEmExtenso('3,40'), 'Três reais e quarenta centavos', 'Deveria retornar Tres reais e quarenta centavos');
- t.equal(converteValorEmExtenso('15,00'), 'Quinze reais', 'Deveria retornar Quinze reais');
- t.equal(converteValorEmExtenso('22,00'), 'Vinte e dois reais', 'Deveria retornar Vinte e dois reais');
- t.equal(converteValorEmExtenso('29,03'), 'Vinte e nove reais e três centavos', 'Deveria retornar Vinte e nove reais e três ');
- t.equal(converteValorEmExtenso('29,33'), 'Vinte e nove reais e trinta e três centavos', 'Deveria retornar Vinte e nove reais e trinta e três ');
-
- t.end();
+ return valorPorExtenso;
+}
-});
\ No newline at end of file
+function capitalizeFirstLetter(string) {
+ return string.charAt(0).toUpperCase() + string.slice(1);
+}
\ No newline at end of file
diff --git a/2016-11-05 - Javascript/test.js b/2016-11-05 - Javascript/test.js
new file mode 100644
index 0000000..aff76fc
--- /dev/null
+++ b/2016-11-05 - Javascript/test.js
@@ -0,0 +1,50 @@
+/**
+ * Created by giovanicascaes on 07/11/16.
+ */
+var test = require('tape');
+var index = require('./index.js');
+
+test('testando cheque', function (t) {
+ t.equal(index.converterValorParaExtenso('1,00'), 'Um real', 'Deve retornar Um real');
+ t.equal(index.converterValorParaExtenso('2,00'), 'Dois reais', 'Deve retornar Dois reais');
+ t.equal(index.converterValorParaExtenso('3,00'), 'Três reais', 'Deve retornar Tres reais');
+ t.equal(index.converterValorParaExtenso('3,40'), 'Três reais e quarenta centavos', 'Deve retornar Tres reais e quarenta centavos');
+ t.equal(index.converterValorParaExtenso('15,00'), 'Quinze reais', 'Deve retornar Quinze reais');
+ t.equal(index.converterValorParaExtenso('22,00'), 'Vinte e dois reais', 'Deve retornar Vinte e dois reais');
+ t.equal(index.converterValorParaExtenso('29,03'), 'Vinte e nove reais e três centavos', 'Deve retornar Vinte e nove reais e três centavos');
+ t.equal(index.converterValorParaExtenso('29,33'), 'Vinte e nove reais e trinta e três centavos', 'Deve retornar Vinte e nove reais e trinta e três centavos');
+ t.equal(index.converterValorParaExtenso('30,30'), 'Trinta reais e trinta centavos', 'Deve retornar Trinta reais e trinta centavos');
+ t.equal(index.converterValorParaExtenso('99,99'), 'Noventa e nove reais e noventa e nove centavos', 'Deve retornar Noventa e nove reais e noventa centavos');
+ t.equal(index.converterValorParaExtenso('100,00'), 'Cem reais', 'Deve retornar Cem reais');
+ t.equal(index.converterValorParaExtenso('101,01'), 'Cento e um reais e um centavo', 'Deve retornar Cento e um reais e um centavo');
+ t.equal(index.converterValorParaExtenso('111,11'), 'Cento e onze reais e onze centavos', 'Deve retornar Cento e onze reais e onze centavos');
+ t.equal(index.converterValorParaExtenso('954,65'), 'Novecentos e cinquenta e quatro reais e sessenta e cinco centavos', 'Deve retornar Novecentos e cinquenta e quatro reais e sessenta e cinco centavos');
+ t.equal(index.converterValorParaExtenso('800,00'), 'Oitocentos reais', 'Deve retornar Oitocentos reais');
+ t.equal(index.converterValorParaExtenso('1000,00'), 'Um mil reais', 'Deve retornar Um mil reais');
+ t.equal(index.converterValorParaExtenso('1050,01'), 'Um mil e cinquenta reais e um centavo', 'Deve retornar Um mil e cinquenta reais e um centavo');
+ t.equal(index.converterValorParaExtenso('167,00'), 'Cento e sessenta e sete reais', 'Deve retornar Cento e sessenta e sete reais');
+ t.equal(index.converterValorParaExtenso('19167,00'), 'Dezenove mil cento e sessenta e sete reais', 'Deve retornar Dezenove mil cento e sessenta e sete reais');
+ t.equal(index.converterValorParaExtenso('1000000001,00'), 'Um bilhão e um reais', 'Deve retornar Um bilhão de reais e um real');
+ t.equal(index.converterValorParaExtenso('1102001020,00'), 'Um bilhão cento e dois milhões um mil e vinte reais', 'Deve retornar Um bilhão cento e dois milhões um mil e vinte reais');
+ t.equal(index.converterValorParaExtenso('1102000000,00'), 'Um bilhão cento e dois milhões de reais', 'Deve retornar Um bilhão cento e dois milhões de reais');
+ t.equal(index.converterValorParaExtenso('2100000000,00'), 'Dois bilhões e cem milhões de reais', 'Deve retornar Dois bilhões e cem milhões de reais');
+ t.equal(index.converterValorParaExtenso('20000020000,00'), 'Vinte bilhões e vinte mil reais', 'Deve retornar Vinte bilhões e vinte mil reais');
+ t.equal(index.converterValorParaExtenso('501000001000000,00'), 'Quinhentos e um trilhões e um milhão de reais', 'Deve retornar Quinhentos e um trilhões e um milhão de reais');
+ t.equal(index.converterValorParaExtenso('999999999999999,99'), 'Novecentos e noventa e nove trilhões novecentos e noventa e nove bilhões novecentos e noventa e nove milhões novecentos e noventa e nove mil novecentos e noventa e nove reais e noventa e nove centavos', 'Deve retornar Novecentos e noventa e nove trilhões novecentos e noventa e nove bilhões novecentos e noventa e nove milhões novecentos e noventa e nove mil novecentos e noventa e nove reais e noventa e nove centavos');
+ t.equal(index.converterValorParaExtenso('501000005000010,00'), 'Quinhentos e um trilhões cinco milhões e dez reais', 'Deve retornar Quinhentos e um trilhões cinco bilhões e dez reais');
+ t.equal(index.converterValorParaExtenso('100000000000,00'), 'Cem bilhões de reais', 'Deve retornar Cem bilhões de reais');
+ t.equal(index.converterValorParaExtenso('20000021000,00'), 'Vinte bilhões e vinte e um mil reais', 'Deve retornar Vinte bilhões e vinte e um mil reais');
+ t.equal(index.converterValorParaExtenso('15008,00'), 'Quinze mil e oito reais', 'Deve retornar Quinze mil e oito reais');
+ t.equal(index.converterValorParaExtenso('1001001,00'), 'Um milhão um mil e um reais', 'Deve retornar Um milhão um mil e um reais');
+ t.equal(index.converterValorParaExtenso('1001000000,00'), 'Um bilhão e um milhão de reais', 'Deve retornar Um bilhão e um milhão de reais');
+ t.equal(index.converterValorParaExtenso('1001000100,00'), 'Um bilhão um milhão e cem reais', 'Deve retornar Um bilhão um milhão e cem reais');
+ t.equal(index.converterValorParaExtenso('1001000101,00'), 'Um bilhão um milhão cento e um reais', 'Deve retornar Um bilhão um milhão e cento e um reais');
+ t.equal(index.converterValorParaExtenso('1000101000,00'), 'Um bilhão cento e um mil reais', 'Deve retornar Um bilhão cento e um mil reais');
+ t.equal(index.converterValorParaExtenso('1000101100,00'), 'Um bilhão cento e um mil e cem reais', 'Deve retornar Um bilhão cento e um mil e cem reais');
+ t.equal(index.converterValorParaExtenso('1000101101,00'), 'Um bilhão cento e um mil cento e um reais', 'Deve retornar Um bilhão cento e um mil cento e um reais');
+ t.equal(index.converterValorParaExtenso('1000000101,00'), 'Um bilhão cento e um reais', 'Deve retornar Um bilhão cento e um reais');
+ t.equal(index.converterValorParaExtenso('1001000000,00'), 'Um bilhão e um milhão de reais', 'Deve retornar Um bilhão e um milhão de reais');
+ t.equal(index.converterValorParaExtenso('1001000001,00'), 'Um bilhão um milhão e um reais', 'Deve retornar Um bilhão um milhão e um reais');
+
+ t.end();
+});
\ No newline at end of file
diff --git a/node_modules/.bin/tape b/node_modules/.bin/tape
new file mode 120000
index 0000000..dc4bc23
--- /dev/null
+++ b/node_modules/.bin/tape
@@ -0,0 +1 @@
+../tape/bin/tape
\ No newline at end of file
diff --git a/node_modules/balanced-match/.npmignore b/node_modules/balanced-match/.npmignore
new file mode 100644
index 0000000..ae5d8c3
--- /dev/null
+++ b/node_modules/balanced-match/.npmignore
@@ -0,0 +1,5 @@
+test
+.gitignore
+.travis.yml
+Makefile
+example.js
diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md
new file mode 100644
index 0000000..2cdc8e4
--- /dev/null
+++ b/node_modules/balanced-match/LICENSE.md
@@ -0,0 +1,21 @@
+(MIT)
+
+Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/balanced-match/README.md b/node_modules/balanced-match/README.md
new file mode 100644
index 0000000..08e918c
--- /dev/null
+++ b/node_modules/balanced-match/README.md
@@ -0,0 +1,91 @@
+# balanced-match
+
+Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well!
+
+[](http://travis-ci.org/juliangruber/balanced-match)
+[](https://www.npmjs.org/package/balanced-match)
+
+[](https://ci.testling.com/juliangruber/balanced-match)
+
+## Example
+
+Get the first matching pair of braces:
+
+```js
+var balanced = require('balanced-match');
+
+console.log(balanced('{', '}', 'pre{in{nested}}post'));
+console.log(balanced('{', '}', 'pre{first}between{second}post'));
+console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post'));
+```
+
+The matches are:
+
+```bash
+$ node example.js
+{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
+{ start: 3,
+ end: 9,
+ pre: 'pre',
+ body: 'first',
+ post: 'between{second}post' }
+{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
+```
+
+## API
+
+### var m = balanced(a, b, str)
+
+For the first non-nested matching pair of `a` and `b` in `str`, return an
+object with those keys:
+
+* **start** the index of the first match of `a`
+* **end** the index of the matching `b`
+* **pre** the preamble, `a` and `b` not included
+* **body** the match, `a` and `b` not included
+* **post** the postscript, `a` and `b` not included
+
+If there's no match, `undefined` will be returned.
+
+If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
+
+### var r = balanced.range(a, b, str)
+
+For the first non-nested matching pair of `a` and `b` in `str`, return an
+array with indexes: `[ , ]`.
+
+If there's no match, `undefined` will be returned.
+
+If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
+
+## Installation
+
+With [npm](https://npmjs.org) do:
+
+```bash
+npm install balanced-match
+```
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/balanced-match/index.js b/node_modules/balanced-match/index.js
new file mode 100644
index 0000000..e8d8587
--- /dev/null
+++ b/node_modules/balanced-match/index.js
@@ -0,0 +1,58 @@
+module.exports = balanced;
+function balanced(a, b, str) {
+ if (a instanceof RegExp) a = maybeMatch(a, str);
+ if (b instanceof RegExp) b = maybeMatch(b, str);
+
+ var r = range(a, b, str);
+
+ return r && {
+ start: r[0],
+ end: r[1],
+ pre: str.slice(0, r[0]),
+ body: str.slice(r[0] + a.length, r[1]),
+ post: str.slice(r[1] + b.length)
+ };
+}
+
+function maybeMatch(reg, str) {
+ var m = str.match(reg);
+ return m ? m[0] : null;
+}
+
+balanced.range = range;
+function range(a, b, str) {
+ var begs, beg, left, right, result;
+ var ai = str.indexOf(a);
+ var bi = str.indexOf(b, ai + 1);
+ var i = ai;
+
+ if (ai >= 0 && bi > 0) {
+ begs = [];
+ left = str.length;
+
+ while (i >= 0 && !result) {
+ if (i == ai) {
+ begs.push(i);
+ ai = str.indexOf(a, i + 1);
+ } else if (begs.length == 1) {
+ result = [ begs.pop(), bi ];
+ } else {
+ beg = begs.pop();
+ if (beg < left) {
+ left = beg;
+ right = bi;
+ }
+
+ bi = str.indexOf(b, i + 1);
+ }
+
+ i = ai < bi && ai >= 0 ? ai : bi;
+ }
+
+ if (begs.length) {
+ result = [ left, right ];
+ }
+ }
+
+ return result;
+}
diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json
new file mode 100644
index 0000000..f7240fd
--- /dev/null
+++ b/node_modules/balanced-match/package.json
@@ -0,0 +1,110 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "balanced-match@^0.4.1",
+ "scope": null,
+ "escapedName": "balanced-match",
+ "name": "balanced-match",
+ "rawSpec": "^0.4.1",
+ "spec": ">=0.4.1 <0.5.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/brace-expansion"
+ ]
+ ],
+ "_from": "balanced-match@>=0.4.1 <0.5.0",
+ "_id": "balanced-match@0.4.2",
+ "_inCache": true,
+ "_location": "/balanced-match",
+ "_nodeVersion": "4.4.7",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/balanced-match-0.4.2.tgz_1468834991581_0.6590619895141572"
+ },
+ "_npmUser": {
+ "name": "juliangruber",
+ "email": "julian@juliangruber.com"
+ },
+ "_npmVersion": "2.15.8",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "balanced-match@^0.4.1",
+ "scope": null,
+ "escapedName": "balanced-match",
+ "name": "balanced-match",
+ "rawSpec": "^0.4.1",
+ "spec": ">=0.4.1 <0.5.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/brace-expansion"
+ ],
+ "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "_shasum": "cb3f3e3c732dc0f01ee70b403f302e61d7709838",
+ "_shrinkwrap": null,
+ "_spec": "balanced-match@^0.4.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/brace-expansion",
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "bugs": {
+ "url": "https://github.com/juliangruber/balanced-match/issues"
+ },
+ "dependencies": {},
+ "description": "Match balanced character pairs, like \"{\" and \"}\"",
+ "devDependencies": {
+ "tape": "^4.6.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "cb3f3e3c732dc0f01ee70b403f302e61d7709838",
+ "tarball": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "gitHead": "57c2ea29d89a2844ae3bdcc637c6e2cbb73725e2",
+ "homepage": "https://github.com/juliangruber/balanced-match",
+ "keywords": [
+ "match",
+ "regexp",
+ "test",
+ "balanced",
+ "parse"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "juliangruber",
+ "email": "julian@juliangruber.com"
+ }
+ ],
+ "name": "balanced-match",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/balanced-match.git"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/20..latest",
+ "firefox/nightly",
+ "chrome/25..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "version": "0.4.2"
+}
diff --git a/node_modules/brace-expansion/README.md b/node_modules/brace-expansion/README.md
new file mode 100644
index 0000000..1793929
--- /dev/null
+++ b/node_modules/brace-expansion/README.md
@@ -0,0 +1,122 @@
+# brace-expansion
+
+[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
+as known from sh/bash, in JavaScript.
+
+[](http://travis-ci.org/juliangruber/brace-expansion)
+[](https://www.npmjs.org/package/brace-expansion)
+
+[](https://ci.testling.com/juliangruber/brace-expansion)
+
+## Example
+
+```js
+var expand = require('brace-expansion');
+
+expand('file-{a,b,c}.jpg')
+// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
+
+expand('-v{,,}')
+// => ['-v', '-v', '-v']
+
+expand('file{0..2}.jpg')
+// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
+
+expand('file-{a..c}.jpg')
+// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
+
+expand('file{2..0}.jpg')
+// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
+
+expand('file{0..4..2}.jpg')
+// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
+
+expand('file-{a..e..2}.jpg')
+// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
+
+expand('file{00..10..5}.jpg')
+// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
+
+expand('{{A..C},{a..c}}')
+// => ['A', 'B', 'C', 'a', 'b', 'c']
+
+expand('ppp{,config,oe{,conf}}')
+// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
+```
+
+## API
+
+```js
+var expand = require('brace-expansion');
+```
+
+### var expanded = expand(str)
+
+Return an array of all possible and valid expansions of `str`. If none are
+found, `[str]` is returned.
+
+Valid expansions are:
+
+```js
+/^(.*,)+(.+)?$/
+// {a,b,...}
+```
+
+A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
+
+```js
+/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
+// {x..y[..incr]}
+```
+
+A numeric sequence from `x` to `y` inclusive, with optional increment.
+If `x` or `y` start with a leading `0`, all the numbers will be padded
+to have equal length. Negative numbers and backwards iteration work too.
+
+```js
+/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
+// {x..y[..incr]}
+```
+
+An alphabetic sequence from `x` to `y` inclusive, with optional increment.
+`x` and `y` must be exactly one character, and if given, `incr` must be a
+number.
+
+For compatibility reasons, the string `${` is not eligible for brace expansion.
+
+## Installation
+
+With [npm](https://npmjs.org) do:
+
+```bash
+npm install brace-expansion
+```
+
+## Contributors
+
+- [Julian Gruber](https://github.com/juliangruber)
+- [Isaac Z. Schlueter](https://github.com/isaacs)
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/brace-expansion/index.js b/node_modules/brace-expansion/index.js
new file mode 100644
index 0000000..955f27c
--- /dev/null
+++ b/node_modules/brace-expansion/index.js
@@ -0,0 +1,201 @@
+var concatMap = require('concat-map');
+var balanced = require('balanced-match');
+
+module.exports = expandTop;
+
+var escSlash = '\0SLASH'+Math.random()+'\0';
+var escOpen = '\0OPEN'+Math.random()+'\0';
+var escClose = '\0CLOSE'+Math.random()+'\0';
+var escComma = '\0COMMA'+Math.random()+'\0';
+var escPeriod = '\0PERIOD'+Math.random()+'\0';
+
+function numeric(str) {
+ return parseInt(str, 10) == str
+ ? parseInt(str, 10)
+ : str.charCodeAt(0);
+}
+
+function escapeBraces(str) {
+ return str.split('\\\\').join(escSlash)
+ .split('\\{').join(escOpen)
+ .split('\\}').join(escClose)
+ .split('\\,').join(escComma)
+ .split('\\.').join(escPeriod);
+}
+
+function unescapeBraces(str) {
+ return str.split(escSlash).join('\\')
+ .split(escOpen).join('{')
+ .split(escClose).join('}')
+ .split(escComma).join(',')
+ .split(escPeriod).join('.');
+}
+
+
+// Basically just str.split(","), but handling cases
+// where we have nested braced sections, which should be
+// treated as individual members, like {a,{b,c},d}
+function parseCommaParts(str) {
+ if (!str)
+ return [''];
+
+ var parts = [];
+ var m = balanced('{', '}', str);
+
+ if (!m)
+ return str.split(',');
+
+ var pre = m.pre;
+ var body = m.body;
+ var post = m.post;
+ var p = pre.split(',');
+
+ p[p.length-1] += '{' + body + '}';
+ var postParts = parseCommaParts(post);
+ if (post.length) {
+ p[p.length-1] += postParts.shift();
+ p.push.apply(p, postParts);
+ }
+
+ parts.push.apply(parts, p);
+
+ return parts;
+}
+
+function expandTop(str) {
+ if (!str)
+ return [];
+
+ // I don't know why Bash 4.3 does this, but it does.
+ // Anything starting with {} will have the first two bytes preserved
+ // but *only* at the top level, so {},a}b will not expand to anything,
+ // but a{},b}c will be expanded to [a}c,abc].
+ // One could argue that this is a bug in Bash, but since the goal of
+ // this module is to match Bash's rules, we escape a leading {}
+ if (str.substr(0, 2) === '{}') {
+ str = '\\{\\}' + str.substr(2);
+ }
+
+ return expand(escapeBraces(str), true).map(unescapeBraces);
+}
+
+function identity(e) {
+ return e;
+}
+
+function embrace(str) {
+ return '{' + str + '}';
+}
+function isPadded(el) {
+ return /^-?0\d/.test(el);
+}
+
+function lte(i, y) {
+ return i <= y;
+}
+function gte(i, y) {
+ return i >= y;
+}
+
+function expand(str, isTop) {
+ var expansions = [];
+
+ var m = balanced('{', '}', str);
+ if (!m || /\$$/.test(m.pre)) return [str];
+
+ var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
+ var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
+ var isSequence = isNumericSequence || isAlphaSequence;
+ var isOptions = /^(.*,)+(.+)?$/.test(m.body);
+ if (!isSequence && !isOptions) {
+ // {a},b}
+ if (m.post.match(/,.*\}/)) {
+ str = m.pre + '{' + m.body + escClose + m.post;
+ return expand(str);
+ }
+ return [str];
+ }
+
+ var n;
+ if (isSequence) {
+ n = m.body.split(/\.\./);
+ } else {
+ n = parseCommaParts(m.body);
+ if (n.length === 1) {
+ // x{{a,b}}y ==> x{a}y x{b}y
+ n = expand(n[0], false).map(embrace);
+ if (n.length === 1) {
+ var post = m.post.length
+ ? expand(m.post, false)
+ : [''];
+ return post.map(function(p) {
+ return m.pre + n[0] + p;
+ });
+ }
+ }
+ }
+
+ // at this point, n is the parts, and we know it's not a comma set
+ // with a single entry.
+
+ // no need to expand pre, since it is guaranteed to be free of brace-sets
+ var pre = m.pre;
+ var post = m.post.length
+ ? expand(m.post, false)
+ : [''];
+
+ var N;
+
+ if (isSequence) {
+ var x = numeric(n[0]);
+ var y = numeric(n[1]);
+ var width = Math.max(n[0].length, n[1].length)
+ var incr = n.length == 3
+ ? Math.abs(numeric(n[2]))
+ : 1;
+ var test = lte;
+ var reverse = y < x;
+ if (reverse) {
+ incr *= -1;
+ test = gte;
+ }
+ var pad = n.some(isPadded);
+
+ N = [];
+
+ for (var i = x; test(i, y); i += incr) {
+ var c;
+ if (isAlphaSequence) {
+ c = String.fromCharCode(i);
+ if (c === '\\')
+ c = '';
+ } else {
+ c = String(i);
+ if (pad) {
+ var need = width - c.length;
+ if (need > 0) {
+ var z = new Array(need + 1).join('0');
+ if (i < 0)
+ c = '-' + z + c.slice(1);
+ else
+ c = z + c;
+ }
+ }
+ }
+ N.push(c);
+ }
+ } else {
+ N = concatMap(n, function(el) { return expand(el, false) });
+ }
+
+ for (var j = 0; j < N.length; j++) {
+ for (var k = 0; k < post.length; k++) {
+ var expansion = pre + N[j] + post[k];
+ if (!isTop || isSequence || expansion)
+ expansions.push(expansion);
+ }
+ }
+
+ return expansions;
+}
+
diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json
new file mode 100644
index 0000000..c2229f3
--- /dev/null
+++ b/node_modules/brace-expansion/package.json
@@ -0,0 +1,112 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "brace-expansion@^1.0.0",
+ "scope": null,
+ "escapedName": "brace-expansion",
+ "name": "brace-expansion",
+ "rawSpec": "^1.0.0",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/minimatch"
+ ]
+ ],
+ "_from": "brace-expansion@>=1.0.0 <2.0.0",
+ "_id": "brace-expansion@1.1.6",
+ "_inCache": true,
+ "_location": "/brace-expansion",
+ "_nodeVersion": "4.4.7",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/brace-expansion-1.1.6.tgz_1469047715600_0.9362958471756428"
+ },
+ "_npmUser": {
+ "name": "juliangruber",
+ "email": "julian@juliangruber.com"
+ },
+ "_npmVersion": "2.15.8",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "brace-expansion@^1.0.0",
+ "scope": null,
+ "escapedName": "brace-expansion",
+ "name": "brace-expansion",
+ "rawSpec": "^1.0.0",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/minimatch"
+ ],
+ "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "_shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9",
+ "_shrinkwrap": null,
+ "_spec": "brace-expansion@^1.0.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/minimatch",
+ "author": {
+ "name": "Julian Gruber",
+ "email": "mail@juliangruber.com",
+ "url": "http://juliangruber.com"
+ },
+ "bugs": {
+ "url": "https://github.com/juliangruber/brace-expansion/issues"
+ },
+ "dependencies": {
+ "balanced-match": "^0.4.1",
+ "concat-map": "0.0.1"
+ },
+ "description": "Brace expansion as known from sh/bash",
+ "devDependencies": {
+ "tape": "^4.6.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9",
+ "tarball": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz"
+ },
+ "gitHead": "791262fa06625e9c5594cde529a21d82086af5f2",
+ "homepage": "https://github.com/juliangruber/brace-expansion",
+ "keywords": [],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "juliangruber",
+ "email": "julian@juliangruber.com"
+ },
+ {
+ "name": "isaacs",
+ "email": "isaacs@npmjs.com"
+ }
+ ],
+ "name": "brace-expansion",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/juliangruber/brace-expansion.git"
+ },
+ "scripts": {
+ "gentest": "bash test/generate.sh",
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/20..latest",
+ "firefox/nightly",
+ "chrome/25..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "version": "1.1.6"
+}
diff --git a/node_modules/concat-map/.travis.yml b/node_modules/concat-map/.travis.yml
new file mode 100644
index 0000000..f1d0f13
--- /dev/null
+++ b/node_modules/concat-map/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
diff --git a/node_modules/concat-map/LICENSE b/node_modules/concat-map/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/concat-map/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/concat-map/README.markdown b/node_modules/concat-map/README.markdown
new file mode 100644
index 0000000..408f70a
--- /dev/null
+++ b/node_modules/concat-map/README.markdown
@@ -0,0 +1,62 @@
+concat-map
+==========
+
+Concatenative mapdashery.
+
+[](http://ci.testling.com/substack/node-concat-map)
+
+[](http://travis-ci.org/substack/node-concat-map)
+
+example
+=======
+
+``` js
+var concatMap = require('concat-map');
+var xs = [ 1, 2, 3, 4, 5, 6 ];
+var ys = concatMap(xs, function (x) {
+ return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
+});
+console.dir(ys);
+```
+
+***
+
+```
+[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
+```
+
+methods
+=======
+
+``` js
+var concatMap = require('concat-map')
+```
+
+concatMap(xs, fn)
+-----------------
+
+Return an array of concatenated elements by calling `fn(x, i)` for each element
+`x` and each index `i` in the array `xs`.
+
+When `fn(x, i)` returns an array, its result will be concatenated with the
+result array. If `fn(x, i)` returns anything else, that value will be pushed
+onto the end of the result array.
+
+install
+=======
+
+With [npm](http://npmjs.org) do:
+
+```
+npm install concat-map
+```
+
+license
+=======
+
+MIT
+
+notes
+=====
+
+This module was written while sitting high above the ground in a tree.
diff --git a/node_modules/concat-map/example/map.js b/node_modules/concat-map/example/map.js
new file mode 100644
index 0000000..3365621
--- /dev/null
+++ b/node_modules/concat-map/example/map.js
@@ -0,0 +1,6 @@
+var concatMap = require('../');
+var xs = [ 1, 2, 3, 4, 5, 6 ];
+var ys = concatMap(xs, function (x) {
+ return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
+});
+console.dir(ys);
diff --git a/node_modules/concat-map/index.js b/node_modules/concat-map/index.js
new file mode 100644
index 0000000..b29a781
--- /dev/null
+++ b/node_modules/concat-map/index.js
@@ -0,0 +1,13 @@
+module.exports = function (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ var x = fn(xs[i], i);
+ if (isArray(x)) res.push.apply(res, x);
+ else res.push(x);
+ }
+ return res;
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
diff --git a/node_modules/concat-map/package.json b/node_modules/concat-map/package.json
new file mode 100644
index 0000000..98fb224
--- /dev/null
+++ b/node_modules/concat-map/package.json
@@ -0,0 +1,117 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "concat-map@0.0.1",
+ "scope": null,
+ "escapedName": "concat-map",
+ "name": "concat-map",
+ "rawSpec": "0.0.1",
+ "spec": "0.0.1",
+ "type": "version"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/brace-expansion"
+ ]
+ ],
+ "_from": "concat-map@0.0.1",
+ "_id": "concat-map@0.0.1",
+ "_inCache": true,
+ "_location": "/concat-map",
+ "_npmUser": {
+ "name": "substack",
+ "email": "mail@substack.net"
+ },
+ "_npmVersion": "1.3.21",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "concat-map@0.0.1",
+ "scope": null,
+ "escapedName": "concat-map",
+ "name": "concat-map",
+ "rawSpec": "0.0.1",
+ "spec": "0.0.1",
+ "type": "version"
+ },
+ "_requiredBy": [
+ "/brace-expansion"
+ ],
+ "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
+ "_shrinkwrap": null,
+ "_spec": "concat-map@0.0.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/brace-expansion",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/node-concat-map/issues"
+ },
+ "dependencies": {},
+ "description": "concatenative mapdashery",
+ "devDependencies": {
+ "tape": "~2.4.0"
+ },
+ "directories": {
+ "example": "example",
+ "test": "test"
+ },
+ "dist": {
+ "shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
+ "tarball": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ },
+ "homepage": "https://github.com/substack/node-concat-map",
+ "keywords": [
+ "concat",
+ "concatMap",
+ "map",
+ "functional",
+ "higher-order"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "name": "concat-map",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/node-concat-map.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": {
+ "ie": [
+ 6,
+ 7,
+ 8,
+ 9
+ ],
+ "ff": [
+ 3.5,
+ 10,
+ 15
+ ],
+ "chrome": [
+ 10,
+ 22
+ ],
+ "safari": [
+ 5.1
+ ],
+ "opera": [
+ 12
+ ]
+ }
+ },
+ "version": "0.0.1"
+}
diff --git a/node_modules/concat-map/test/map.js b/node_modules/concat-map/test/map.js
new file mode 100644
index 0000000..fdbd702
--- /dev/null
+++ b/node_modules/concat-map/test/map.js
@@ -0,0 +1,39 @@
+var concatMap = require('../');
+var test = require('tape');
+
+test('empty or not', function (t) {
+ var xs = [ 1, 2, 3, 4, 5, 6 ];
+ var ixes = [];
+ var ys = concatMap(xs, function (x, ix) {
+ ixes.push(ix);
+ return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
+ });
+ t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
+ t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
+ t.end();
+});
+
+test('always something', function (t) {
+ var xs = [ 'a', 'b', 'c', 'd' ];
+ var ys = concatMap(xs, function (x) {
+ return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
+ });
+ t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
+ t.end();
+});
+
+test('scalars', function (t) {
+ var xs = [ 'a', 'b', 'c', 'd' ];
+ var ys = concatMap(xs, function (x) {
+ return x === 'b' ? [ 'B', 'B', 'B' ] : x;
+ });
+ t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
+ t.end();
+});
+
+test('undefs', function (t) {
+ var xs = [ 'a', 'b', 'c', 'd' ];
+ var ys = concatMap(xs, function () {});
+ t.same(ys, [ undefined, undefined, undefined, undefined ]);
+ t.end();
+});
diff --git a/node_modules/deep-equal/.travis.yml b/node_modules/deep-equal/.travis.yml
new file mode 100644
index 0000000..4af02b3
--- /dev/null
+++ b/node_modules/deep-equal/.travis.yml
@@ -0,0 +1,8 @@
+language: node_js
+node_js:
+ - '0.8'
+ - '0.10'
+ - '0.12'
+ - 'iojs'
+before_install:
+ - npm install -g npm@latest
diff --git a/node_modules/deep-equal/LICENSE b/node_modules/deep-equal/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/deep-equal/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/deep-equal/example/cmp.js b/node_modules/deep-equal/example/cmp.js
new file mode 100644
index 0000000..67014b8
--- /dev/null
+++ b/node_modules/deep-equal/example/cmp.js
@@ -0,0 +1,11 @@
+var equal = require('../');
+console.dir([
+ equal(
+ { a : [ 2, 3 ], b : [ 4 ] },
+ { a : [ 2, 3 ], b : [ 4 ] }
+ ),
+ equal(
+ { x : 5, y : [6] },
+ { x : 5, y : 6 }
+ )
+]);
diff --git a/node_modules/deep-equal/index.js b/node_modules/deep-equal/index.js
new file mode 100644
index 0000000..0772f8c
--- /dev/null
+++ b/node_modules/deep-equal/index.js
@@ -0,0 +1,94 @@
+var pSlice = Array.prototype.slice;
+var objectKeys = require('./lib/keys.js');
+var isArguments = require('./lib/is_arguments.js');
+
+var deepEqual = module.exports = function (actual, expected, opts) {
+ if (!opts) opts = {};
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (actual instanceof Date && expected instanceof Date) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
+ return opts.strict ? actual === expected : actual == expected;
+
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected, opts);
+ }
+}
+
+function isUndefinedOrNull(value) {
+ return value === null || value === undefined;
+}
+
+function isBuffer (x) {
+ if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
+ if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
+ return false;
+ }
+ if (x.length > 0 && typeof x[0] !== 'number') return false;
+ return true;
+}
+
+function objEquiv(a, b, opts) {
+ var i, key;
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
+ return false;
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ //~~~I've managed to break Object.keys through screwy arguments passing.
+ // Converting to array solves the problem.
+ if (isArguments(a)) {
+ if (!isArguments(b)) {
+ return false;
+ }
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return deepEqual(a, b, opts);
+ }
+ if (isBuffer(a)) {
+ if (!isBuffer(b)) {
+ return false;
+ }
+ if (a.length !== b.length) return false;
+ for (i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) return false;
+ }
+ return true;
+ }
+ try {
+ var ka = objectKeys(a),
+ kb = objectKeys(b);
+ } catch (e) {//happens when one is a string literal and the other isn't
+ return false;
+ }
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!deepEqual(a[key], b[key], opts)) return false;
+ }
+ return typeof a === typeof b;
+}
diff --git a/node_modules/deep-equal/lib/is_arguments.js b/node_modules/deep-equal/lib/is_arguments.js
new file mode 100644
index 0000000..1ff150f
--- /dev/null
+++ b/node_modules/deep-equal/lib/is_arguments.js
@@ -0,0 +1,20 @@
+var supportsArgumentsClass = (function(){
+ return Object.prototype.toString.call(arguments)
+})() == '[object Arguments]';
+
+exports = module.exports = supportsArgumentsClass ? supported : unsupported;
+
+exports.supported = supported;
+function supported(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+};
+
+exports.unsupported = unsupported;
+function unsupported(object){
+ return object &&
+ typeof object == 'object' &&
+ typeof object.length == 'number' &&
+ Object.prototype.hasOwnProperty.call(object, 'callee') &&
+ !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
+ false;
+};
diff --git a/node_modules/deep-equal/lib/keys.js b/node_modules/deep-equal/lib/keys.js
new file mode 100644
index 0000000..13af263
--- /dev/null
+++ b/node_modules/deep-equal/lib/keys.js
@@ -0,0 +1,9 @@
+exports = module.exports = typeof Object.keys === 'function'
+ ? Object.keys : shim;
+
+exports.shim = shim;
+function shim (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+}
diff --git a/node_modules/deep-equal/package.json b/node_modules/deep-equal/package.json
new file mode 100644
index 0000000..56a47ff
--- /dev/null
+++ b/node_modules/deep-equal/package.json
@@ -0,0 +1,118 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "deep-equal@~1.0.1",
+ "scope": null,
+ "escapedName": "deep-equal",
+ "name": "deep-equal",
+ "rawSpec": "~1.0.1",
+ "spec": ">=1.0.1 <1.1.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "deep-equal@>=1.0.1 <1.1.0",
+ "_id": "deep-equal@1.0.1",
+ "_inCache": true,
+ "_location": "/deep-equal",
+ "_nodeVersion": "2.4.0",
+ "_npmUser": {
+ "name": "substack",
+ "email": "substack@gmail.com"
+ },
+ "_npmVersion": "3.2.2",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "deep-equal@~1.0.1",
+ "scope": null,
+ "escapedName": "deep-equal",
+ "name": "deep-equal",
+ "rawSpec": "~1.0.1",
+ "spec": ">=1.0.1 <1.1.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+ "_shasum": "f5d260292b660e084eff4cdbc9f08ad3247448b5",
+ "_shrinkwrap": null,
+ "_spec": "deep-equal@~1.0.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/node-deep-equal/issues"
+ },
+ "dependencies": {},
+ "description": "node's assert.deepEqual algorithm",
+ "devDependencies": {
+ "tape": "^3.5.0"
+ },
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "dist": {
+ "shasum": "f5d260292b660e084eff4cdbc9f08ad3247448b5",
+ "tarball": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz"
+ },
+ "gitHead": "59c511f5aeae19e3dd1de054077a789d7302be34",
+ "homepage": "https://github.com/substack/node-deep-equal#readme",
+ "keywords": [
+ "equality",
+ "equal",
+ "compare"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "name": "deep-equal",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/substack/node-deep-equal.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": {
+ "ie": [
+ 6,
+ 7,
+ 8,
+ 9
+ ],
+ "ff": [
+ 3.5,
+ 10,
+ 15
+ ],
+ "chrome": [
+ 10,
+ 22
+ ],
+ "safari": [
+ 5.1
+ ],
+ "opera": [
+ 12
+ ]
+ }
+ },
+ "version": "1.0.1"
+}
diff --git a/node_modules/deep-equal/readme.markdown b/node_modules/deep-equal/readme.markdown
new file mode 100644
index 0000000..f489c2a
--- /dev/null
+++ b/node_modules/deep-equal/readme.markdown
@@ -0,0 +1,61 @@
+# deep-equal
+
+Node's `assert.deepEqual() algorithm` as a standalone module.
+
+This module is around [5 times faster](https://gist.github.com/2790507)
+than wrapping `assert.deepEqual()` in a `try/catch`.
+
+[](https://ci.testling.com/substack/node-deep-equal)
+
+[](https://travis-ci.org/substack/node-deep-equal)
+
+# example
+
+``` js
+var equal = require('deep-equal');
+console.dir([
+ equal(
+ { a : [ 2, 3 ], b : [ 4 ] },
+ { a : [ 2, 3 ], b : [ 4 ] }
+ ),
+ equal(
+ { x : 5, y : [6] },
+ { x : 5, y : 6 }
+ )
+]);
+```
+
+# methods
+
+``` js
+var deepEqual = require('deep-equal')
+```
+
+## deepEqual(a, b, opts)
+
+Compare objects `a` and `b`, returning whether they are equal according to a
+recursive equality algorithm.
+
+If `opts.strict` is `true`, use strict equality (`===`) to compare leaf nodes.
+The default is to use coercive equality (`==`) because that's how
+`assert.deepEqual()` works by default.
+
+# install
+
+With [npm](http://npmjs.org) do:
+
+```
+npm install deep-equal
+```
+
+# test
+
+With [npm](http://npmjs.org) do:
+
+```
+npm test
+```
+
+# license
+
+MIT. Derived largely from node's assert module.
diff --git a/node_modules/deep-equal/test/cmp.js b/node_modules/deep-equal/test/cmp.js
new file mode 100644
index 0000000..2aab5f9
--- /dev/null
+++ b/node_modules/deep-equal/test/cmp.js
@@ -0,0 +1,95 @@
+var test = require('tape');
+var equal = require('../');
+var isArguments = require('../lib/is_arguments.js');
+var objectKeys = require('../lib/keys.js');
+
+test('equal', function (t) {
+ t.ok(equal(
+ { a : [ 2, 3 ], b : [ 4 ] },
+ { a : [ 2, 3 ], b : [ 4 ] }
+ ));
+ t.end();
+});
+
+test('not equal', function (t) {
+ t.notOk(equal(
+ { x : 5, y : [6] },
+ { x : 5, y : 6 }
+ ));
+ t.end();
+});
+
+test('nested nulls', function (t) {
+ t.ok(equal([ null, null, null ], [ null, null, null ]));
+ t.end();
+});
+
+test('strict equal', function (t) {
+ t.notOk(equal(
+ [ { a: 3 }, { b: 4 } ],
+ [ { a: '3' }, { b: '4' } ],
+ { strict: true }
+ ));
+ t.end();
+});
+
+test('non-objects', function (t) {
+ t.ok(equal(3, 3));
+ t.ok(equal('beep', 'beep'));
+ t.ok(equal('3', 3));
+ t.notOk(equal('3', 3, { strict: true }));
+ t.notOk(equal('3', [3]));
+ t.end();
+});
+
+test('arguments class', function (t) {
+ t.ok(equal(
+ (function(){return arguments})(1,2,3),
+ (function(){return arguments})(1,2,3),
+ "compares arguments"
+ ));
+ t.notOk(equal(
+ (function(){return arguments})(1,2,3),
+ [1,2,3],
+ "differenciates array and arguments"
+ ));
+ t.end();
+});
+
+test('test the arguments shim', function (t) {
+ t.ok(isArguments.supported((function(){return arguments})()));
+ t.notOk(isArguments.supported([1,2,3]));
+
+ t.ok(isArguments.unsupported((function(){return arguments})()));
+ t.notOk(isArguments.unsupported([1,2,3]));
+
+ t.end();
+});
+
+test('test the keys shim', function (t) {
+ t.deepEqual(objectKeys.shim({ a: 1, b : 2 }), [ 'a', 'b' ]);
+ t.end();
+});
+
+test('dates', function (t) {
+ var d0 = new Date(1387585278000);
+ var d1 = new Date('Fri Dec 20 2013 16:21:18 GMT-0800 (PST)');
+ t.ok(equal(d0, d1));
+ t.end();
+});
+
+test('buffers', function (t) {
+ t.ok(equal(Buffer('xyz'), Buffer('xyz')));
+ t.end();
+});
+
+test('booleans and arrays', function (t) {
+ t.notOk(equal(true, []));
+ t.end();
+})
+
+test('null == undefined', function (t) {
+ t.ok(equal(null, undefined))
+ t.notOk(equal(null, undefined, { strict: true }))
+ t.end()
+})
diff --git a/node_modules/define-properties/.editorconfig b/node_modules/define-properties/.editorconfig
new file mode 100644
index 0000000..eaa2141
--- /dev/null
+++ b/node_modules/define-properties/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+indent_style = tab;
+insert_final_newline = true;
+quote_type = auto;
+space_after_anonymous_functions = true;
+space_after_control_statements = true;
+spaces_around_operators = true;
+trim_trailing_whitespace = true;
+spaces_in_brackets = false;
+end_of_line = lf;
+
diff --git a/node_modules/define-properties/.eslintrc b/node_modules/define-properties/.eslintrc
new file mode 100644
index 0000000..87e47e1
--- /dev/null
+++ b/node_modules/define-properties/.eslintrc
@@ -0,0 +1,11 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "id-length": [2, { "min": 1, "max": 35 }],
+ "max-params": [2, 4],
+ "max-statements": [2, 13]
+ }
+}
diff --git a/node_modules/define-properties/.jscs.json b/node_modules/define-properties/.jscs.json
new file mode 100644
index 0000000..034652c
--- /dev/null
+++ b/node_modules/define-properties/.jscs.json
@@ -0,0 +1,131 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": false,
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": true,
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 3
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": "asc-insensitive",
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": true
+}
+
diff --git a/node_modules/define-properties/.npmignore b/node_modules/define-properties/.npmignore
new file mode 100644
index 0000000..a777a81
--- /dev/null
+++ b/node_modules/define-properties/.npmignore
@@ -0,0 +1,2 @@
+test/*
+
diff --git a/node_modules/define-properties/.travis.yml b/node_modules/define-properties/.travis.yml
new file mode 100644
index 0000000..324496c
--- /dev/null
+++ b/node_modules/define-properties/.travis.yml
@@ -0,0 +1,60 @@
+language: node_js
+node_js:
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - '[ "${TRAVIS_NODE_VERSION}" = "0.6" ] || npm install -g npm@1.4.28 && npm install -g npm'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.8"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/define-properties/CHANGELOG.md b/node_modules/define-properties/CHANGELOG.md
new file mode 100644
index 0000000..3217f89
--- /dev/null
+++ b/node_modules/define-properties/CHANGELOG.md
@@ -0,0 +1,35 @@
+1.1.2 / 2015-10-14
+=================
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+ * [Deps] Update `object-keys`
+ * [Dev Deps] update `jscs`, `tape`, `eslint`, `@ljharb/eslint-config`, `nsp`
+ * [Tests] up to `io.js` `v3.3`, `node` `v4.2`
+
+1.1.1 / 2015-07-21
+=================
+ * [Deps] Update `object-keys`
+ * [Dev Deps] Update `tape`, `eslint`
+ * [Tests] Test on `io.js` `v2.4`
+
+1.1.0 / 2015-07-01
+=================
+ * [New] Add support for symbol-valued properties.
+ * [Dev Deps] Update `nsp`, `eslint`
+ * [Tests] Test up to `io.js` `v2.3`
+
+1.0.3 / 2015-05-30
+=================
+ * Using a more reliable check for supported property descriptors.
+
+1.0.2 / 2015-05-23
+=================
+ * Test up to `io.js` `v2.0`
+ * Update `tape`, `jscs`, `nsp`, `eslint`, `object-keys`, `editorconfig-tools`, `covert`
+
+1.0.1 / 2015-01-06
+=================
+ * Update `object-keys` to fix ES3 support
+
+1.0.0 / 2015-01-04
+=================
+ * v1.0.0
diff --git a/node_modules/define-properties/LICENSE b/node_modules/define-properties/LICENSE
new file mode 100644
index 0000000..8c271c1
--- /dev/null
+++ b/node_modules/define-properties/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (C) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/define-properties/README.md b/node_modules/define-properties/README.md
new file mode 100644
index 0000000..33b6111
--- /dev/null
+++ b/node_modules/define-properties/README.md
@@ -0,0 +1,86 @@
+#define-properties [![Version Badge][npm-version-svg]][package-url]
+
+[![Build Status][travis-svg]][travis-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+[![browser support][testling-svg]][testling-url]
+
+Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.
+Existing properties are not overridden. Accepts a map of property names to a predicate that, when true, force-overrides.
+
+## Example
+
+```js
+var define = require('define-properties');
+var assert = require('assert');
+
+var obj = define({ a: 1, b: 2 }, {
+ a: 10,
+ b: 20,
+ c: 30
+});
+assert(obj.a === 1);
+assert(obj.b === 2);
+assert(obj.c === 30);
+if (define.supportsDescriptors) {
+ assert.deepEqual(Object.keys(obj), ['a', 'b']);
+ assert.deepEqual(Object.getOwnPropertyDescriptor(obj, 'c'), {
+ configurable: true,
+ enumerable: false,
+ value: 30,
+ writable: false
+ });
+}
+```
+
+Then, with predicates:
+```js
+var define = require('define-properties');
+var assert = require('assert');
+
+var obj = define({ a: 1, b: 2, c: 3 }, {
+ a: 10,
+ b: 20,
+ c: 30
+}, {
+ a: function () { return false; },
+ b: function () { return true; }
+});
+assert(obj.a === 1);
+assert(obj.b === 20);
+assert(obj.c === 3);
+if (define.supportsDescriptors) {
+ assert.deepEqual(Object.keys(obj), ['a', 'c']);
+ assert.deepEqual(Object.getOwnPropertyDescriptor(obj, 'b'), {
+ configurable: true,
+ enumerable: false,
+ value: 20,
+ writable: false
+ });
+}
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/define-properties
+[npm-version-svg]: http://versionbadg.es/ljharb/define-properties.svg
+[travis-svg]: https://travis-ci.org/ljharb/define-properties.svg
+[travis-url]: https://travis-ci.org/ljharb/define-properties
+[deps-svg]: https://david-dm.org/ljharb/define-properties.svg
+[deps-url]: https://david-dm.org/ljharb/define-properties
+[dev-deps-svg]: https://david-dm.org/ljharb/define-properties/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/define-properties#info=devDependencies
+[testling-svg]: https://ci.testling.com/ljharb/define-properties.png
+[testling-url]: https://ci.testling.com/ljharb/define-properties
+[npm-badge-png]: https://nodei.co/npm/define-properties.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/define-properties.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/define-properties.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=define-properties
+
diff --git a/node_modules/define-properties/index.js b/node_modules/define-properties/index.js
new file mode 100644
index 0000000..4bd5790
--- /dev/null
+++ b/node_modules/define-properties/index.js
@@ -0,0 +1,56 @@
+'use strict';
+
+var keys = require('object-keys');
+var foreach = require('foreach');
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
+
+var toStr = Object.prototype.toString;
+
+var isFunction = function (fn) {
+ return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
+};
+
+var arePropertyDescriptorsSupported = function () {
+ var obj = {};
+ try {
+ Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
+ /* eslint-disable no-unused-vars, no-restricted-syntax */
+ for (var _ in obj) { return false; }
+ /* eslint-enable no-unused-vars, no-restricted-syntax */
+ return obj.x === obj;
+ } catch (e) { /* this is IE 8. */
+ return false;
+ }
+};
+var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
+
+var defineProperty = function (object, name, value, predicate) {
+ if (name in object && (!isFunction(predicate) || !predicate())) {
+ return;
+ }
+ if (supportsDescriptors) {
+ Object.defineProperty(object, name, {
+ configurable: true,
+ enumerable: false,
+ value: value,
+ writable: true
+ });
+ } else {
+ object[name] = value;
+ }
+};
+
+var defineProperties = function (object, map) {
+ var predicates = arguments.length > 2 ? arguments[2] : {};
+ var props = keys(map);
+ if (hasSymbols) {
+ props = props.concat(Object.getOwnPropertySymbols(map));
+ }
+ foreach(props, function (name) {
+ defineProperty(object, name, map[name], predicates[name]);
+ });
+};
+
+defineProperties.supportsDescriptors = !!supportsDescriptors;
+
+module.exports = defineProperties;
diff --git a/node_modules/define-properties/package.json b/node_modules/define-properties/package.json
new file mode 100644
index 0000000..31e45d3
--- /dev/null
+++ b/node_modules/define-properties/package.json
@@ -0,0 +1,127 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "define-properties@^1.1.2",
+ "scope": null,
+ "escapedName": "define-properties",
+ "name": "define-properties",
+ "rawSpec": "^1.1.2",
+ "spec": ">=1.1.2 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/string.prototype.trim"
+ ]
+ ],
+ "_from": "define-properties@>=1.1.2 <2.0.0",
+ "_id": "define-properties@1.1.2",
+ "_inCache": true,
+ "_location": "/define-properties",
+ "_nodeVersion": "4.2.1",
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "2.14.7",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "define-properties@^1.1.2",
+ "scope": null,
+ "escapedName": "define-properties",
+ "name": "define-properties",
+ "rawSpec": "^1.1.2",
+ "spec": ">=1.1.2 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/string.prototype.trim"
+ ],
+ "_resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+ "_shasum": "83a73f2fea569898fb737193c8f873caf6d45c94",
+ "_shrinkwrap": null,
+ "_spec": "define-properties@^1.1.2",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/string.prototype.trim",
+ "author": {
+ "name": "Jordan Harband"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/define-properties/issues"
+ },
+ "dependencies": {
+ "foreach": "^2.0.5",
+ "object-keys": "^1.0.8"
+ },
+ "description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^1.3.0",
+ "covert": "^1.1.0",
+ "editorconfig-tools": "^0.1.1",
+ "eslint": "^1.6.0",
+ "jscs": "^2.3.1",
+ "nsp": "^1.1.0",
+ "tape": "^4.2.1"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "83a73f2fea569898fb737193c8f873caf6d45c94",
+ "tarball": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "6467a10e6f493d8a1a4f6ec8442ffee137aab7ba",
+ "homepage": "https://github.com/ljharb/define-properties#readme",
+ "keywords": [
+ "Object.defineProperty",
+ "Object.defineProperties",
+ "object",
+ "property descriptor",
+ "descriptor",
+ "define",
+ "ES5"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "define-properties",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/define-properties.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "eccheck": "editorconfig-tools check *.js **/*.js > /dev/null",
+ "eslint": "eslint test/*.js *.js",
+ "jscs": "jscs test/*.js *.js",
+ "lint": "npm run jscs && npm run eslint",
+ "security": "nsp package",
+ "test": "npm run lint && node test/index.js && npm run security"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.1.2"
+}
diff --git a/node_modules/define-properties/test/index.js b/node_modules/define-properties/test/index.js
new file mode 100644
index 0000000..33ce051
--- /dev/null
+++ b/node_modules/define-properties/test/index.js
@@ -0,0 +1,126 @@
+'use strict';
+
+var define = require('../');
+var test = require('tape');
+var keys = require('object-keys');
+
+var arePropertyDescriptorsSupported = function () {
+ var obj = { a: 1 };
+ try {
+ Object.defineProperty(obj, 'x', { value: obj });
+ return obj.x === obj;
+ } catch (e) { /* this is IE 8. */
+ return false;
+ }
+};
+var descriptorsSupported = !!Object.defineProperty && arePropertyDescriptorsSupported();
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
+
+test('defineProperties', function (dt) {
+
+ dt.test('with descriptor support', { skip: !descriptorsSupported }, function (t) {
+ var getDescriptor = function (value) {
+ return {
+ configurable: true,
+ enumerable: false,
+ value: value,
+ writable: true
+ };
+ };
+
+ var obj = {
+ a: 1,
+ b: 2,
+ c: 3
+ };
+ t.deepEqual(keys(obj), ['a', 'b', 'c'], 'all literal-set keys start enumerable');
+ define(obj, {
+ b: 3,
+ c: 4,
+ d: 5
+ });
+ t.deepEqual(obj, {
+ a: 1,
+ b: 2,
+ c: 3
+ }, 'existing properties were not overridden');
+ t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'new property "d" was added and is not enumerable');
+ t.deepEqual(['a', 'b', 'c'], keys(obj), 'new keys are not enumerable');
+
+ define(obj, {
+ a: 2,
+ b: 3,
+ c: 4
+ }, {
+ a: function () { return true; },
+ b: function () { return false; }
+ });
+ t.deepEqual(obj, {
+ b: 2,
+ c: 3
+ }, 'properties only overriden when predicate exists and returns true');
+ t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'existing property "d" remained and is not enumerable');
+ t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'a'), getDescriptor(2), 'existing property "a" was overridden and is not enumerable');
+ t.deepEqual(['b', 'c'], keys(obj), 'overridden keys are not enumerable');
+
+ t.end();
+ });
+
+ dt.test('without descriptor support', { skip: descriptorsSupported }, function (t) {
+ var obj = {
+ a: 1,
+ b: 2,
+ c: 3
+ };
+ define(obj, {
+ b: 3,
+ c: 4,
+ d: 5
+ });
+ t.deepEqual(obj, {
+ a: 1,
+ b: 2,
+ c: 3,
+ d: 5
+ }, 'existing properties were not overridden, new properties were added');
+
+ define(obj, {
+ a: 2,
+ b: 3,
+ c: 4
+ }, {
+ a: function () { return true; },
+ b: function () { return false; }
+ });
+ t.deepEqual(obj, {
+ a: 2,
+ b: 2,
+ c: 3,
+ d: 5
+ }, 'properties only overriden when predicate exists and returns true');
+
+ t.end();
+ });
+
+ dt.end();
+});
+
+test('symbols', { skip: !hasSymbols }, function (t) {
+ var sym = Symbol('foo');
+ var obj = {};
+ var aValue = {};
+ var bValue = {};
+ var properties = { a: aValue };
+ properties[sym] = bValue;
+
+ define(obj, properties);
+
+ t.deepEqual(Object.keys(obj), [], 'object has no enumerable keys');
+ t.deepEqual(Object.getOwnPropertyNames(obj), ['a'], 'object has non-enumerable "a" key');
+ t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'object has non-enumerable symbol key');
+ t.equal(obj.a, aValue, 'string keyed value is defined');
+ t.equal(obj[sym], bValue, 'symbol keyed value is defined');
+
+ t.end();
+});
diff --git a/node_modules/defined/.travis.yml b/node_modules/defined/.travis.yml
new file mode 100644
index 0000000..895dbd3
--- /dev/null
+++ b/node_modules/defined/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.6
+ - 0.8
diff --git a/node_modules/defined/LICENSE b/node_modules/defined/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/defined/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/defined/example/defined.js b/node_modules/defined/example/defined.js
new file mode 100644
index 0000000..7b5d982
--- /dev/null
+++ b/node_modules/defined/example/defined.js
@@ -0,0 +1,4 @@
+var defined = require('../');
+var opts = { y : false, w : 4 };
+var x = defined(opts.x, opts.y, opts.w, 8);
+console.log(x);
diff --git a/node_modules/defined/index.js b/node_modules/defined/index.js
new file mode 100644
index 0000000..f8a2219
--- /dev/null
+++ b/node_modules/defined/index.js
@@ -0,0 +1,5 @@
+module.exports = function () {
+ for (var i = 0; i < arguments.length; i++) {
+ if (arguments[i] !== undefined) return arguments[i];
+ }
+};
diff --git a/node_modules/defined/package.json b/node_modules/defined/package.json
new file mode 100644
index 0000000..4722282
--- /dev/null
+++ b/node_modules/defined/package.json
@@ -0,0 +1,120 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "defined@~1.0.0",
+ "scope": null,
+ "escapedName": "defined",
+ "name": "defined",
+ "rawSpec": "~1.0.0",
+ "spec": ">=1.0.0 <1.1.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "defined@>=1.0.0 <1.1.0",
+ "_id": "defined@1.0.0",
+ "_inCache": true,
+ "_location": "/defined",
+ "_nodeVersion": "0.12.0",
+ "_npmUser": {
+ "name": "substack",
+ "email": "mail@substack.net"
+ },
+ "_npmVersion": "2.7.5",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "defined@~1.0.0",
+ "scope": null,
+ "escapedName": "defined",
+ "name": "defined",
+ "rawSpec": "~1.0.0",
+ "spec": ">=1.0.0 <1.1.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "_shasum": "c98d9bcef75674188e110969151199e39b1fa693",
+ "_shrinkwrap": null,
+ "_spec": "defined@~1.0.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/defined/issues"
+ },
+ "dependencies": {},
+ "description": "return the first argument that is `!== undefined`",
+ "devDependencies": {
+ "tape": "~3.5.0"
+ },
+ "directories": {
+ "example": "example",
+ "test": "test"
+ },
+ "dist": {
+ "shasum": "c98d9bcef75674188e110969151199e39b1fa693",
+ "tarball": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"
+ },
+ "gitHead": "3a46c81d39b5f94c0c17c47638939af2528520f3",
+ "homepage": "https://github.com/substack/defined",
+ "keywords": [
+ "undefined",
+ "short-circuit",
+ "||",
+ "or",
+ "//",
+ "defined-or"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "name": "defined",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/defined.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": {
+ "ie": [
+ 6,
+ 7,
+ 8,
+ 9
+ ],
+ "ff": [
+ 3.5,
+ 10,
+ 15
+ ],
+ "chrome": [
+ 10,
+ 22
+ ],
+ "safari": [
+ 5.1
+ ],
+ "opera": [
+ 12
+ ]
+ }
+ },
+ "version": "1.0.0"
+}
diff --git a/node_modules/defined/readme.markdown b/node_modules/defined/readme.markdown
new file mode 100644
index 0000000..9616195
--- /dev/null
+++ b/node_modules/defined/readme.markdown
@@ -0,0 +1,53 @@
+# defined
+
+return the first argument that is `!== undefined`
+
+[](http://ci.testling.com/substack/defined)
+
+[](http://travis-ci.org/substack/defined)
+
+Most of the time when I chain together `||`s, I actually just want the first
+item that is not `undefined`, not the first non-falsy item.
+
+This module is like the defined-or (`//`) operator in perl 5.10+.
+
+# example
+
+``` js
+var defined = require('defined');
+var opts = { y : false, w : 4 };
+var x = defined(opts.x, opts.y, opts.w, 100);
+console.log(x);
+```
+
+```
+$ node example/defined.js
+false
+```
+
+The return value is `false` because `false` is the first item that is
+`!== undefined`.
+
+# methods
+
+``` js
+var defined = require('defined')
+```
+
+## var x = defined(a, b, c...)
+
+Return the first item in the argument list `a, b, c...` that is `!== undefined`.
+
+If all the items are `=== undefined`, return undefined.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install defined
+```
+
+# license
+
+MIT
diff --git a/node_modules/defined/test/def.js b/node_modules/defined/test/def.js
new file mode 100644
index 0000000..48da517
--- /dev/null
+++ b/node_modules/defined/test/def.js
@@ -0,0 +1,22 @@
+var defined = require('../');
+var test = require('tape');
+
+test('defined-or', function (t) {
+ var u = undefined;
+
+ t.equal(defined(), u, 'empty arguments');
+ t.equal(defined(u), u, '1 undefined');
+ t.equal(defined(u, u), u, '2 undefined');
+ t.equal(defined(u, u, u, u), u, '4 undefineds');
+
+ t.equal(defined(undefined, false, true), false, 'false[0]');
+ t.equal(defined(false, true), false, 'false[1]');
+ t.equal(defined(undefined, 0, true), 0, 'zero[0]');
+ t.equal(defined(0, true), 0, 'zero[1]');
+
+ t.equal(defined(3, undefined, 4), 3, 'first arg');
+ t.equal(defined(undefined, 3, 4), 3, 'second arg');
+ t.equal(defined(undefined, undefined, 3), 3, 'third arg');
+
+ t.end();
+});
diff --git a/node_modules/defined/test/falsy.js b/node_modules/defined/test/falsy.js
new file mode 100644
index 0000000..6b7d623
--- /dev/null
+++ b/node_modules/defined/test/falsy.js
@@ -0,0 +1,9 @@
+var test = require('tape');
+var defined = require('../');
+
+test('falsy', function (t) {
+ t.plan(1);
+ var opts = { y : false, w : 4 };
+ var x = defined(opts.x, opts.y, opts.w, 8);
+ t.equal(x, false);
+});
diff --git a/node_modules/es-abstract/.editorconfig b/node_modules/es-abstract/.editorconfig
new file mode 100644
index 0000000..eaa2141
--- /dev/null
+++ b/node_modules/es-abstract/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+indent_style = tab;
+insert_final_newline = true;
+quote_type = auto;
+space_after_anonymous_functions = true;
+space_after_control_statements = true;
+spaces_around_operators = true;
+trim_trailing_whitespace = true;
+spaces_in_brackets = false;
+end_of_line = lf;
+
diff --git a/node_modules/es-abstract/.eslintrc b/node_modules/es-abstract/.eslintrc
new file mode 100644
index 0000000..7804d91
--- /dev/null
+++ b/node_modules/es-abstract/.eslintrc
@@ -0,0 +1,16 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "eqeqeq": [2, "allow-null"],
+ "id-length": [2, { "min": 1, "max": 30 }],
+ "max-statements": [2, 13],
+ "max-statements-per-line": [2, { "max": 2 }],
+ "no-magic-numbers": [0],
+ "new-cap": [0],
+ "no-extra-parens": [1],
+ "sort-keys": [0]
+ }
+}
diff --git a/node_modules/es-abstract/.jscs.json b/node_modules/es-abstract/.jscs.json
new file mode 100644
index 0000000..4a4bd8b
--- /dev/null
+++ b/node_modules/es-abstract/.jscs.json
@@ -0,0 +1,176 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 9
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": false,
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false,
+
+ "requireCapitalizedConstructorsNew": {
+ "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
+ },
+
+ "requireImportAlphabetized": false,
+
+ "requireSpaceBeforeObjectValues": true,
+ "requireSpaceBeforeDestructuredValues": true,
+
+ "disallowSpacesInsideTemplateStringPlaceholders": true,
+
+ "disallowArrayDestructuringReturn": false,
+
+ "requireNewlineBeforeSingleStatementsInIf": false,
+
+ "disallowUnusedVariables": true,
+
+ "requireSpacesInsideImportedObjectBraces": true,
+
+ "requireUseStrict": true
+}
+
diff --git a/node_modules/es-abstract/.npmignore b/node_modules/es-abstract/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/es-abstract/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/es-abstract/.travis.yml b/node_modules/es-abstract/.travis.yml
new file mode 100644
index 0000000..2b7471a
--- /dev/null
+++ b/node_modules/es-abstract/.travis.yml
@@ -0,0 +1,102 @@
+language: node_js
+node_js:
+ - "6.4"
+ - "6.3"
+ - "6.2"
+ - "6.1"
+ - "6.0"
+ - "5.12"
+ - "5.11"
+ - "5.10"
+ - "5.9"
+ - "5.8"
+ - "5.7"
+ - "5.6"
+ - "5.5"
+ - "5.4"
+ - "5.3"
+ - "5.2"
+ - "5.1"
+ - "5.0"
+ - "4.5"
+ - "4.4"
+ - "4.3"
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+script:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "4.4" ]; then npm run tests-only ; else npm test ; fi'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "6.3"
+ - node_js: "6.2"
+ - node_js: "6.1"
+ - node_js: "6.0"
+ - node_js: "5.11"
+ - node_js: "5.10"
+ - node_js: "5.9"
+ - node_js: "5.8"
+ - node_js: "5.7"
+ - node_js: "5.6"
+ - node_js: "5.5"
+ - node_js: "5.4"
+ - node_js: "5.3"
+ - node_js: "5.2"
+ - node_js: "5.1"
+ - node_js: "5.0"
+ - node_js: "4.4"
+ - node_js: "4.3"
+ - node_js: "4.2"
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/es-abstract/CHANGELOG.md b/node_modules/es-abstract/CHANGELOG.md
new file mode 100644
index 0000000..614c27e
--- /dev/null
+++ b/node_modules/es-abstract/CHANGELOG.md
@@ -0,0 +1,109 @@
+1.6.1 / 2016-08-21
+=================
+ * [Fix] ES6: IsConstructor should return true for `class` constructors.
+
+1.6.0 / 2016-08-20
+=================
+ * [New] ES5 / ES6: add `Type`
+ * [New] ES6: `SpeciesConstructor`
+ * [Dev Deps] update `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`; add `safe-publish-latest`
+ * [Tests] up to `node` `v6.4`, `v5.12`, `v4.5`
+
+1.5.1 / 2016-05-30
+=================
+ * [Fix] `ES.IsRegExp`: actually look up `Symbol.match` on the argument
+ * [Refactor] create `isNaN` helper
+ * [Deps] update `is-callable`, `function-bind`
+ * [Deps] update `es-to-primitive`, fix ES5 tests
+ * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`, `tape`, `nsp`
+ * [Tests] up to `node` `v6.2`, `v5.11`, `v4.4`
+ * [Tests] use pretest/posttest for linting/security
+
+1.5.0 / 2015-12-27
+=================
+ * [New] adds `Symbol.toPrimitive` support via `es-to-primitive`
+ * [Deps] update `is-callable`, `es-to-primitive`
+ * [Dev Deps] update `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`, `tape`
+ * [Tests] up to `node` `v5.3`
+
+1.4.3 / 2015-11-04
+=================
+ * [Fix] `ES6.ToNumber`: should give `NaN` for explicitly signed hex strings (#4)
+ * [Refactor] `ES6.ToNumber`: No need to double-trim
+ * [Refactor] group tests better
+ * [Tests] should still pass on `node` `v0.8`
+
+1.4.2 / 2015-11-02
+=================
+ * [Fix] ensure `ES.ToNumber` trims whitespace, and does not trim non-whitespace (#3)
+
+1.4.1 / 2015-10-31
+=================
+ * [Fix] ensure only 0-1 are valid binary and 0-7 are valid octal digits (#2)
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
+ * [Tests] on `node` `v5.0`
+ * [Tests] fix npm upgrades for older node versions
+ * package.json: use object form of "authors", add "contributors"
+
+1.4.0 / 2015-09-26
+=================
+ * [Deps] update `is-callable`
+ * [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config`
+ * [Tests] on `node` `v4.2`
+ * [New] Add `SameValueNonNumber` to ES7
+
+1.3.2 / 2015-09-26
+=================
+ * [Fix] Fix `ES6.IsRegExp` to properly handle `Symbol.match`, per spec.
+ * [Tests] up to `io.js` `v3.3`, `node` `v4.1`
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`
+
+1.3.1 / 2015-08-15
+=================
+ * [Fix] Ensure that objects that `toString` to a binary or octal literal also convert properly
+
+1.3.0 / 2015-08-15
+=================
+ * [New] ES6’s ToNumber now supports binary and octal literals.
+ * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`, `tape`
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+ * [Tests] up to `io.js` `v3.0`
+
+1.2.2 / 2015-07-28
+=================
+ * [Fix] Both `ES5.CheckObjectCoercible` and `ES6.RequireObjectCoercible` return the value if they don't throw.
+ * [Tests] Test on latest `io.js` versions.
+ * [Dev Deps] Update `eslint`, `jscs`, `tape`, `semver`, `covert`, `nsp`
+
+1.2.1 / 2015-03-20
+=================
+ * Fix `isFinite` helper.
+
+1.2.0 / 2015-03-19
+=================
+ * Use `es-to-primitive` for ToPrimitive methods.
+ * Test on latest `io.js` versions; allow failures on all but 2 latest `node`/`io.js` versions.
+
+1.1.2 / 2015-03-20
+=================
+ * Fix isFinite helper.
+
+1.1.1 / 2015-03-19
+=================
+ * Fix isPrimitive check for functions
+ * Update `eslint`, `editorconfig-tools`, `semver`, `nsp`
+
+1.1.0 / 2015-02-17
+=================
+ * Add ES7 export (non-default).
+ * All grade A-supported `node`/`iojs` versions now ship with an `npm` that understands `^`.
+ * Test on `iojs-v1.2`.
+
+1.0.1 / 2015-01-30
+=================
+ * Use `is-callable` instead of an internal function.
+ * Update `tape`, `jscs`, `nsp`, `eslint`
+
+1.0.0 / 2015-01-10
+=================
+ * v1.0.0
diff --git a/node_modules/es-abstract/LICENSE b/node_modules/es-abstract/LICENSE
new file mode 100644
index 0000000..8c271c1
--- /dev/null
+++ b/node_modules/es-abstract/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (C) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/es-abstract/Makefile b/node_modules/es-abstract/Makefile
new file mode 100644
index 0000000..959bbd4
--- /dev/null
+++ b/node_modules/es-abstract/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js */*.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/es-abstract/README.md b/node_modules/es-abstract/README.md
new file mode 100644
index 0000000..0cee598
--- /dev/null
+++ b/node_modules/es-abstract/README.md
@@ -0,0 +1,44 @@
+#es-abstract [![Version Badge][npm-version-svg]][package-url]
+
+[![Build Status][travis-svg]][travis-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+[![browser support][testling-svg]][testling-url]
+
+ECMAScript spec abstract operations.
+When different versions of the spec conflict, the default export will be the latest version of the abstract operation.
+All abstract operations will also be available under an `es5`/`es6`/`es7` exported property if you require a specific version.
+
+## Example
+
+```js
+var ES = require('es-abstract');
+var assert = require('assert');
+
+assert(ES.isCallable(function () {}));
+assert(!ES.isCallable(/a/g));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/es-abstract
+[npm-version-svg]: http://versionbadg.es/ljharb/es-abstract.svg
+[travis-svg]: https://travis-ci.org/ljharb/es-abstract.svg
+[travis-url]: https://travis-ci.org/ljharb/es-abstract
+[deps-svg]: https://david-dm.org/ljharb/es-abstract.svg
+[deps-url]: https://david-dm.org/ljharb/es-abstract
+[dev-deps-svg]: https://david-dm.org/ljharb/es-abstract/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/es-abstract#info=devDependencies
+[testling-svg]: https://ci.testling.com/ljharb/es-abstract.png
+[testling-url]: https://ci.testling.com/ljharb/es-abstract
+[npm-badge-png]: https://nodei.co/npm/es-abstract.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/es-abstract.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/es-abstract.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=es-abstract
diff --git a/node_modules/es-abstract/es5.js b/node_modules/es-abstract/es5.js
new file mode 100644
index 0000000..4bfad8d
--- /dev/null
+++ b/node_modules/es-abstract/es5.js
@@ -0,0 +1,86 @@
+'use strict';
+
+var $isNaN = require('./helpers/isNaN');
+var $isFinite = require('./helpers/isFinite');
+
+var sign = require('./helpers/sign');
+var mod = require('./helpers/mod');
+
+var IsCallable = require('is-callable');
+var toPrimitive = require('es-to-primitive/es5');
+
+// https://es5.github.io/#x9
+var ES5 = {
+ ToPrimitive: toPrimitive,
+
+ ToBoolean: function ToBoolean(value) {
+ return Boolean(value);
+ },
+ ToNumber: function ToNumber(value) {
+ return Number(value);
+ },
+ ToInteger: function ToInteger(value) {
+ var number = this.ToNumber(value);
+ if ($isNaN(number)) { return 0; }
+ if (number === 0 || !$isFinite(number)) { return number; }
+ return sign(number) * Math.floor(Math.abs(number));
+ },
+ ToInt32: function ToInt32(x) {
+ return this.ToNumber(x) >> 0;
+ },
+ ToUint32: function ToUint32(x) {
+ return this.ToNumber(x) >>> 0;
+ },
+ ToUint16: function ToUint16(value) {
+ var number = this.ToNumber(value);
+ if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+ var posInt = sign(number) * Math.floor(Math.abs(number));
+ return mod(posInt, 0x10000);
+ },
+ ToString: function ToString(value) {
+ return String(value);
+ },
+ ToObject: function ToObject(value) {
+ this.CheckObjectCoercible(value);
+ return Object(value);
+ },
+ CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
+ /* jshint eqnull:true */
+ if (value == null) {
+ throw new TypeError(optMessage || 'Cannot call method on ' + value);
+ }
+ return value;
+ },
+ IsCallable: IsCallable,
+ SameValue: function SameValue(x, y) {
+ if (x === y) { // 0 === -0, but they are not identical.
+ if (x === 0) { return 1 / x === 1 / y; }
+ return true;
+ }
+ return $isNaN(x) && $isNaN(y);
+ },
+
+ // http://www.ecma-international.org/ecma-262/5.1/#sec-8
+ Type: function Type(x) {
+ if (x === null) {
+ return 'Null';
+ }
+ if (typeof x === 'undefined') {
+ return 'Undefined';
+ }
+ if (typeof x === 'function' || typeof x === 'object') {
+ return 'Object';
+ }
+ if (typeof x === 'number') {
+ return 'Number';
+ }
+ if (typeof x === 'boolean') {
+ return 'Boolean';
+ }
+ if (typeof x === 'string') {
+ return 'String';
+ }
+ }
+};
+
+module.exports = ES5;
diff --git a/node_modules/es-abstract/es6.js b/node_modules/es-abstract/es6.js
new file mode 100644
index 0000000..39ac0d8
--- /dev/null
+++ b/node_modules/es-abstract/es6.js
@@ -0,0 +1,261 @@
+'use strict';
+
+var toStr = Object.prototype.toString;
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+var symbolToStr = hasSymbols ? Symbol.prototype.toString : toStr;
+
+var $isNaN = require('./helpers/isNaN');
+var $isFinite = require('./helpers/isFinite');
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
+
+var assign = require('./helpers/assign');
+var sign = require('./helpers/sign');
+var mod = require('./helpers/mod');
+var isPrimitive = require('./helpers/isPrimitive');
+var toPrimitive = require('es-to-primitive/es6');
+var parseInteger = parseInt;
+var bind = require('function-bind');
+var strSlice = bind.call(Function.call, String.prototype.slice);
+var isBinary = bind.call(Function.call, RegExp.prototype.test, /^0b[01]+$/i);
+var isOctal = bind.call(Function.call, RegExp.prototype.test, /^0o[0-7]+$/i);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = bind.call(Function.call, RegExp.prototype.test, nonWSregex);
+var invalidHexLiteral = /^[\-\+]0x[0-9a-f]+$/i;
+var isInvalidHexLiteral = bind.call(Function.call, RegExp.prototype.test, invalidHexLiteral);
+
+// whitespace from: http://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+ '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+ '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+ '\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var replace = bind.call(Function.call, String.prototype.replace);
+var trim = function (value) {
+ return replace(value, trimRegex, '');
+};
+
+var ES5 = require('./es5');
+
+var hasRegExpMatcher = require('is-regex');
+
+// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
+var ES6 = assign(assign({}, ES5), {
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
+ Call: function Call(F, V) {
+ var args = arguments.length > 2 ? arguments[2] : [];
+ if (!this.IsCallable(F)) {
+ throw new TypeError(F + ' is not a function');
+ }
+ return F.apply(V, args);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
+ ToPrimitive: toPrimitive,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
+ // ToBoolean: ES5.ToBoolean,
+
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber
+ ToNumber: function ToNumber(argument) {
+ var value = isPrimitive(argument) ? argument : toPrimitive(argument, 'number');
+ if (typeof value === 'symbol') {
+ throw new TypeError('Cannot convert a Symbol value to a number');
+ }
+ if (typeof value === 'string') {
+ if (isBinary(value)) {
+ return this.ToNumber(parseInteger(strSlice(value, 2), 2));
+ } else if (isOctal(value)) {
+ return this.ToNumber(parseInteger(strSlice(value, 2), 8));
+ } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+ return NaN;
+ } else {
+ var trimmed = trim(value);
+ if (trimmed !== value) {
+ return this.ToNumber(trimmed);
+ }
+ }
+ }
+ return Number(value);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
+ // ToInteger: ES5.ToNumber,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
+ // ToInt32: ES5.ToInt32,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
+ // ToUint32: ES5.ToUint32,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
+ ToInt16: function ToInt16(argument) {
+ var int16bit = this.ToUint16(argument);
+ return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
+ // ToUint16: ES5.ToUint16,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
+ ToInt8: function ToInt8(argument) {
+ var int8bit = this.ToUint8(argument);
+ return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
+ ToUint8: function ToUint8(argument) {
+ var number = this.ToNumber(argument);
+ if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+ var posInt = sign(number) * Math.floor(Math.abs(number));
+ return mod(posInt, 0x100);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
+ ToUint8Clamp: function ToUint8Clamp(argument) {
+ var number = this.ToNumber(argument);
+ if ($isNaN(number) || number <= 0) { return 0; }
+ if (number >= 0xFF) { return 0xFF; }
+ var f = Math.floor(argument);
+ if (f + 0.5 < number) { return f + 1; }
+ if (number < f + 0.5) { return f; }
+ if (f % 2 !== 0) { return f + 1; }
+ return f;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
+ ToString: function ToString(argument) {
+ if (typeof argument === 'symbol') {
+ throw new TypeError('Cannot convert a Symbol value to a string');
+ }
+ return String(argument);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
+ ToObject: function ToObject(value) {
+ this.RequireObjectCoercible(value);
+ return Object(value);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
+ ToPropertyKey: function ToPropertyKey(argument) {
+ var key = this.ToPrimitive(argument, String);
+ return typeof key === 'symbol' ? symbolToStr.call(key) : this.ToString(key);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ ToLength: function ToLength(argument) {
+ var len = this.ToInteger(argument);
+ if (len <= 0) { return 0; } // includes converting -0 to +0
+ if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+ return len;
+ },
+
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+ CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
+ if (toStr.call(argument) !== '[object String]') {
+ throw new TypeError('must be a string');
+ }
+ if (argument === '-0') { return -0; }
+ var n = this.ToNumber(argument);
+ if (this.SameValue(this.ToString(n), argument)) { return n; }
+ return void 0;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
+ RequireObjectCoercible: ES5.CheckObjectCoercible,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
+ IsArray: Array.isArray || function IsArray(argument) {
+ return toStr.call(argument) === '[object Array]';
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
+ // IsCallable: ES5.IsCallable,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
+ IsConstructor: function IsConstructor(argument) {
+ return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
+ IsExtensible: function IsExtensible(obj) {
+ if (!Object.preventExtensions) { return true; }
+ if (isPrimitive(obj)) {
+ return false;
+ }
+ return Object.isExtensible(obj);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
+ IsInteger: function IsInteger(argument) {
+ if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+ return false;
+ }
+ var abs = Math.abs(argument);
+ return Math.floor(abs) === abs;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
+ IsPropertyKey: function IsPropertyKey(argument) {
+ return typeof argument === 'string' || typeof argument === 'symbol';
+ },
+
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-isregexp
+ IsRegExp: function IsRegExp(argument) {
+ if (!argument || typeof argument !== 'object') {
+ return false;
+ }
+ if (hasSymbols) {
+ var isRegExp = argument[Symbol.match];
+ if (typeof isRegExp !== 'undefined') {
+ return ES5.ToBoolean(isRegExp);
+ }
+ }
+ return hasRegExpMatcher(argument);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
+ // SameValue: ES5.SameValue,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
+ SameValueZero: function SameValueZero(x, y) {
+ return (x === y) || ($isNaN(x) && $isNaN(y));
+ },
+
+ Type: function Type(x) {
+ if (typeof x === 'symbol') {
+ return 'Symbol';
+ }
+ return ES5.Type(x);
+ },
+
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+ SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
+ if (this.Type(O) !== 'Object') {
+ throw new TypeError('Assertion failed: Type(O) is not Object');
+ }
+ var C = O.constructor;
+ if (typeof C === 'undefined') {
+ return defaultConstructor;
+ }
+ if (this.Type(C) !== 'Object') {
+ throw new TypeError('O.constructor is not an Object');
+ }
+ var S = hasSymbols && Symbol.species ? C[Symbol.species] : undefined;
+ if (S == null) {
+ return defaultConstructor;
+ }
+ if (this.IsConstructor(S)) {
+ return S;
+ }
+ throw new TypeError('no constructor found');
+ }
+});
+
+delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
+
+module.exports = ES6;
diff --git a/node_modules/es-abstract/es7.js b/node_modules/es-abstract/es7.js
new file mode 100644
index 0000000..6c34e74
--- /dev/null
+++ b/node_modules/es-abstract/es7.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var ES6 = require('./es6');
+var assign = require('./helpers/assign');
+
+var ES7 = assign(ES6, {
+ // https://github.com/tc39/ecma262/pull/60
+ SameValueNonNumber: function SameValueNonNumber(x, y) {
+ if (typeof x === 'number' || typeof x !== typeof y) {
+ throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
+ }
+ return this.SameValue(x, y);
+ }
+});
+
+module.exports = ES7;
diff --git a/node_modules/es-abstract/helpers/assign.js b/node_modules/es-abstract/helpers/assign.js
new file mode 100644
index 0000000..7a4d2a5
--- /dev/null
+++ b/node_modules/es-abstract/helpers/assign.js
@@ -0,0 +1,9 @@
+var has = Object.prototype.hasOwnProperty;
+module.exports = Object.assign || function assign(target, source) {
+ for (var key in source) {
+ if (has.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ return target;
+};
diff --git a/node_modules/es-abstract/helpers/isFinite.js b/node_modules/es-abstract/helpers/isFinite.js
new file mode 100644
index 0000000..4658537
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isFinite.js
@@ -0,0 +1,3 @@
+var $isNaN = Number.isNaN || function (a) { return a !== a; };
+
+module.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
diff --git a/node_modules/es-abstract/helpers/isNaN.js b/node_modules/es-abstract/helpers/isNaN.js
new file mode 100644
index 0000000..e4d4f95
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isNaN.js
@@ -0,0 +1,3 @@
+module.exports = Number.isNaN || function isNaN(a) {
+ return a !== a;
+};
diff --git a/node_modules/es-abstract/helpers/isPrimitive.js b/node_modules/es-abstract/helpers/isPrimitive.js
new file mode 100644
index 0000000..3669156
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isPrimitive.js
@@ -0,0 +1,3 @@
+module.exports = function isPrimitive(value) {
+ return value === null || (typeof value !== 'function' && typeof value !== 'object');
+};
diff --git a/node_modules/es-abstract/helpers/mod.js b/node_modules/es-abstract/helpers/mod.js
new file mode 100644
index 0000000..5867fd9
--- /dev/null
+++ b/node_modules/es-abstract/helpers/mod.js
@@ -0,0 +1,4 @@
+module.exports = function mod(number, modulo) {
+ var remain = number % modulo;
+ return Math.floor(remain >= 0 ? remain : remain + modulo);
+};
diff --git a/node_modules/es-abstract/helpers/sign.js b/node_modules/es-abstract/helpers/sign.js
new file mode 100644
index 0000000..2ac0bf1
--- /dev/null
+++ b/node_modules/es-abstract/helpers/sign.js
@@ -0,0 +1,3 @@
+module.exports = function sign(number) {
+ return number >= 0 ? 1 : -1;
+};
diff --git a/node_modules/es-abstract/index.js b/node_modules/es-abstract/index.js
new file mode 100644
index 0000000..bf4265b
--- /dev/null
+++ b/node_modules/es-abstract/index.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var assign = require('./helpers/assign');
+
+var ES5 = require('./es5');
+var ES6 = require('./es6');
+var ES7 = require('./es7');
+
+var ES = {
+ ES5: ES5,
+ ES6: ES6,
+ ES7: ES7
+};
+assign(ES, ES5);
+delete ES.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
+assign(ES, ES6);
+
+module.exports = ES;
diff --git a/node_modules/es-abstract/package.json b/node_modules/es-abstract/package.json
new file mode 100644
index 0000000..ef1b5e1
--- /dev/null
+++ b/node_modules/es-abstract/package.json
@@ -0,0 +1,153 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "es-abstract@^1.5.0",
+ "scope": null,
+ "escapedName": "es-abstract",
+ "name": "es-abstract",
+ "rawSpec": "^1.5.0",
+ "spec": ">=1.5.0 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/string.prototype.trim"
+ ]
+ ],
+ "_from": "es-abstract@>=1.5.0 <2.0.0",
+ "_id": "es-abstract@1.6.1",
+ "_inCache": true,
+ "_location": "/es-abstract",
+ "_nodeVersion": "6.4.0",
+ "_npmOperationalInternal": {
+ "host": "packages-12-west.internal.npmjs.com",
+ "tmp": "tmp/es-abstract-1.6.1.tgz_1471771582713_0.02050940808840096"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.10.3",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "es-abstract@^1.5.0",
+ "scope": null,
+ "escapedName": "es-abstract",
+ "name": "es-abstract",
+ "rawSpec": "^1.5.0",
+ "spec": ">=1.5.0 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/string.prototype.trim"
+ ],
+ "_resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.6.1.tgz",
+ "_shasum": "bb8a2064120abcf928a086ea3d9043114285ec99",
+ "_shrinkwrap": null,
+ "_spec": "es-abstract@^1.5.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/string.prototype.trim",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/es-abstract/issues"
+ },
+ "contributors": [
+ {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ }
+ ],
+ "dependencies": {
+ "es-to-primitive": "^1.1.1",
+ "function-bind": "^1.1.0",
+ "is-callable": "^1.1.3",
+ "is-regex": "^1.0.3"
+ },
+ "description": "ECMAScript spec abstract operations.",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^7.0.0",
+ "covert": "^1.1.0",
+ "editorconfig-tools": "^0.1.1",
+ "eslint": "^3.3.1",
+ "foreach": "^2.0.5",
+ "jscs": "^3.0.7",
+ "nsp": "^2.6.1",
+ "object-is": "^1.0.1",
+ "replace": "^0.3.0",
+ "safe-publish-latest": "^1.0.1",
+ "semver": "^5.3.0",
+ "tape": "^4.6.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "bb8a2064120abcf928a086ea3d9043114285ec99",
+ "tarball": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.6.1.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "26816c72c26914c9d55cadde812e0b1dd7ca1fe4",
+ "homepage": "https://github.com/ljharb/es-abstract#readme",
+ "keywords": [
+ "ECMAScript",
+ "ES",
+ "abstract",
+ "operation",
+ "abstract operation",
+ "JavaScript",
+ "ES5",
+ "ES6",
+ "ES7"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "es-abstract",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/es-abstract.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "eccheck": "editorconfig-tools check *.js **/*.js > /dev/null",
+ "eslint": "eslint test/*.js *.js",
+ "jscs": "jscs test/*.js *.js",
+ "lint": "npm run --silent jscs && npm run --silent eslint",
+ "posttest": "npm run --silent security",
+ "prepublish": "safe-publish-latest",
+ "pretest": "npm run --silent lint",
+ "security": "nsp check",
+ "test": "npm run tests-only",
+ "tests-only": "node test/index.js"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.6.1"
+}
diff --git a/node_modules/es-abstract/test/.eslintrc b/node_modules/es-abstract/test/.eslintrc
new file mode 100644
index 0000000..d701945
--- /dev/null
+++ b/node_modules/es-abstract/test/.eslintrc
@@ -0,0 +1,10 @@
+{
+ "rules": {
+ "max-lines": 0,
+ "max-statements-per-line": [2, { "max": 3 }],
+ "max-nested-callbacks": [2, 3],
+ "max-statements": [2, 14],
+ "no-implicit-coercion": [1],
+ "no-invalid-this": [1]
+ }
+}
diff --git a/node_modules/es-abstract/test/es5.js b/node_modules/es-abstract/test/es5.js
new file mode 100644
index 0000000..7381b95
--- /dev/null
+++ b/node_modules/es-abstract/test/es5.js
@@ -0,0 +1,206 @@
+'use strict';
+
+var ES = require('../').ES5;
+var test = require('tape');
+
+var forEach = require('foreach');
+var is = require('object-is');
+
+var coercibleObject = { valueOf: function () { return '3'; }, toString: function () { return 42; } };
+var coercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return 42; } };
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var uncoercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return function toStrFn() {}; } };
+var objects = [{}, coercibleObject, toStringOnlyObject, valueOfOnlyObject];
+var numbers = [0, -0, Infinity, -Infinity, 42];
+var nonNullPrimitives = [true, false, 'foo', ''].concat(numbers);
+var primitives = [undefined, null].concat(nonNullPrimitives);
+
+test('ToPrimitive', function (t) {
+ t.test('primitives', function (st) {
+ var testPrimitive = function (primitive) {
+ st.ok(is(ES.ToPrimitive(primitive), primitive), primitive + ' is returned correctly');
+ };
+ forEach(primitives, testPrimitive);
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ st.equal(ES.ToPrimitive(coercibleObject), coercibleObject.valueOf(), 'coercibleObject coerces to valueOf');
+ st.equal(ES.ToPrimitive(coercibleObject, Number), coercibleObject.valueOf(), 'coercibleObject with hint Number coerces to valueOf');
+ st.equal(ES.ToPrimitive(coercibleObject, String), coercibleObject.toString(), 'coercibleObject with hint String coerces to toString');
+ st.equal(ES.ToPrimitive(coercibleFnObject), coercibleFnObject.toString(), 'coercibleFnObject coerces to toString');
+ st.equal(ES.ToPrimitive(toStringOnlyObject), toStringOnlyObject.toString(), 'toStringOnlyObject returns toString');
+ st.equal(ES.ToPrimitive(valueOfOnlyObject), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject returns valueOf');
+ st.equal(ES.ToPrimitive({}), '[object Object]', '{} with no hint coerces to Object#toString');
+ st.equal(ES.ToPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+ st.equal(ES.ToPrimitive({}, Number), '[object Object]', '{} with hint Number coerces to Object#toString');
+ st.throws(function () { return ES.ToPrimitive(uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ st.throws(function () { return ES.ToPrimitive(uncoercibleFnObject); }, TypeError, 'uncoercibleFnObject throws a TypeError');
+ st.end();
+ });
+
+ t.end();
+});
+
+test('ToBoolean', function (t) {
+ t.equal(false, ES.ToBoolean(undefined), 'undefined coerces to false');
+ t.equal(false, ES.ToBoolean(null), 'null coerces to false');
+ t.equal(false, ES.ToBoolean(false), 'false returns false');
+ t.equal(true, ES.ToBoolean(true), 'true returns true');
+ forEach([0, -0, NaN], function (falsyNumber) {
+ t.equal(false, ES.ToBoolean(falsyNumber), 'falsy number ' + falsyNumber + ' coerces to false');
+ });
+ forEach([Infinity, 42, 1, -Infinity], function (truthyNumber) {
+ t.equal(true, ES.ToBoolean(truthyNumber), 'truthy number ' + truthyNumber + ' coerces to true');
+ });
+ t.equal(false, ES.ToBoolean(''), 'empty string coerces to false');
+ t.equal(true, ES.ToBoolean('foo'), 'nonempty string coerces to true');
+ forEach(objects, function (obj) {
+ t.equal(true, ES.ToBoolean(obj), 'object coerces to true');
+ });
+ t.equal(true, ES.ToBoolean(uncoercibleObject), 'uncoercibleObject coerces to true');
+ t.end();
+});
+
+test('ToNumber', function (t) {
+ t.ok(is(NaN, ES.ToNumber(undefined)), 'undefined coerces to NaN');
+ t.ok(is(ES.ToNumber(null), 0), 'null coerces to +0');
+ t.ok(is(ES.ToNumber(false), 0), 'false coerces to +0');
+ t.equal(1, ES.ToNumber(true), 'true coerces to 1');
+ t.ok(is(NaN, ES.ToNumber(NaN)), 'NaN returns itself');
+ forEach([0, -0, 42, Infinity, -Infinity], function (num) {
+ t.equal(num, ES.ToNumber(num), num + ' returns itself');
+ });
+ forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+ t.ok(is(+numString, ES.ToNumber(numString)), '"' + numString + '" coerces to ' + Number(numString));
+ });
+ forEach(objects, function (object) {
+ t.ok(is(ES.ToNumber(object), ES.ToNumber(ES.ToPrimitive(object))), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+ });
+ t.throws(function () { return ES.ToNumber(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInteger', function (t) {
+ t.ok(is(0, ES.ToInteger(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity, 42], function (num) {
+ t.ok(is(num, ES.ToInteger(num)), num + ' returns itself');
+ t.ok(is(-num, ES.ToInteger(-num)), '-' + num + ' returns itself');
+ });
+ t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+ t.throws(function () { return ES.ToInteger(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInt32', function (t) {
+ t.ok(is(0, ES.ToInt32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt32(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt32(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt32(0x80000000), -0x80000000), '2^31 returns -2^31');
+ t.ok(is(ES.ToInt32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToInt32(num), ES.ToInt32(ES.ToUint32(num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToInt32(-num), ES.ToInt32(ES.ToUint32(-num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToUint32', function (t) {
+ t.ok(is(0, ES.ToUint32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint32(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint32(0x100000000 - 1), 0x100000000 - 1), '2^32 - 1 returns 2^32 - 1');
+ t.ok(is(ES.ToUint32(0x80000000), 0x80000000), '2^31 returns 2^31');
+ t.ok(is(ES.ToUint32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToUint32(num), ES.ToUint32(ES.ToInt32(num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToUint32(-num), ES.ToUint32(ES.ToInt32(-num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToUint16', function (t) {
+ t.ok(is(0, ES.ToUint16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint16(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint16(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint16(0x100000000 - 1), 0x10000 - 1), '2^32 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint16(0x80000000 - 1), 0x10000 - 1), '2^31 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint16(0x10000 - 1), 0x10000 - 1), '2^16 - 1 returns 2^16 - 1');
+ t.end();
+});
+
+test('ToString', function (t) {
+ t.throws(function () { return ES.ToString(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToObject', function (t) {
+ t.throws(function () { return ES.ToObject(undefined); }, TypeError, 'undefined throws');
+ t.throws(function () { return ES.ToObject(null); }, TypeError, 'null throws');
+ forEach(numbers, function (number) {
+ var obj = ES.ToObject(number);
+ t.equal(typeof obj, 'object', 'number ' + number + ' coerces to object');
+ t.equal(true, obj instanceof Number, 'object of ' + number + ' is Number object');
+ t.ok(is(obj.valueOf(), number), 'object of ' + number + ' coerces to ' + number);
+ });
+ t.end();
+});
+
+test('CheckObjectCoercible', function (t) {
+ t.throws(function () { return ES.CheckObjectCoercible(undefined); }, TypeError, 'undefined throws');
+ t.throws(function () { return ES.CheckObjectCoercible(null); }, TypeError, 'null throws');
+ var checkCoercible = function (value) {
+ t.doesNotThrow(function () { return ES.CheckObjectCoercible(value); }, '"' + value + '" does not throw');
+ };
+ forEach(objects.concat(nonNullPrimitives), checkCoercible);
+ t.end();
+});
+
+test('IsCallable', function (t) {
+ t.equal(true, ES.IsCallable(function () {}), 'function is callable');
+ var nonCallables = [/a/g, {}, Object.prototype, NaN].concat(primitives);
+ forEach(nonCallables, function (nonCallable) {
+ t.equal(false, ES.IsCallable(nonCallable), nonCallable + ' is not callable');
+ });
+ t.end();
+});
+
+test('SameValue', function (t) {
+ t.equal(true, ES.SameValue(NaN, NaN), 'NaN is SameValue as NaN');
+ t.equal(false, ES.SameValue(0, -0), '+0 is not SameValue as -0');
+ forEach(objects.concat(primitives), function (val) {
+ t.equal(val === val, ES.SameValue(val, val), '"' + val + '" is SameValue to itself');
+ });
+ t.end();
+});
+
+test('Type', function (t) {
+ t.equal(ES.Type(), 'Undefined', 'Type() is Undefined');
+ t.equal(ES.Type(undefined), 'Undefined', 'Type(undefined) is Undefined');
+ t.equal(ES.Type(null), 'Null', 'Type(null) is Null');
+ t.equal(ES.Type(true), 'Boolean', 'Type(true) is Boolean');
+ t.equal(ES.Type(false), 'Boolean', 'Type(false) is Boolean');
+ t.equal(ES.Type(0), 'Number', 'Type(0) is Number');
+ t.equal(ES.Type(NaN), 'Number', 'Type(NaN) is Number');
+ t.equal(ES.Type('abc'), 'String', 'Type("abc") is String');
+ t.equal(ES.Type(function () {}), 'Object', 'Type(function () {}) is Object');
+ t.equal(ES.Type({}), 'Object', 'Type({}) is Object');
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/es6.js b/node_modules/es-abstract/test/es6.js
new file mode 100644
index 0000000..7ac837b
--- /dev/null
+++ b/node_modules/es-abstract/test/es6.js
@@ -0,0 +1,544 @@
+'use strict';
+
+var ES = require('../').ES6;
+var test = require('tape');
+
+var forEach = require('foreach');
+var is = require('object-is');
+var debug = require('util').format;
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
+
+var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } };
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var objects = [{}, coercibleObject, toStringOnlyObject, valueOfOnlyObject];
+var numbers = [0, -0, Infinity, -Infinity, 42];
+var nonNullPrimitives = [true, false, 'foo', ''].concat(numbers);
+var primitives = [undefined, null].concat(nonNullPrimitives);
+
+test('ToPrimitive', function (t) {
+ t.test('primitives', function (st) {
+ var testPrimitive = function (primitive) {
+ st.ok(is(ES.ToPrimitive(primitive), primitive), primitive + ' is returned correctly');
+ };
+ forEach(primitives, testPrimitive);
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ st.equal(ES.ToPrimitive(coercibleObject), 3, 'coercibleObject with no hint coerces to valueOf');
+ st.ok(is(ES.ToPrimitive({}), '[object Object]'), '{} with no hint coerces to Object#toString');
+ st.equal(ES.ToPrimitive(coercibleObject, Number), 3, 'coercibleObject with hint Number coerces to valueOf');
+ st.ok(is(ES.ToPrimitive({}, Number), '[object Object]'), '{} with hint Number coerces to NaN');
+ st.equal(ES.ToPrimitive(coercibleObject, String), 42, 'coercibleObject with hint String coerces to nonstringified toString');
+ st.equal(ES.ToPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+ st.equal(ES.ToPrimitive(toStringOnlyObject), 7, 'toStringOnlyObject returns non-stringified toString');
+ st.equal(ES.ToPrimitive(valueOfOnlyObject), 4, 'valueOfOnlyObject returns valueOf');
+ st.throws(function () { return ES.ToPrimitive(uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ st.end();
+ });
+
+ t.end();
+});
+
+test('ToBoolean', function (t) {
+ t.equal(false, ES.ToBoolean(undefined), 'undefined coerces to false');
+ t.equal(false, ES.ToBoolean(null), 'null coerces to false');
+ t.equal(false, ES.ToBoolean(false), 'false returns false');
+ t.equal(true, ES.ToBoolean(true), 'true returns true');
+
+ t.test('numbers', function (st) {
+ forEach([0, -0, NaN], function (falsyNumber) {
+ st.equal(false, ES.ToBoolean(falsyNumber), 'falsy number ' + falsyNumber + ' coerces to false');
+ });
+ forEach([Infinity, 42, 1, -Infinity], function (truthyNumber) {
+ st.equal(true, ES.ToBoolean(truthyNumber), 'truthy number ' + truthyNumber + ' coerces to true');
+ });
+
+ st.end();
+ });
+
+ t.equal(false, ES.ToBoolean(''), 'empty string coerces to false');
+ t.equal(true, ES.ToBoolean('foo'), 'nonempty string coerces to true');
+
+ t.test('objects', function (st) {
+ forEach(objects, function (obj) {
+ st.equal(true, ES.ToBoolean(obj), 'object coerces to true');
+ });
+ st.equal(true, ES.ToBoolean(uncoercibleObject), 'uncoercibleObject coerces to true');
+
+ st.end();
+ });
+
+ t.end();
+});
+
+test('ToNumber', function (t) {
+ t.ok(is(NaN, ES.ToNumber(undefined)), 'undefined coerces to NaN');
+ t.ok(is(ES.ToNumber(null), 0), 'null coerces to +0');
+ t.ok(is(ES.ToNumber(false), 0), 'false coerces to +0');
+ t.equal(1, ES.ToNumber(true), 'true coerces to 1');
+
+ t.test('numbers', function (st) {
+ st.ok(is(NaN, ES.ToNumber(NaN)), 'NaN returns itself');
+ forEach([0, -0, 42, Infinity, -Infinity], function (num) {
+ st.equal(num, ES.ToNumber(num), num + ' returns itself');
+ });
+ forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+ st.ok(is(+numString, ES.ToNumber(numString)), '"' + numString + '" coerces to ' + Number(numString));
+ });
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ forEach(objects, function (object) {
+ st.ok(is(ES.ToNumber(object), ES.ToNumber(ES.ToPrimitive(object))), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+ });
+ st.throws(function () { return ES.ToNumber(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ st.end();
+ });
+
+ t.test('binary literals', function (st) {
+ st.equal(ES.ToNumber('0b10'), 2, '0b10 is 2');
+ st.equal(ES.ToNumber({ toString: function () { return '0b11'; } }), 3, 'Object that toStrings to 0b11 is 3');
+
+ st.equal(true, is(ES.ToNumber('0b12'), NaN), '0b12 is NaN');
+ st.equal(true, is(ES.ToNumber({ toString: function () { return '0b112'; } }), NaN), 'Object that toStrings to 0b112 is NaN');
+ st.end();
+ });
+
+ t.test('octal literals', function (st) {
+ st.equal(ES.ToNumber('0o10'), 8, '0o10 is 8');
+ st.equal(ES.ToNumber({ toString: function () { return '0o11'; } }), 9, 'Object that toStrings to 0o11 is 9');
+
+ st.equal(true, is(ES.ToNumber('0o18'), NaN), '0o18 is NaN');
+ st.equal(true, is(ES.ToNumber({ toString: function () { return '0o118'; } }), NaN), 'Object that toStrings to 0o118 is NaN');
+ st.end();
+ });
+
+ t.test('signed hex numbers', function (st) {
+ st.equal(true, is(ES.ToNumber('-0xF'), NaN), '-0xF is NaN');
+ st.equal(true, is(ES.ToNumber(' -0xF '), NaN), 'space-padded -0xF is NaN');
+ st.equal(true, is(ES.ToNumber('+0xF'), NaN), '+0xF is NaN');
+ st.equal(true, is(ES.ToNumber(' +0xF '), NaN), 'space-padded +0xF is NaN');
+
+ st.end();
+ });
+
+ t.test('trimming of whitespace and non-whitespace characters', function (st) {
+ var whitespace = ' \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000';
+ st.equal(0, ES.ToNumber(whitespace + 0 + whitespace), 'whitespace is trimmed');
+
+ // Zero-width space (zws), next line character (nel), and non-character (bom) are not whitespace.
+ var nonWhitespaces = {
+ '\\u0085': '\u0085',
+ '\\u200b': '\u200b',
+ '\\ufffe': '\ufffe'
+ };
+
+ forEach(nonWhitespaces, function (desc, nonWS) {
+ st.equal(true, is(ES.ToNumber(nonWS + 0 + nonWS), NaN), 'non-whitespace ' + desc + ' not trimmed');
+ });
+
+ st.end();
+ });
+
+ t.end();
+});
+
+test('ToInteger', function (t) {
+ t.ok(is(0, ES.ToInteger(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity, 42], function (num) {
+ t.ok(is(num, ES.ToInteger(num)), num + ' returns itself');
+ t.ok(is(-num, ES.ToInteger(-num)), '-' + num + ' returns itself');
+ });
+ t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+ t.throws(function () { return ES.ToInteger(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInt32', function (t) {
+ t.ok(is(0, ES.ToInt32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt32(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt32(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt32(0x80000000), -0x80000000), '2^31 returns -2^31');
+ t.ok(is(ES.ToInt32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToInt32(num), ES.ToInt32(ES.ToUint32(num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToInt32(-num), ES.ToInt32(ES.ToUint32(-num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToUint32', function (t) {
+ t.ok(is(0, ES.ToUint32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint32(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint32(0x100000000 - 1), 0x100000000 - 1), '2^32 - 1 returns 2^32 - 1');
+ t.ok(is(ES.ToUint32(0x80000000), 0x80000000), '2^31 returns 2^31');
+ t.ok(is(ES.ToUint32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToUint32(num), ES.ToUint32(ES.ToInt32(num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToUint32(-num), ES.ToUint32(ES.ToInt32(-num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToInt16', function (t) {
+ t.ok(is(0, ES.ToInt16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt16(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt16(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt16(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToInt16(0x80000000 - 1), -1), '2^31 - 1 returns -1');
+ t.ok(is(ES.ToInt16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToInt16(0x10000 - 1), -1), '2^16 - 1 returns -1');
+ t.end();
+});
+
+test('ToUint16', function (t) {
+ t.ok(is(0, ES.ToUint16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint16(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint16(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint16(0x100000000 - 1), 0x10000 - 1), '2^32 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint16(0x80000000 - 1), 0x10000 - 1), '2^31 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint16(0x10000 - 1), 0x10000 - 1), '2^16 - 1 returns 2^16 - 1');
+ t.end();
+});
+
+test('ToInt8', function (t) {
+ t.ok(is(0, ES.ToInt8(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt8(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt8(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt8(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt8(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt8(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToInt8(0x80000000 - 1), -1), '2^31 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToInt8(0x10000 - 1), -1), '2^16 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x100), 0), '2^8 returns +0');
+ t.ok(is(ES.ToInt8(0x100 - 1), -1), '2^8 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x10), 0x10), '2^4 returns 2^4');
+ t.end();
+});
+
+test('ToUint8', function (t) {
+ t.ok(is(0, ES.ToUint8(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint8(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint8(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint8(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint8(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint8(0x100000000 - 1), 0x100 - 1), '2^32 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint8(0x80000000 - 1), 0x100 - 1), '2^31 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint8(0x10000 - 1), 0x100 - 1), '2^16 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x100), 0), '2^8 returns +0');
+ t.ok(is(ES.ToUint8(0x100 - 1), 0x100 - 1), '2^8 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint8(0x10), 0x10), '2^4 returns 2^4');
+ t.ok(is(ES.ToUint8(0x10 - 1), 0x10 - 1), '2^4 - 1 returns 2^4 - 1');
+ t.end();
+});
+
+test('ToUint8Clamp', function (t) {
+ t.ok(is(0, ES.ToUint8Clamp(NaN)), 'NaN coerces to +0');
+ t.ok(is(0, ES.ToUint8Clamp(0)), '+0 returns +0');
+ t.ok(is(0, ES.ToUint8Clamp(-0)), '-0 returns +0');
+ t.ok(is(0, ES.ToUint8Clamp(-Infinity)), '-Infinity returns +0');
+ t.throws(function () { return ES.ToUint8Clamp(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ forEach([255, 256, 0x100000, Infinity], function (number) {
+ t.ok(is(255, ES.ToUint8Clamp(number)), number + ' coerces to 255');
+ });
+ t.equal(1, ES.ToUint8Clamp(1.49), '1.49 coerces to 1');
+ t.equal(2, ES.ToUint8Clamp(1.5), '1.5 coerces to 2, because 2 is even');
+ t.equal(2, ES.ToUint8Clamp(1.51), '1.51 coerces to 2');
+
+ t.equal(2, ES.ToUint8Clamp(2.49), '2.49 coerces to 2');
+ t.equal(2, ES.ToUint8Clamp(2.5), '2.5 coerces to 2, because 2 is even');
+ t.equal(3, ES.ToUint8Clamp(2.51), '2.51 coerces to 3');
+ t.end();
+});
+
+test('ToString', function (t) {
+ forEach(objects.concat(primitives), function (item) {
+ t.equal(ES.ToString(item), String(item), 'ES.ToString(' + debug(item) + ') ToStrings to String(' + debug(item) + ')');
+ });
+ t.throws(function () { return ES.ToString(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ if (hasSymbols) {
+ t.throws(function () { return ES.ToString(Symbol.iterator); }, TypeError, debug(Symbol.iterator) + ' throws');
+ }
+ t.end();
+});
+
+test('ToObject', function (t) {
+ t.throws(function () { return ES.ToObject(undefined); }, TypeError, 'undefined throws');
+ t.throws(function () { return ES.ToObject(null); }, TypeError, 'null throws');
+ forEach(numbers, function (number) {
+ var obj = ES.ToObject(number);
+ t.equal(typeof obj, 'object', 'number ' + number + ' coerces to object');
+ t.equal(true, obj instanceof Number, 'object of ' + number + ' is Number object');
+ t.ok(is(obj.valueOf(), number), 'object of ' + number + ' coerces to ' + number);
+ });
+ t.end();
+});
+
+test('RequireObjectCoercible', function (t) {
+ t.equal(false, 'CheckObjectCoercible' in ES, 'CheckObjectCoercible -> RequireObjectCoercible in ES6');
+ t.throws(function () { return ES.RequireObjectCoercible(undefined); }, TypeError, 'undefined throws');
+ t.throws(function () { return ES.RequireObjectCoercible(null); }, TypeError, 'null throws');
+ var doesNotThrow = function (value) {
+ t.doesNotThrow(function () { return ES.RequireObjectCoercible(value); }, '"' + value + '" does not throw');
+ };
+ forEach(objects.concat(nonNullPrimitives), doesNotThrow);
+ t.end();
+});
+
+test('IsCallable', function (t) {
+ t.equal(true, ES.IsCallable(function () {}), 'function is callable');
+ var nonCallables = [/a/g, {}, Object.prototype, NaN].concat(primitives);
+ forEach(nonCallables, function (nonCallable) {
+ t.equal(false, ES.IsCallable(nonCallable), nonCallable + ' is not callable');
+ });
+ t.end();
+});
+
+test('SameValue', function (t) {
+ t.equal(true, ES.SameValue(NaN, NaN), 'NaN is SameValue as NaN');
+ t.equal(false, ES.SameValue(0, -0), '+0 is not SameValue as -0');
+ forEach(objects.concat(primitives), function (val) {
+ t.equal(val === val, ES.SameValue(val, val), '"' + val + '" is SameValue to itself');
+ });
+ t.end();
+});
+
+test('SameValueZero', function (t) {
+ t.equal(true, ES.SameValueZero(NaN, NaN), 'NaN is SameValueZero as NaN');
+ t.equal(true, ES.SameValueZero(0, -0), '+0 is SameValueZero as -0');
+ forEach(objects.concat(primitives), function (val) {
+ t.equal(val === val, ES.SameValueZero(val, val), '"' + val + '" is SameValueZero to itself');
+ });
+ t.end();
+});
+
+test('ToPropertyKey', function (t) {
+ forEach(objects.concat(primitives), function (value) {
+ t.equal(ES.ToPropertyKey(value), String(value), 'ToPropertyKey(value) === String(value) for non-Symbols');
+ });
+ if (hasSymbols) {
+ t.equal(ES.ToPropertyKey(Symbol.iterator), 'Symbol(Symbol.iterator)', 'ToPropertyKey(Symbol.iterator) === "Symbol(Symbol.iterator)"');
+ }
+ t.end();
+});
+
+test('ToLength', function (t) {
+ t.throws(function () { return ES.ToLength(uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ t.equal(3, ES.ToLength(coercibleObject), 'coercibleObject coerces to 3');
+ t.equal(42, ES.ToLength('42.5'), '"42.5" coerces to 42');
+ t.equal(7, ES.ToLength(7.3), '7.3 coerces to 7');
+ forEach([-0, -1, -42, -Infinity], function (negative) {
+ t.ok(is(0, ES.ToLength(negative)), negative + ' coerces to +0');
+ });
+ t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 1), '2^53 coerces to 2^53 - 1');
+ t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 3), '2^53 + 2 coerces to 2^53 - 1');
+ t.end();
+});
+
+test('IsArray', function (t) {
+ t.equal(true, ES.IsArray([]), '[] is array');
+ t.equal(false, ES.IsArray({}), '{} is not array');
+ t.equal(false, ES.IsArray({ length: 1, 0: true }), 'arraylike object is not array');
+ forEach(objects.concat(primitives), function (value) {
+ t.equal(false, ES.IsArray(value), value + ' is not array');
+ });
+ t.end();
+});
+
+test('IsRegExp', function (t) {
+ forEach([/a/g, new RegExp('a', 'g')], function (regex) {
+ t.equal(true, ES.IsRegExp(regex), regex + ' is regex');
+ });
+ forEach(objects.concat(primitives), function (nonRegex) {
+ t.equal(false, ES.IsRegExp(nonRegex), nonRegex + ' is not regex');
+ });
+ t.test('Symbol.match', { skip: !hasSymbols || !Symbol.match }, function (st) {
+ var obj = {};
+ obj[Symbol.match] = true;
+ st.equal(true, ES.IsRegExp(obj), 'object with truthy Symbol.match is regex');
+
+ var regex = /a/;
+ regex[Symbol.match] = false;
+ st.equal(false, ES.IsRegExp(regex), 'regex with falsy Symbol.match is not regex');
+
+ st.end();
+ });
+ t.end();
+});
+
+test('IsPropertyKey', function (t) {
+ forEach(numbers.concat(objects), function (notKey) {
+ t.equal(false, ES.IsPropertyKey(notKey), notKey + ' is not property key');
+ });
+ t.equal(true, ES.IsPropertyKey('foo'), 'string is property key');
+ if (hasSymbols) {
+ t.equal(true, ES.IsPropertyKey(Symbol.iterator), 'Symbol.iterator is property key');
+ }
+ t.end();
+});
+
+test('IsInteger', function (t) {
+ for (var i = -100; i < 100; i += 10) {
+ t.equal(true, ES.IsInteger(i), i + ' is integer');
+ t.equal(false, ES.IsInteger(i + 0.2), (i + 0.2) + ' is not integer');
+ }
+ t.equal(true, ES.IsInteger(-0), '-0 is integer');
+ var notInts = objects.concat([Infinity, -Infinity, NaN, true, false, null, undefined, [], new Date()]);
+ if (hasSymbols) { notInts.push(Symbol.iterator); }
+ forEach(notInts, function (notInt) {
+ t.equal(false, ES.IsInteger(notInt), ES.ToPropertyKey(notInt) + ' is not integer');
+ });
+ t.equal(false, ES.IsInteger(uncoercibleObject), 'uncoercibleObject is not integer');
+ t.end();
+});
+
+test('IsExtensible', function (t) {
+ forEach(objects, function (object) {
+ t.equal(true, ES.IsExtensible(object), object + ' object is extensible');
+ });
+ forEach(primitives, function (primitive) {
+ t.equal(false, ES.IsExtensible(primitive), primitive + ' is not extensible');
+ });
+ if (Object.preventExtensions) {
+ t.equal(false, ES.IsExtensible(Object.preventExtensions({})), 'object with extensions prevented is not extensible');
+ }
+ t.end();
+});
+
+test('CanonicalNumericIndexString', function (t) {
+ var throwsOnNonString = function (notString) {
+ t.throws(function () { return ES.CanonicalNumericIndexString(notString); }, TypeError, notString + ' is not a string');
+ };
+ forEach(objects.concat(numbers), throwsOnNonString);
+ t.ok(is(-0, ES.CanonicalNumericIndexString('-0')), '"-0" returns -0');
+ for (var i = -50; i < 50; i += 10) {
+ t.equal(i, ES.CanonicalNumericIndexString(String(i)), '"' + i + '" returns ' + i);
+ t.equal(undefined, ES.CanonicalNumericIndexString(String(i) + 'a'), '"' + i + 'a" returns undefined');
+ }
+ t.end();
+});
+
+test('IsConstructor', function (t) {
+ t.equal(true, ES.IsConstructor(function () {}), 'function is constructor');
+ t.equal(false, ES.IsConstructor(/a/g), 'regex is not constructor');
+ forEach(objects, function (object) {
+ t.equal(false, ES.IsConstructor(object), object + ' object is not constructor');
+ });
+
+ try {
+ var foo = Function('return class Foo {}')(); // eslint-disable-line no-new-func
+ t.equal(ES.IsConstructor(foo), true, 'class is constructor');
+ } catch (e) {
+ t.comment('SKIP: class syntax not supported.');
+ }
+ t.end();
+});
+
+test('Call', function (t) {
+ var receiver = {};
+ var notFuncs = objects.concat(primitives).concat([/a/g, new RegExp('a', 'g')]);
+ t.plan(notFuncs.length + 4);
+ var throwsOnCall = function (notFunc) {
+ t.throws(function () { return ES.Call(notFunc, receiver); }, TypeError, notFunc + ' (' + typeof notFunc + ') is not callable');
+ };
+ forEach(notFuncs, throwsOnCall);
+ ES.Call(function (a, b) {
+ t.equal(this, receiver, 'context matches expected');
+ t.deepEqual([a, b], [1, 2], 'named args are correct');
+ t.equal(arguments.length, 3, 'extra argument was passed');
+ t.equal(arguments[2], 3, 'extra argument was correct');
+ }, receiver, [1, 2, 3]);
+ t.end();
+});
+
+test('Type', { skip: !hasSymbols }, function (t) {
+ t.equal(ES.Type(Symbol.iterator), 'Symbol', 'Type(Symbol.iterator) is Symbol');
+ t.end();
+});
+
+test('SpeciesConstructor', function (t) {
+ t.throws(function () { ES.SpeciesConstructor(null); }, TypeError);
+ t.throws(function () { ES.SpeciesConstructor(undefined); }, TypeError);
+
+ var defaultConstructor = function Foo() {};
+
+ t.equal(
+ ES.SpeciesConstructor({ constructor: undefined }, defaultConstructor),
+ defaultConstructor,
+ 'undefined constructor returns defaultConstructor'
+ );
+
+ t.throws(
+ function () { return ES.SpeciesConstructor({ constructor: null }, defaultConstructor); },
+ TypeError,
+ 'non-undefined non-object constructor throws'
+ );
+
+ var Bar = function Bar() {};
+ var hasSpecies = hasSymbols && Symbol.species;
+ if (hasSpecies) {
+ Bar[Symbol.species] = null;
+ }
+ t.equal(
+ ES.SpeciesConstructor(new Bar(), defaultConstructor),
+ defaultConstructor,
+ 'undefined/null Symbol.species returns default constructor'
+ );
+
+ t.test('with Symbol.species', { skip: !hasSpecies }, function (st) {
+ var Baz = function Baz() {};
+ Baz[Symbol.species] = Bar;
+ st.equal(
+ ES.SpeciesConstructor(new Baz(), defaultConstructor),
+ Bar,
+ 'returns Symbol.species constructor value'
+ );
+
+ Baz[Symbol.species] = {};
+ st.throws(
+ function () { ES.SpeciesConstructor(new Baz(), defaultConstructor); },
+ TypeError,
+ 'throws when non-constructor non-null non-undefined species value found'
+ );
+
+ st.end();
+ });
+
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/es7.js b/node_modules/es-abstract/test/es7.js
new file mode 100644
index 0000000..b2836bb
--- /dev/null
+++ b/node_modules/es-abstract/test/es7.js
@@ -0,0 +1,419 @@
+'use strict';
+
+var ES = require('../').ES7;
+var test = require('tape');
+
+var forEach = require('foreach');
+var is = require('object-is');
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
+
+var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } };
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var objects = [{}, coercibleObject, toStringOnlyObject, valueOfOnlyObject];
+var numbers = [0, -0, Infinity, -Infinity, 42];
+var nullPrimitives = [undefined, null];
+var nonNullNonNumberPrimitives = [true, false, 'foo', ''];
+var nonNullPrimitives = nonNullNonNumberPrimitives.concat(numbers);
+var nonNumberPrimitives = nullPrimitives.concat(nonNullNonNumberPrimitives);
+var primitives = nullPrimitives.concat(nonNullPrimitives);
+
+test('ToPrimitive', function (t) {
+ t.test('primitives', function (st) {
+ var testPrimitive = function (primitive) {
+ st.ok(is(ES.ToPrimitive(primitive), primitive), primitive + ' is returned correctly');
+ };
+ forEach(primitives, testPrimitive);
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ st.equal(ES.ToPrimitive(coercibleObject), 3, 'coercibleObject with no hint coerces to valueOf');
+ st.ok(is(ES.ToPrimitive({}), '[object Object]'), '{} with no hint coerces to Object#toString');
+ st.equal(ES.ToPrimitive(coercibleObject, Number), 3, 'coercibleObject with hint Number coerces to valueOf');
+ st.ok(is(ES.ToPrimitive({}, Number), '[object Object]'), '{} with hint Number coerces to NaN');
+ st.equal(ES.ToPrimitive(coercibleObject, String), 42, 'coercibleObject with hint String coerces to nonstringified toString');
+ st.equal(ES.ToPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+ st.equal(ES.ToPrimitive(toStringOnlyObject), 7, 'toStringOnlyObject returns non-stringified toString');
+ st.equal(ES.ToPrimitive(valueOfOnlyObject), 4, 'valueOfOnlyObject returns valueOf');
+ st.throws(function () { return ES.ToPrimitive(uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ st.end();
+ });
+
+ t.end();
+});
+
+test('ToBoolean', function (t) {
+ t.equal(false, ES.ToBoolean(undefined), 'undefined coerces to false');
+ t.equal(false, ES.ToBoolean(null), 'null coerces to false');
+ t.equal(false, ES.ToBoolean(false), 'false returns false');
+ t.equal(true, ES.ToBoolean(true), 'true returns true');
+ forEach([0, -0, NaN], function (falsyNumber) {
+ t.equal(false, ES.ToBoolean(falsyNumber), 'falsy number ' + falsyNumber + ' coerces to false');
+ });
+ forEach([Infinity, 42, 1, -Infinity], function (truthyNumber) {
+ t.equal(true, ES.ToBoolean(truthyNumber), 'truthy number ' + truthyNumber + ' coerces to true');
+ });
+ t.equal(false, ES.ToBoolean(''), 'empty string coerces to false');
+ t.equal(true, ES.ToBoolean('foo'), 'nonempty string coerces to true');
+ forEach(objects, function (obj) {
+ t.equal(true, ES.ToBoolean(obj), 'object coerces to true');
+ });
+ t.equal(true, ES.ToBoolean(uncoercibleObject), 'uncoercibleObject coerces to true');
+ t.end();
+});
+
+test('ToNumber', function (t) {
+ t.ok(is(NaN, ES.ToNumber(undefined)), 'undefined coerces to NaN');
+ t.ok(is(ES.ToNumber(null), 0), 'null coerces to +0');
+ t.ok(is(ES.ToNumber(false), 0), 'false coerces to +0');
+ t.equal(1, ES.ToNumber(true), 'true coerces to 1');
+ t.ok(is(NaN, ES.ToNumber(NaN)), 'NaN returns itself');
+ forEach([0, -0, 42, Infinity, -Infinity], function (num) {
+ t.equal(num, ES.ToNumber(num), num + ' returns itself');
+ });
+ forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+ t.ok(is(+numString, ES.ToNumber(numString)), '"' + numString + '" coerces to ' + Number(numString));
+ });
+ forEach(objects, function (object) {
+ t.ok(is(ES.ToNumber(object), ES.ToNumber(ES.ToPrimitive(object))), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+ });
+ t.throws(function () { return ES.ToNumber(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInteger', function (t) {
+ t.ok(is(0, ES.ToInteger(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity, 42], function (num) {
+ t.ok(is(num, ES.ToInteger(num)), num + ' returns itself');
+ t.ok(is(-num, ES.ToInteger(-num)), '-' + num + ' returns itself');
+ });
+ t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+ t.throws(function () { return ES.ToInteger(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInt32', function (t) {
+ t.ok(is(0, ES.ToInt32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt32(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt32(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt32(0x80000000), -0x80000000), '2^31 returns -2^31');
+ t.ok(is(ES.ToInt32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToInt32(num), ES.ToInt32(ES.ToUint32(num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToInt32(-num), ES.ToInt32(ES.ToUint32(-num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToUint32', function (t) {
+ t.ok(is(0, ES.ToUint32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint32(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint32(0x100000000 - 1), 0x100000000 - 1), '2^32 - 1 returns 2^32 - 1');
+ t.ok(is(ES.ToUint32(0x80000000), 0x80000000), '2^31 returns 2^31');
+ t.ok(is(ES.ToUint32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToUint32(num), ES.ToUint32(ES.ToInt32(num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToUint32(-num), ES.ToUint32(ES.ToInt32(-num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToInt16', function (t) {
+ t.ok(is(0, ES.ToInt16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt16(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt16(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt16(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToInt16(0x80000000 - 1), -1), '2^31 - 1 returns -1');
+ t.ok(is(ES.ToInt16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToInt16(0x10000 - 1), -1), '2^16 - 1 returns -1');
+ t.end();
+});
+
+test('ToUint16', function (t) {
+ t.ok(is(0, ES.ToUint16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint16(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint16(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint16(0x100000000 - 1), 0x10000 - 1), '2^32 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint16(0x80000000 - 1), 0x10000 - 1), '2^31 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint16(0x10000 - 1), 0x10000 - 1), '2^16 - 1 returns 2^16 - 1');
+ t.end();
+});
+
+test('ToInt8', function (t) {
+ t.ok(is(0, ES.ToInt8(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt8(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt8(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToInt8(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt8(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt8(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToInt8(0x80000000 - 1), -1), '2^31 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToInt8(0x10000 - 1), -1), '2^16 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x100), 0), '2^8 returns +0');
+ t.ok(is(ES.ToInt8(0x100 - 1), -1), '2^8 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x10), 0x10), '2^4 returns 2^4');
+ t.end();
+});
+
+test('ToUint8', function (t) {
+ t.ok(is(0, ES.ToUint8(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint8(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint8(-num)), '-' + num + ' returns +0');
+ });
+ t.throws(function () { return ES.ToUint8(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint8(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint8(0x100000000 - 1), 0x100 - 1), '2^32 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint8(0x80000000 - 1), 0x100 - 1), '2^31 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint8(0x10000 - 1), 0x100 - 1), '2^16 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x100), 0), '2^8 returns +0');
+ t.ok(is(ES.ToUint8(0x100 - 1), 0x100 - 1), '2^8 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint8(0x10), 0x10), '2^4 returns 2^4');
+ t.ok(is(ES.ToUint8(0x10 - 1), 0x10 - 1), '2^4 - 1 returns 2^4 - 1');
+ t.end();
+});
+
+test('ToUint8Clamp', function (t) {
+ t.ok(is(0, ES.ToUint8Clamp(NaN)), 'NaN coerces to +0');
+ t.ok(is(0, ES.ToUint8Clamp(0)), '+0 returns +0');
+ t.ok(is(0, ES.ToUint8Clamp(-0)), '-0 returns +0');
+ t.ok(is(0, ES.ToUint8Clamp(-Infinity)), '-Infinity returns +0');
+ t.throws(function () { return ES.ToUint8Clamp(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ forEach([255, 256, 0x100000, Infinity], function (number) {
+ t.ok(is(255, ES.ToUint8Clamp(number)), number + ' coerces to 255');
+ });
+ t.equal(1, ES.ToUint8Clamp(1.49), '1.49 coerces to 1');
+ t.equal(2, ES.ToUint8Clamp(1.5), '1.5 coerces to 2, because 2 is even');
+ t.equal(2, ES.ToUint8Clamp(1.51), '1.51 coerces to 2');
+
+ t.equal(2, ES.ToUint8Clamp(2.49), '2.49 coerces to 2');
+ t.equal(2, ES.ToUint8Clamp(2.5), '2.5 coerces to 2, because 2 is even');
+ t.equal(3, ES.ToUint8Clamp(2.51), '2.51 coerces to 3');
+ t.end();
+});
+
+test('ToString', function (t) {
+ t.throws(function () { return ES.ToString(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToObject', function (t) {
+ t.throws(function () { return ES.ToObject(undefined); }, TypeError, 'undefined throws');
+ t.throws(function () { return ES.ToObject(null); }, TypeError, 'null throws');
+ forEach(numbers, function (number) {
+ var obj = ES.ToObject(number);
+ t.equal(typeof obj, 'object', 'number ' + number + ' coerces to object');
+ t.equal(true, obj instanceof Number, 'object of ' + number + ' is Number object');
+ t.ok(is(obj.valueOf(), number), 'object of ' + number + ' coerces to ' + number);
+ });
+ t.end();
+});
+
+test('RequireObjectCoercible', function (t) {
+ t.equal(false, 'CheckObjectCoercible' in ES, 'CheckObjectCoercible -> RequireObjectCoercible in ES6');
+ t.throws(function () { return ES.RequireObjectCoercible(undefined); }, TypeError, 'undefined throws');
+ t.throws(function () { return ES.RequireObjectCoercible(null); }, TypeError, 'null throws');
+ var isCoercible = function (value) {
+ t.doesNotThrow(function () { return ES.RequireObjectCoercible(value); }, '"' + value + '" does not throw');
+ };
+ forEach(objects.concat(nonNullPrimitives), isCoercible);
+ t.end();
+});
+
+test('IsCallable', function (t) {
+ t.equal(true, ES.IsCallable(function () {}), 'function is callable');
+ var nonCallables = [/a/g, {}, Object.prototype, NaN].concat(primitives);
+ forEach(nonCallables, function (nonCallable) {
+ t.equal(false, ES.IsCallable(nonCallable), nonCallable + ' is not callable');
+ });
+ t.end();
+});
+
+test('SameValue', function (t) {
+ t.equal(true, ES.SameValue(NaN, NaN), 'NaN is SameValue as NaN');
+ t.equal(false, ES.SameValue(0, -0), '+0 is not SameValue as -0');
+ forEach(objects.concat(primitives), function (val) {
+ t.equal(val === val, ES.SameValue(val, val), '"' + val + '" is SameValue to itself');
+ });
+ t.end();
+});
+
+test('SameValueZero', function (t) {
+ t.equal(true, ES.SameValueZero(NaN, NaN), 'NaN is SameValueZero as NaN');
+ t.equal(true, ES.SameValueZero(0, -0), '+0 is SameValueZero as -0');
+ forEach(objects.concat(primitives), function (val) {
+ t.equal(val === val, ES.SameValueZero(val, val), '"' + val + '" is SameValueZero to itself');
+ });
+ t.end();
+});
+
+test('ToPropertyKey', function (t) {
+ forEach(objects.concat(primitives), function (value) {
+ t.equal(ES.ToPropertyKey(value), String(value), 'ToPropertyKey(value) === String(value) for non-Symbols');
+ });
+ if (hasSymbols) {
+ t.equal(ES.ToPropertyKey(Symbol.iterator), 'Symbol(Symbol.iterator)', 'ToPropertyKey(Symbol.iterator) === "Symbol(Symbol.iterator)"');
+ }
+ t.end();
+});
+
+test('ToLength', function (t) {
+ t.throws(function () { return ES.ToLength(uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ t.equal(3, ES.ToLength(coercibleObject), 'coercibleObject coerces to 3');
+ t.equal(42, ES.ToLength('42.5'), '"42.5" coerces to 42');
+ t.equal(7, ES.ToLength(7.3), '7.3 coerces to 7');
+ forEach([-0, -1, -42, -Infinity], function (negative) {
+ t.ok(is(0, ES.ToLength(negative)), negative + ' coerces to +0');
+ });
+ t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 1), '2^53 coerces to 2^53 - 1');
+ t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 3), '2^53 + 2 coerces to 2^53 - 1');
+ t.end();
+});
+
+test('IsArray', function (t) {
+ t.equal(true, ES.IsArray([]), '[] is array');
+ t.equal(false, ES.IsArray({}), '{} is not array');
+ t.equal(false, ES.IsArray({ length: 1, 0: true }), 'arraylike object is not array');
+ forEach(objects.concat(primitives), function (value) {
+ t.equal(false, ES.IsArray(value), value + ' is not array');
+ });
+ t.end();
+});
+
+test('IsRegExp', function (t) {
+ forEach([/a/g, new RegExp('a', 'g')], function (regex) {
+ t.equal(true, ES.IsRegExp(regex), regex + ' is regex');
+ });
+ forEach(objects.concat(primitives), function (nonRegex) {
+ t.equal(false, ES.IsRegExp(nonRegex), nonRegex + ' is not regex');
+ });
+ t.end();
+});
+
+test('IsPropertyKey', function (t) {
+ forEach(numbers.concat(objects), function (notKey) {
+ t.equal(false, ES.IsPropertyKey(notKey), notKey + ' is not property key');
+ });
+ t.equal(true, ES.IsPropertyKey('foo'), 'string is property key');
+ if (hasSymbols) {
+ t.equal(true, ES.IsPropertyKey(Symbol.iterator), 'Symbol.iterator is property key');
+ }
+ t.end();
+});
+
+test('IsInteger', function (t) {
+ for (var i = -100; i < 100; i += 10) {
+ t.equal(true, ES.IsInteger(i), i + ' is integer');
+ t.equal(false, ES.IsInteger(i + 0.2), (i + 0.2) + ' is not integer');
+ }
+ t.equal(true, ES.IsInteger(-0), '-0 is integer');
+ var notInts = objects.concat([Infinity, -Infinity, NaN, true, false, null, undefined, [], new Date()]);
+ if (hasSymbols) { notInts.push(Symbol.iterator); }
+ forEach(notInts, function (notInt) {
+ t.equal(false, ES.IsInteger(notInt), ES.ToPropertyKey(notInt) + ' is not integer');
+ });
+ t.equal(false, ES.IsInteger(uncoercibleObject), 'uncoercibleObject is not integer');
+ t.end();
+});
+
+test('IsExtensible', function (t) {
+ forEach(objects, function (object) {
+ t.equal(true, ES.IsExtensible(object), object + ' object is extensible');
+ });
+ forEach(primitives, function (primitive) {
+ t.equal(false, ES.IsExtensible(primitive), primitive + ' is not extensible');
+ });
+ if (Object.preventExtensions) {
+ t.equal(false, ES.IsExtensible(Object.preventExtensions({})), 'object with extensions prevented is not extensible');
+ }
+ t.end();
+});
+
+test('CanonicalNumericIndexString', function (t) {
+ var throwsOnNonString = function (notString) {
+ t.throws(function () { return ES.CanonicalNumericIndexString(notString); }, TypeError, notString + ' is not a string');
+ };
+ forEach(objects.concat(numbers), throwsOnNonString);
+ t.ok(is(-0, ES.CanonicalNumericIndexString('-0')), '"-0" returns -0');
+ for (var i = -50; i < 50; i += 10) {
+ t.equal(i, ES.CanonicalNumericIndexString(String(i)), '"' + i + '" returns ' + i);
+ t.equal(undefined, ES.CanonicalNumericIndexString(String(i) + 'a'), '"' + i + 'a" returns undefined');
+ }
+ t.end();
+});
+
+test('IsConstructor', function (t) {
+ t.equal(true, ES.IsConstructor(function () {}), 'function is constructor');
+ t.equal(false, ES.IsConstructor(/a/g), 'regex is not constructor');
+ forEach(objects, function (object) {
+ t.equal(false, ES.IsConstructor(object), object + ' object is not constructor');
+ });
+ t.end();
+});
+
+test('Call', function (t) {
+ var receiver = {};
+ var notFuncs = objects.concat(primitives).concat([/a/g, new RegExp('a', 'g')]);
+ t.plan(notFuncs.length + 4);
+ var throwsIfNotCallable = function (notFunc) {
+ t.throws(function () { return ES.Call(notFunc, receiver); }, TypeError, notFunc + ' (' + typeof notFunc + ') is not callable');
+ };
+ forEach(notFuncs, throwsIfNotCallable);
+ ES.Call(function (a, b) {
+ t.equal(this, receiver, 'context matches expected');
+ t.deepEqual([a, b], [1, 2], 'named args are correct');
+ t.equal(arguments.length, 3, 'extra argument was passed');
+ t.equal(arguments[2], 3, 'extra argument was correct');
+ }, receiver, [1, 2, 3]);
+ t.end();
+});
+
+test('SameValueNonNumber', function (t) {
+ var willThrow = [
+ [3, 4],
+ [NaN, 4],
+ [4, ''],
+ ['abc', true],
+ [{}, false]
+ ];
+ forEach(willThrow, function (nums) {
+ t.throws(function () { return ES.SameValueNonNumber.apply(ES, nums); }, TypeError, 'value must be same type and non-number');
+ });
+
+ forEach(objects.concat(nonNumberPrimitives), function (val) {
+ t.equal(val === val, ES.SameValueNonNumber(val, val), '"' + val + '" is SameValueNonNumber to itself');
+ });
+
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/index.js b/node_modules/es-abstract/test/index.js
new file mode 100644
index 0000000..0fd7015
--- /dev/null
+++ b/node_modules/es-abstract/test/index.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var ES = require('../');
+var test = require('tape');
+
+var ESkeys = Object.keys(ES).sort();
+var ES6keys = Object.keys(ES.ES6).sort();
+
+test('exposed properties', function (t) {
+ t.deepEqual(ESkeys, ES6keys.concat(['ES7', 'ES6', 'ES5']).sort(), 'main ES object keys match ES6 keys');
+ t.end();
+});
+
+test('methods match', function (t) {
+ ES6keys.forEach(function (key) {
+ t.equal(ES.ES6[key], ES[key], 'method ' + key + ' on main ES object is ES6 method');
+ });
+ t.end();
+});
+
+require('./es5');
+require('./es6');
+require('./es7');
diff --git a/node_modules/es-to-primitive/.eslintrc b/node_modules/es-to-primitive/.eslintrc
new file mode 100644
index 0000000..89da458
--- /dev/null
+++ b/node_modules/es-to-primitive/.eslintrc
@@ -0,0 +1,13 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "complexity": [2, 13],
+ "id-length": [2, { "min": 1, "max": 24, "properties": "never" }],
+ "max-statements": [2, 20],
+ "new-cap": [2, { "capIsNewExceptions": ["GetMethod"] }],
+ "no-extra-parens": [2, "functions"]
+ }
+}
diff --git a/node_modules/es-to-primitive/.jscs.json b/node_modules/es-to-primitive/.jscs.json
new file mode 100644
index 0000000..e4c42d1
--- /dev/null
+++ b/node_modules/es-to-primitive/.jscs.json
@@ -0,0 +1,155 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 12
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": false,
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false
+}
+
diff --git a/node_modules/es-to-primitive/.npmignore b/node_modules/es-to-primitive/.npmignore
new file mode 100644
index 0000000..59d842b
--- /dev/null
+++ b/node_modules/es-to-primitive/.npmignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# Commenting this out is preferred by some people, see
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
+node_modules
+
+# Users Environment Variables
+.lock-wscript
diff --git a/node_modules/es-to-primitive/.travis.yml b/node_modules/es-to-primitive/.travis.yml
new file mode 100644
index 0000000..53df15e
--- /dev/null
+++ b/node_modules/es-to-primitive/.travis.yml
@@ -0,0 +1,70 @@
+language: node_js
+node_js:
+ - "5.3"
+ - "5.2"
+ - "5.1"
+ - "5.0"
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+script:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "4.2" ]; then npm run tests-only ; else npm test ; fi'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "5.2"
+ - node_js: "5.1"
+ - node_js: "5.0"
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.8"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/es-to-primitive/CHANGELOG.md b/node_modules/es-to-primitive/CHANGELOG.md
new file mode 100644
index 0000000..662342a
--- /dev/null
+++ b/node_modules/es-to-primitive/CHANGELOG.md
@@ -0,0 +1,29 @@
+1.1.1 / 2016-01-03
+=================
+ * [Fix: ES5] fix coercion logic: ES5’s ToPrimitive does not coerce any primitive value, regardless of hint (#2)
+
+1.1.0 / 2015-12-27
+=================
+ * [New] add `Symbol.toPrimitive` support
+ * [Deps] update `is-callable`, `is-date-object`
+ * [Dev Deps] update `eslint`, `tape`, `semver`, `jscs`, `covert`, `nsp`, `@ljharb/eslint-config`
+ * [Dev Deps] remove unused deps
+ * [Tests] up to `node` `v5.3`
+ * [Tests] fix npm upgrades on older node versions
+ * [Tests] fix testling
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+
+1.0.1 / 2016-01-03
+=================
+ * [Fix: ES5] fix coercion logic: ES5’s ToPrimitive does not coerce any primitive value, regardless of hint (#2)
+ * [Deps] update `is-callable`, `is-date-object`
+ * [Dev Deps] update `eslint`, `tape`, `semver`, `jscs`, `covert`, `nsp`, `@ljharb/eslint-config`
+ * [Dev Deps] remove unused deps
+ * [Tests] up to `node` `v5.3`
+ * [Tests] fix npm upgrades on older node versions
+ * [Tests] fix testling
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+
+1.0.0 / 2015-03-19
+=================
+ * Initial release.
diff --git a/node_modules/es-to-primitive/LICENSE b/node_modules/es-to-primitive/LICENSE
new file mode 100644
index 0000000..b43df44
--- /dev/null
+++ b/node_modules/es-to-primitive/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/es-to-primitive/Makefile b/node_modules/es-to-primitive/Makefile
new file mode 100644
index 0000000..b9e4fe1
--- /dev/null
+++ b/node_modules/es-to-primitive/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/es-to-primitive/README.md b/node_modules/es-to-primitive/README.md
new file mode 100644
index 0000000..357ff66
--- /dev/null
+++ b/node_modules/es-to-primitive/README.md
@@ -0,0 +1,53 @@
+# es-to-primitive [![Version Badge][npm-version-svg]][package-url]
+
+[![Build Status][travis-svg]][travis-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+[![browser support][testling-svg]][testling-url]
+
+ECMAScript “ToPrimitive” algorithm. Provides ES5 and ES6 versions.
+When different versions of the spec conflict, the default export will be the latest version of the abstract operation.
+Alternative versions will also be available under an `es5`/`es6`/`es7` exported property if you require a specific version.
+
+## Example
+
+```js
+var toPrimitive = require('es-to-primitive');
+var assert = require('assert');
+
+assert(toPrimitive(function () {}) === String(function () {}));
+
+var date = new Date();
+assert(toPrimitive(date) === String(date));
+
+assert(toPrimitive({ valueOf: function () { return 3; } }) === 3);
+
+assert(toPrimitive(['a', 'b', 3]) === String(['a', 'b', 3]));
+
+var sym = Symbol();
+assert(toPrimitive(Object(sym)) === sym);
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/es-to-primitive
+[npm-version-svg]: http://versionbadg.es/ljharb/es-to-primitive.svg
+[travis-svg]: https://travis-ci.org/ljharb/es-to-primitive.svg
+[travis-url]: https://travis-ci.org/ljharb/es-to-primitive
+[deps-svg]: https://david-dm.org/ljharb/es-to-primitive.svg
+[deps-url]: https://david-dm.org/ljharb/es-to-primitive
+[dev-deps-svg]: https://david-dm.org/ljharb/es-to-primitive/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/es-to-primitive#info=devDependencies
+[testling-svg]: https://ci.testling.com/ljharb/es-to-primitive.png
+[testling-url]: https://ci.testling.com/ljharb/es-to-primitive
+[npm-badge-png]: https://nodei.co/npm/es-to-primitive.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/es-to-primitive.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/es-to-primitive.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=es-to-primitive
diff --git a/node_modules/es-to-primitive/es5.js b/node_modules/es-to-primitive/es5.js
new file mode 100644
index 0000000..d216480
--- /dev/null
+++ b/node_modules/es-to-primitive/es5.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var toStr = Object.prototype.toString;
+
+var isPrimitive = require('./helpers/isPrimitive');
+
+var isCallable = require('is-callable');
+
+// https://es5.github.io/#x8.12
+var ES5internalSlots = {
+ '[[DefaultValue]]': function (O, hint) {
+ var actualHint = hint || (toStr.call(O) === '[object Date]' ? String : Number);
+
+ if (actualHint === String || actualHint === Number) {
+ var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
+ var value, i;
+ for (i = 0; i < methods.length; ++i) {
+ if (isCallable(O[methods[i]])) {
+ value = O[methods[i]]();
+ if (isPrimitive(value)) {
+ return value;
+ }
+ }
+ }
+ throw new TypeError('No default value');
+ }
+ throw new TypeError('invalid [[DefaultValue]] hint supplied');
+ }
+};
+
+// https://es5.github.io/#x9
+module.exports = function ToPrimitive(input, PreferredType) {
+ if (isPrimitive(input)) {
+ return input;
+ }
+ return ES5internalSlots['[[DefaultValue]]'](input, PreferredType);
+};
diff --git a/node_modules/es-to-primitive/es6.js b/node_modules/es-to-primitive/es6.js
new file mode 100644
index 0000000..27b3285
--- /dev/null
+++ b/node_modules/es-to-primitive/es6.js
@@ -0,0 +1,74 @@
+'use strict';
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+var isPrimitive = require('./helpers/isPrimitive');
+var isCallable = require('is-callable');
+var isDate = require('is-date-object');
+var isSymbol = require('is-symbol');
+
+var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
+ if (typeof O === 'undefined' || O === null) {
+ throw new TypeError('Cannot call method on ' + O);
+ }
+ if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
+ throw new TypeError('hint must be "string" or "number"');
+ }
+ var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
+ var method, result, i;
+ for (i = 0; i < methodNames.length; ++i) {
+ method = O[methodNames[i]];
+ if (isCallable(method)) {
+ result = method.call(O);
+ if (isPrimitive(result)) {
+ return result;
+ }
+ }
+ }
+ throw new TypeError('No default value');
+};
+
+var GetMethod = function GetMethod(O, P) {
+ var func = O[P];
+ if (func !== null && typeof func !== 'undefined') {
+ if (!isCallable(func)) {
+ throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
+ }
+ return func;
+ }
+};
+
+// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
+module.exports = function ToPrimitive(input, PreferredType) {
+ if (isPrimitive(input)) {
+ return input;
+ }
+ var hint = 'default';
+ if (arguments.length > 1) {
+ if (PreferredType === String) {
+ hint = 'string';
+ } else if (PreferredType === Number) {
+ hint = 'number';
+ }
+ }
+
+ var exoticToPrim;
+ if (hasSymbols) {
+ if (Symbol.toPrimitive) {
+ exoticToPrim = GetMethod(input, Symbol.toPrimitive);
+ } else if (isSymbol(input)) {
+ exoticToPrim = Symbol.prototype.valueOf;
+ }
+ }
+ if (typeof exoticToPrim !== 'undefined') {
+ var result = exoticToPrim.call(input, hint);
+ if (isPrimitive(result)) {
+ return result;
+ }
+ throw new TypeError('unable to convert exotic object to primitive');
+ }
+ if (hint === 'default' && (isDate(input) || isSymbol(input))) {
+ hint = 'string';
+ }
+ return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
+};
diff --git a/node_modules/es-to-primitive/helpers/isPrimitive.js b/node_modules/es-to-primitive/helpers/isPrimitive.js
new file mode 100644
index 0000000..3669156
--- /dev/null
+++ b/node_modules/es-to-primitive/helpers/isPrimitive.js
@@ -0,0 +1,3 @@
+module.exports = function isPrimitive(value) {
+ return value === null || (typeof value !== 'function' && typeof value !== 'object');
+};
diff --git a/node_modules/es-to-primitive/index.js b/node_modules/es-to-primitive/index.js
new file mode 100644
index 0000000..0035657
--- /dev/null
+++ b/node_modules/es-to-primitive/index.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var ES5 = require('./es5');
+var ES6 = require('./es6');
+
+if (Object.defineProperty) {
+ Object.defineProperty(ES6, 'ES5', { enumerable: false, value: ES5 });
+ Object.defineProperty(ES6, 'ES6', { enumerable: false, value: ES6 });
+} else {
+ ES6.ES5 = ES5;
+ ES6.ES6 = ES6;
+}
+
+module.exports = ES6;
diff --git a/node_modules/es-to-primitive/package.json b/node_modules/es-to-primitive/package.json
new file mode 100644
index 0000000..989f323
--- /dev/null
+++ b/node_modules/es-to-primitive/package.json
@@ -0,0 +1,133 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "es-to-primitive@^1.1.1",
+ "scope": null,
+ "escapedName": "es-to-primitive",
+ "name": "es-to-primitive",
+ "rawSpec": "^1.1.1",
+ "spec": ">=1.1.1 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-abstract"
+ ]
+ ],
+ "_from": "es-to-primitive@>=1.1.1 <2.0.0",
+ "_id": "es-to-primitive@1.1.1",
+ "_inCache": true,
+ "_location": "/es-to-primitive",
+ "_nodeVersion": "5.3.0",
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.3.12",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "es-to-primitive@^1.1.1",
+ "scope": null,
+ "escapedName": "es-to-primitive",
+ "name": "es-to-primitive",
+ "rawSpec": "^1.1.1",
+ "spec": ">=1.1.1 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/es-abstract"
+ ],
+ "_resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+ "_shasum": "45355248a88979034b6792e19bb81f2b7975dd0d",
+ "_shrinkwrap": null,
+ "_spec": "es-to-primitive@^1.1.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-abstract",
+ "author": {
+ "name": "Jordan Harband"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/es-to-primitive/issues"
+ },
+ "dependencies": {
+ "is-callable": "^1.1.1",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.1"
+ },
+ "description": "ECMAScript “ToPrimitive” algorithm. Provides ES5 and ES6 versions.",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^1.6.1",
+ "covert": "^1.1.0",
+ "eslint": "^1.10.3",
+ "foreach": "^2.0.5",
+ "jscs": "^2.7.0",
+ "nsp": "^2.2.0",
+ "object-is": "^1.0.1",
+ "replace": "^0.3.0",
+ "semver": "^5.1.0",
+ "tape": "^4.4.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "45355248a88979034b6792e19bb81f2b7975dd0d",
+ "tarball": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "56cd0400062c37e3427c59ddf7852972cf14e6fe",
+ "homepage": "https://github.com/ljharb/es-to-primitive#readme",
+ "keywords": [
+ "primitive",
+ "abstract",
+ "ecmascript",
+ "es5",
+ "es6",
+ "toPrimitive",
+ "coerce",
+ "type",
+ "object"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "es-to-primitive",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/es-to-primitive.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "eslint": "eslint test/*.js *.js",
+ "jscs": "jscs test/*.js *.js",
+ "lint": "npm run jscs && npm run eslint",
+ "security": "nsp check",
+ "test": "npm run lint && npm run tests-only && npm run security",
+ "tests-only": "node --es-staging test"
+ },
+ "testling": {
+ "files": "test",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.1.1"
+}
diff --git a/node_modules/es-to-primitive/test/es5.js b/node_modules/es-to-primitive/test/es5.js
new file mode 100644
index 0000000..1d4902a
--- /dev/null
+++ b/node_modules/es-to-primitive/test/es5.js
@@ -0,0 +1,80 @@
+'use strict';
+
+var test = require('tape');
+var toPrimitive = require('../es5');
+var is = require('object-is');
+var forEach = require('foreach');
+var debug = require('util').inspect;
+
+var primitives = [null, undefined, true, false, 0, -0, 42, NaN, Infinity, -Infinity, '', 'abc'];
+
+test('primitives', function (t) {
+ forEach(primitives, function (i) {
+ t.ok(is(toPrimitive(i), i), 'toPrimitive(' + debug(i) + ') returns the same value');
+ t.ok(is(toPrimitive(i, String), i), 'toPrimitive(' + debug(i) + ', String) returns the same value');
+ t.ok(is(toPrimitive(i, Number), i), 'toPrimitive(' + debug(i) + ', Number) returns the same value');
+ });
+ t.end();
+});
+
+test('Arrays', function (t) {
+ var arrays = [[], ['a', 'b'], [1, 2]];
+ forEach(arrays, function (arr) {
+ t.ok(is(toPrimitive(arr), arr.toString()), 'toPrimitive(' + debug(arr) + ') returns toString of the array');
+ t.equal(toPrimitive(arr, String), arr.toString(), 'toPrimitive(' + debug(arr) + ') returns toString of the array');
+ t.ok(is(toPrimitive(arr, Number), arr.toString()), 'toPrimitive(' + debug(arr) + ') returns toString of the array');
+ });
+ t.end();
+});
+
+test('Dates', function (t) {
+ var dates = [new Date(), new Date(0), new Date(NaN)];
+ forEach(dates, function (date) {
+ t.equal(toPrimitive(date), date.toString(), 'toPrimitive(' + debug(date) + ') returns toString of the date');
+ t.equal(toPrimitive(date, String), date.toString(), 'toPrimitive(' + debug(date) + ') returns toString of the date');
+ t.ok(is(toPrimitive(date, Number), date.valueOf()), 'toPrimitive(' + debug(date) + ') returns valueOf of the date');
+ });
+ t.end();
+});
+
+var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } };
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var coercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return 42; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var uncoercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return function toStrFn() {}; } };
+
+test('Objects', function (t) {
+ t.equal(toPrimitive(coercibleObject), coercibleObject.valueOf(), 'coercibleObject with no hint coerces to valueOf');
+ t.equal(toPrimitive(coercibleObject, String), coercibleObject.toString(), 'coercibleObject with hint String coerces to toString');
+ t.equal(toPrimitive(coercibleObject, Number), coercibleObject.valueOf(), 'coercibleObject with hint Number coerces to valueOf');
+
+ t.equal(toPrimitive(coercibleFnObject), coercibleFnObject.toString(), 'coercibleFnObject coerces to toString');
+ t.equal(toPrimitive(coercibleFnObject, String), coercibleFnObject.toString(), 'coercibleFnObject with hint String coerces to toString');
+ t.equal(toPrimitive(coercibleFnObject, Number), coercibleFnObject.toString(), 'coercibleFnObject with hint Number coerces to toString');
+
+ t.ok(is(toPrimitive({}), '[object Object]'), '{} with no hint coerces to Object#toString');
+ t.equal(toPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+ t.ok(is(toPrimitive({}, Number), '[object Object]'), '{} with hint Number coerces to Object#toString');
+
+ t.equal(toPrimitive(toStringOnlyObject), toStringOnlyObject.toString(), 'toStringOnlyObject returns toString');
+ t.equal(toPrimitive(toStringOnlyObject, String), toStringOnlyObject.toString(), 'toStringOnlyObject with hint String returns toString');
+ t.equal(toPrimitive(toStringOnlyObject, Number), toStringOnlyObject.toString(), 'toStringOnlyObject with hint Number returns toString');
+
+ t.equal(toPrimitive(valueOfOnlyObject), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject returns valueOf');
+ t.equal(toPrimitive(valueOfOnlyObject, String), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject with hint String returns valueOf');
+ t.equal(toPrimitive(valueOfOnlyObject, Number), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject with hint Number returns valueOf');
+
+ t.test('exceptions', function (st) {
+ st['throws'](toPrimitive.bind(null, uncoercibleObject), TypeError, 'uncoercibleObject throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleObject, String), TypeError, 'uncoercibleObject with hint String throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleObject, Number), TypeError, 'uncoercibleObject with hint Number throws a TypeError');
+
+ st['throws'](toPrimitive.bind(null, uncoercibleFnObject), TypeError, 'uncoercibleFnObject throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleFnObject, String), TypeError, 'uncoercibleFnObject with hint String throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleFnObject, Number), TypeError, 'uncoercibleFnObject with hint Number throws a TypeError');
+ st.end();
+ });
+
+ t.end();
+});
diff --git a/node_modules/es-to-primitive/test/es6.js b/node_modules/es-to-primitive/test/es6.js
new file mode 100644
index 0000000..1ac988a
--- /dev/null
+++ b/node_modules/es-to-primitive/test/es6.js
@@ -0,0 +1,131 @@
+'use strict';
+
+var test = require('tape');
+var toPrimitive = require('../es6');
+var is = require('object-is');
+var forEach = require('foreach');
+var debug = require('util').inspect;
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+var hasSymbolToPrimitive = hasSymbols && typeof Symbol.toPrimitive === 'symbol';
+
+var primitives = [null, undefined, true, false, 0, -0, 42, NaN, Infinity, -Infinity, '', 'abc'];
+
+test('primitives', function (t) {
+ forEach(primitives, function (i) {
+ t.ok(is(toPrimitive(i), i), 'toPrimitive(' + debug(i) + ') returns the same value');
+ t.ok(is(toPrimitive(i, String), i), 'toPrimitive(' + debug(i) + ', String) returns the same value');
+ t.ok(is(toPrimitive(i, Number), i), 'toPrimitive(' + debug(i) + ', Number) returns the same value');
+ });
+ t.end();
+});
+
+test('Symbols', { skip: !hasSymbols }, function (t) {
+ var symbols = [Symbol(), Symbol.iterator, Symbol.for('foo')];
+ forEach(symbols, function (sym) {
+ t.equal(toPrimitive(sym), sym, 'toPrimitive(' + debug(sym) + ') returns the same value');
+ t.equal(toPrimitive(sym, String), sym, 'toPrimitive(' + debug(sym) + ', String) returns the same value');
+ t.equal(toPrimitive(sym, Number), sym, 'toPrimitive(' + debug(sym) + ', Number) returns the same value');
+ });
+
+ var primitiveSym = Symbol('primitiveSym');
+ var objectSym = Object(primitiveSym);
+ t.equal(toPrimitive(objectSym), primitiveSym, 'toPrimitive(' + debug(objectSym) + ') returns ' + debug(primitiveSym));
+ t.equal(toPrimitive(objectSym, String), primitiveSym, 'toPrimitive(' + debug(objectSym) + ', String) returns ' + debug(primitiveSym));
+ t.equal(toPrimitive(objectSym, Number), primitiveSym, 'toPrimitive(' + debug(objectSym) + ', Number) returns ' + debug(primitiveSym));
+ t.end();
+});
+
+test('Arrays', function (t) {
+ var arrays = [[], ['a', 'b'], [1, 2]];
+ forEach(arrays, function (arr) {
+ t.equal(toPrimitive(arr), String(arr), 'toPrimitive(' + debug(arr) + ') returns the string version of the array');
+ t.equal(toPrimitive(arr, String), String(arr), 'toPrimitive(' + debug(arr) + ') returns the string version of the array');
+ t.equal(toPrimitive(arr, Number), String(arr), 'toPrimitive(' + debug(arr) + ') returns the string version of the array');
+ });
+ t.end();
+});
+
+test('Dates', function (t) {
+ var dates = [new Date(), new Date(0), new Date(NaN)];
+ forEach(dates, function (date) {
+ t.equal(toPrimitive(date), String(date), 'toPrimitive(' + debug(date) + ') returns the string version of the date');
+ t.equal(toPrimitive(date, String), String(date), 'toPrimitive(' + debug(date) + ') returns the string version of the date');
+ t.ok(is(toPrimitive(date, Number), Number(date)), 'toPrimitive(' + debug(date) + ') returns the number version of the date');
+ });
+ t.end();
+});
+
+var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } };
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var coercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return 42; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var uncoercibleFnObject = { valueOf: function () { return function valueOfFn() {}; }, toString: function () { return function toStrFn() {}; } };
+
+test('Objects', function (t) {
+ t.equal(toPrimitive(coercibleObject), coercibleObject.valueOf(), 'coercibleObject with no hint coerces to valueOf');
+ t.equal(toPrimitive(coercibleObject, Number), coercibleObject.valueOf(), 'coercibleObject with hint Number coerces to valueOf');
+ t.equal(toPrimitive(coercibleObject, String), coercibleObject.toString(), 'coercibleObject with hint String coerces to non-stringified toString');
+
+ t.equal(toPrimitive(coercibleFnObject), coercibleFnObject.toString(), 'coercibleFnObject coerces to non-stringified toString');
+ t.equal(toPrimitive(coercibleFnObject, Number), coercibleFnObject.toString(), 'coercibleFnObject with hint Number coerces to non-stringified toString');
+ t.equal(toPrimitive(coercibleFnObject, String), coercibleFnObject.toString(), 'coercibleFnObject with hint String coerces to non-stringified toString');
+
+ t.equal(toPrimitive({}), '[object Object]', '{} with no hint coerces to Object#toString');
+ t.equal(toPrimitive({}, Number), '[object Object]', '{} with hint Number coerces to Object#toString');
+ t.equal(toPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+
+ t.equal(toPrimitive(toStringOnlyObject), toStringOnlyObject.toString(), 'toStringOnlyObject returns non-stringified toString');
+ t.equal(toPrimitive(toStringOnlyObject, Number), toStringOnlyObject.toString(), 'toStringOnlyObject with hint Number returns non-stringified toString');
+ t.equal(toPrimitive(toStringOnlyObject, String), toStringOnlyObject.toString(), 'toStringOnlyObject with hint String returns non-stringified toString');
+
+ t.equal(toPrimitive(valueOfOnlyObject), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject returns valueOf');
+ t.equal(toPrimitive(valueOfOnlyObject, Number), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject with hint Number returns valueOf');
+ t.equal(toPrimitive(valueOfOnlyObject, String), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject with hint String returns non-stringified valueOf');
+
+ t.test('Symbol.toPrimitive', { skip: !hasSymbolToPrimitive }, function (st) {
+ var overriddenObject = { toString: st.fail, valueOf: st.fail };
+ overriddenObject[Symbol.toPrimitive] = function (hint) { return String(hint); };
+
+ st.equal(toPrimitive(overriddenObject), 'default', 'object with Symbol.toPrimitive + no hint invokes that');
+ st.equal(toPrimitive(overriddenObject, Number), 'number', 'object with Symbol.toPrimitive + hint Number invokes that');
+ st.equal(toPrimitive(overriddenObject, String), 'string', 'object with Symbol.toPrimitive + hint String invokes that');
+
+ var nullToPrimitive = { toString: coercibleObject.toString, valueOf: coercibleObject.valueOf };
+ nullToPrimitive[Symbol.toPrimitive] = null;
+ st.equal(toPrimitive(nullToPrimitive), toPrimitive(coercibleObject), 'object with no hint + null Symbol.toPrimitive ignores it');
+ st.equal(toPrimitive(nullToPrimitive, Number), toPrimitive(coercibleObject, Number), 'object with hint Number + null Symbol.toPrimitive ignores it');
+ st.equal(toPrimitive(nullToPrimitive, String), toPrimitive(coercibleObject, String), 'object with hint String + null Symbol.toPrimitive ignores it');
+
+ st.test('exceptions', function (sst) {
+ var nonFunctionToPrimitive = { toString: sst.fail, valueOf: sst.fail };
+ nonFunctionToPrimitive[Symbol.toPrimitive] = {};
+ sst['throws'](toPrimitive.bind(null, nonFunctionToPrimitive), TypeError, 'Symbol.toPrimitive returning a non-function throws');
+
+ var uncoercibleToPrimitive = { toString: sst.fail, valueOf: sst.fail };
+ uncoercibleToPrimitive[Symbol.toPrimitive] = function (hint) { return { toString: function () { return hint; } }; };
+ sst['throws'](toPrimitive.bind(null, uncoercibleToPrimitive), TypeError, 'Symbol.toPrimitive returning an object throws');
+
+ var throwingToPrimitive = { toString: sst.fail, valueOf: sst.fail };
+ throwingToPrimitive[Symbol.toPrimitive] = function (hint) { throw new RangeError(hint); };
+ sst['throws'](toPrimitive.bind(null, throwingToPrimitive), RangeError, 'Symbol.toPrimitive throwing throws');
+
+ sst.end();
+ });
+
+ st.end();
+ });
+
+ t.test('exceptions', function (st) {
+ st['throws'](toPrimitive.bind(null, uncoercibleObject), TypeError, 'uncoercibleObject throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleObject, Number), TypeError, 'uncoercibleObject with hint Number throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleObject, String), TypeError, 'uncoercibleObject with hint String throws a TypeError');
+
+ st['throws'](toPrimitive.bind(null, uncoercibleFnObject), TypeError, 'uncoercibleFnObject throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleFnObject, Number), TypeError, 'uncoercibleFnObject with hint Number throws a TypeError');
+ st['throws'](toPrimitive.bind(null, uncoercibleFnObject, String), TypeError, 'uncoercibleFnObject with hint String throws a TypeError');
+ st.end();
+ });
+ t.end();
+});
diff --git a/node_modules/es-to-primitive/test/index.js b/node_modules/es-to-primitive/test/index.js
new file mode 100644
index 0000000..718e3fb
--- /dev/null
+++ b/node_modules/es-to-primitive/test/index.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var toPrimitive = require('../');
+var ES5 = require('../es5');
+var ES6 = require('../es6');
+
+var test = require('tape');
+
+test('default export', function (t) {
+ t.equal(toPrimitive, ES6, 'default export is ES6');
+ t.equal(toPrimitive.ES5, ES5, 'ES5 property has ES5 method');
+ t.equal(toPrimitive.ES6, ES6, 'ES6 property has ES6 method');
+ t.end();
+});
+
+require('./es5');
+require('./es6');
diff --git a/node_modules/foreach/.npmignore b/node_modules/foreach/.npmignore
new file mode 100644
index 0000000..d135df6
--- /dev/null
+++ b/node_modules/foreach/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+components
+build
\ No newline at end of file
diff --git a/node_modules/foreach/LICENSE b/node_modules/foreach/LICENSE
new file mode 100644
index 0000000..3032d6e
--- /dev/null
+++ b/node_modules/foreach/LICENSE
@@ -0,0 +1,24 @@
+The MIT License
+
+Copyright (c) 2013 Manuel Stofer
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/foreach/Makefile b/node_modules/foreach/Makefile
new file mode 100644
index 0000000..eae4117
--- /dev/null
+++ b/node_modules/foreach/Makefile
@@ -0,0 +1,11 @@
+
+build: components
+ @component build
+
+components: component.json
+ @component install --dev
+
+clean:
+ rm -fr build components template.js
+
+.PHONY: clean
diff --git a/node_modules/foreach/Readme.md b/node_modules/foreach/Readme.md
new file mode 100644
index 0000000..2752b57
--- /dev/null
+++ b/node_modules/foreach/Readme.md
@@ -0,0 +1,30 @@
+
+# foreach
+
+Iterate over the key value pairs of either an array-like object or a dictionary like object.
+
+[![browser support][1]][2]
+
+## API
+
+### foreach(object, function, [context])
+
+```js
+var each = require('foreach');
+
+each([1,2,3], function (value, key, array) {
+ // value === 1, 2, 3
+ // key === 0, 1, 2
+ // array === [1, 2, 3]
+});
+
+each({0:1,1:2,2:3}, function (value, key, object) {
+ // value === 1, 2, 3
+ // key === 0, 1, 2
+ // object === {0:1,1:2,2:3}
+});
+```
+
+[1]: https://ci.testling.com/manuelstofer/foreach.png
+[2]: https://ci.testling.com/manuelstofer/foreach
+
diff --git a/node_modules/foreach/component.json b/node_modules/foreach/component.json
new file mode 100644
index 0000000..0eeecb5
--- /dev/null
+++ b/node_modules/foreach/component.json
@@ -0,0 +1,11 @@
+{
+ "name": "foreach",
+ "description": "foreach component + npm package",
+ "version": "2.0.5",
+ "keywords": [],
+ "dependencies": {},
+ "scripts": [
+ "index.js"
+ ],
+ "repo": "manuelstofer/foreach"
+}
diff --git a/node_modules/foreach/index.js b/node_modules/foreach/index.js
new file mode 100644
index 0000000..a961e4e
--- /dev/null
+++ b/node_modules/foreach/index.js
@@ -0,0 +1,22 @@
+
+var hasOwn = Object.prototype.hasOwnProperty;
+var toString = Object.prototype.toString;
+
+module.exports = function forEach (obj, fn, ctx) {
+ if (toString.call(fn) !== '[object Function]') {
+ throw new TypeError('iterator must be a function');
+ }
+ var l = obj.length;
+ if (l === +l) {
+ for (var i = 0; i < l; i++) {
+ fn.call(ctx, obj[i], i, obj);
+ }
+ } else {
+ for (var k in obj) {
+ if (hasOwn.call(obj, k)) {
+ fn.call(ctx, obj[k], k, obj);
+ }
+ }
+ }
+};
+
diff --git a/node_modules/foreach/package.json b/node_modules/foreach/package.json
new file mode 100644
index 0000000..ace2da2
--- /dev/null
+++ b/node_modules/foreach/package.json
@@ -0,0 +1,117 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "foreach@^2.0.5",
+ "scope": null,
+ "escapedName": "foreach",
+ "name": "foreach",
+ "rawSpec": "^2.0.5",
+ "spec": ">=2.0.5 <3.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/define-properties"
+ ]
+ ],
+ "_from": "foreach@>=2.0.5 <3.0.0",
+ "_id": "foreach@2.0.5",
+ "_inCache": true,
+ "_location": "/foreach",
+ "_npmUser": {
+ "name": "manuelstofer",
+ "email": "manuel@takimata.ch"
+ },
+ "_npmVersion": "1.4.9",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "foreach@^2.0.5",
+ "scope": null,
+ "escapedName": "foreach",
+ "name": "foreach",
+ "rawSpec": "^2.0.5",
+ "spec": ">=2.0.5 <3.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/define-properties"
+ ],
+ "_resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "_shasum": "0bee005018aeb260d0a3af3ae658dd0136ec1b99",
+ "_shrinkwrap": null,
+ "_spec": "foreach@^2.0.5",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/define-properties",
+ "author": {
+ "name": "Manuel Stofer",
+ "email": "manuel@takimata.ch"
+ },
+ "bugs": {
+ "url": "https://github.com/manuelstofer/foreach/issues"
+ },
+ "contributors": [
+ {
+ "name": "Manuel Stofer"
+ },
+ {
+ "name": "Jordan Harband",
+ "url": "https://github.com/ljharb"
+ }
+ ],
+ "dependencies": {},
+ "description": "foreach component + npm package",
+ "devDependencies": {
+ "covert": "*",
+ "tape": "*"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "0bee005018aeb260d0a3af3ae658dd0136ec1b99",
+ "tarball": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz"
+ },
+ "homepage": "https://github.com/manuelstofer/foreach",
+ "keywords": [
+ "shim",
+ "Array.prototype.forEach",
+ "forEach",
+ "Array#forEach",
+ "each"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "manuelstofer",
+ "email": "manuel@takimata.ch"
+ }
+ ],
+ "name": "foreach",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/manuelstofer/foreach.git"
+ },
+ "scripts": {
+ "coverage": "covert test.js",
+ "coverage-quiet": "covert --quiet test.js",
+ "test": "node test.js"
+ },
+ "testling": {
+ "files": "test.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0",
+ "chrome/22.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/5.0.5..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "2.0.5"
+}
diff --git a/node_modules/foreach/test.js b/node_modules/foreach/test.js
new file mode 100644
index 0000000..c6283c3
--- /dev/null
+++ b/node_modules/foreach/test.js
@@ -0,0 +1,153 @@
+var test = require('tape');
+var forEach = require('./index.js');
+
+
+test('second argument: iterator', function (t) {
+ var arr = [];
+ t.throws(function () { forEach(arr); }, TypeError, 'undefined is not a function');
+ t.throws(function () { forEach(arr, null); }, TypeError, 'null is not a function');
+ t.throws(function () { forEach(arr, ''); }, TypeError, 'string is not a function');
+ t.throws(function () { forEach(arr, /a/); }, TypeError, 'regex is not a function');
+ t.throws(function () { forEach(arr, true); }, TypeError, 'true is not a function');
+ t.throws(function () { forEach(arr, false); }, TypeError, 'false is not a function');
+ t.throws(function () { forEach(arr, NaN); }, TypeError, 'NaN is not a function');
+ t.throws(function () { forEach(arr, 42); }, TypeError, '42 is not a function');
+ t.doesNotThrow(function () { forEach(arr, function () {}); }, 'function is a function');
+ t.end();
+});
+
+test('array', function (t) {
+ var arr = [1, 2, 3];
+
+ t.test('iterates over every item', function (st) {
+ var index = 0;
+ forEach(arr, function () { index += 1; });
+ st.equal(index, arr.length, 'iterates ' + arr.length + ' times');
+ st.end();
+ });
+
+ t.test('first iterator argument', function (st) {
+ var index = 0;
+ st.plan(arr.length);
+ forEach(arr, function (item) {
+ st.equal(arr[index], item, 'item ' + index + ' is passed as first argument');
+ index += 1;
+ });
+ st.end();
+ });
+
+ t.test('second iterator argument', function (st) {
+ var counter = 0;
+ st.plan(arr.length);
+ forEach(arr, function (item, index) {
+ st.equal(counter, index, 'index ' + index + ' is passed as second argument');
+ counter += 1;
+ });
+ st.end();
+ });
+
+ t.test('third iterator argument', function (st) {
+ st.plan(arr.length);
+ forEach(arr, function (item, index, array) {
+ st.deepEqual(arr, array, 'array is passed as third argument');
+ });
+ st.end();
+ });
+
+ t.test('context argument', function (st) {
+ var context = {};
+ st.plan(1);
+ forEach([1], function () {
+ st.equal(this, context, '"this" is the passed context');
+ }, context);
+ st.end();
+ });
+
+ t.end();
+});
+
+test('object', function (t) {
+ var obj = {
+ a: 1,
+ b: 2,
+ c: 3
+ };
+ var keys = ['a', 'b', 'c'];
+
+ var F = function () {
+ this.a = 1;
+ this.b = 2;
+ };
+ F.prototype.c = 3;
+ var fKeys = ['a', 'b'];
+
+ t.test('iterates over every object literal key', function (st) {
+ var counter = 0;
+ forEach(obj, function () { counter += 1; });
+ st.equal(counter, keys.length, 'iterated ' + counter + ' times');
+ st.end();
+ });
+
+ t.test('iterates only over own keys', function (st) {
+ var counter = 0;
+ forEach(new F(), function () { counter += 1; });
+ st.equal(counter, fKeys.length, 'iterated ' + fKeys.length + ' times');
+ st.end();
+ });
+
+ t.test('first iterator argument', function (st) {
+ var index = 0;
+ st.plan(keys.length);
+ forEach(obj, function (item) {
+ st.equal(obj[keys[index]], item, 'item at key ' + keys[index] + ' is passed as first argument');
+ index += 1;
+ });
+ st.end();
+ });
+
+ t.test('second iterator argument', function (st) {
+ var counter = 0;
+ st.plan(keys.length);
+ forEach(obj, function (item, key) {
+ st.equal(keys[counter], key, 'key ' + key + ' is passed as second argument');
+ counter += 1;
+ });
+ st.end();
+ });
+
+ t.test('third iterator argument', function (st) {
+ st.plan(keys.length);
+ forEach(obj, function (item, key, object) {
+ st.deepEqual(obj, object, 'object is passed as third argument');
+ });
+ st.end();
+ });
+
+ t.test('context argument', function (st) {
+ var context = {};
+ st.plan(1);
+ forEach({ a: 1 }, function () {
+ st.equal(this, context, '"this" is the passed context');
+ }, context);
+ st.end();
+ });
+
+ t.end();
+});
+
+
+test('string', function (t) {
+ var str = 'str';
+ t.test('second iterator argument', function (st) {
+ var counter = 0;
+ st.plan(str.length * 2 + 1);
+ forEach(str, function (item, index) {
+ st.equal(counter, index, 'index ' + index + ' is passed as second argument');
+ st.equal(str.charAt(index), item);
+ counter += 1;
+ });
+ st.equal(counter, str.length, 'iterates ' + str.length + ' times');
+ });
+ t.end();
+});
+
diff --git a/node_modules/fs.realpath/LICENSE b/node_modules/fs.realpath/LICENSE
new file mode 100644
index 0000000..5bd884c
--- /dev/null
+++ b/node_modules/fs.realpath/LICENSE
@@ -0,0 +1,43 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+----
+
+This library bundles a version of the `fs.realpath` and `fs.realpathSync`
+methods from Node.js v0.10 under the terms of the Node.js MIT license.
+
+Node's license follows, also included at the header of `old.js` which contains
+the licensed code:
+
+ Copyright Joyent, Inc. and other Node contributors.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/fs.realpath/README.md b/node_modules/fs.realpath/README.md
new file mode 100644
index 0000000..a42ceac
--- /dev/null
+++ b/node_modules/fs.realpath/README.md
@@ -0,0 +1,33 @@
+# fs.realpath
+
+A backwards-compatible fs.realpath for Node v6 and above
+
+In Node v6, the JavaScript implementation of fs.realpath was replaced
+with a faster (but less resilient) native implementation. That raises
+new and platform-specific errors and cannot handle long or excessively
+symlink-looping paths.
+
+This module handles those cases by detecting the new errors and
+falling back to the JavaScript implementation. On versions of Node
+prior to v6, it has no effect.
+
+## USAGE
+
+```js
+var rp = require('fs.realpath')
+
+// async version
+rp.realpath(someLongAndLoopingPath, function (er, real) {
+ // the ELOOP was handled, but it was a bit slower
+})
+
+// sync version
+var real = rp.realpathSync(someLongAndLoopingPath)
+
+// monkeypatch at your own risk!
+// This replaces the fs.realpath/fs.realpathSync builtins
+rp.monkeypatch()
+
+// un-do the monkeypatching
+rp.unmonkeypatch()
+```
diff --git a/node_modules/fs.realpath/index.js b/node_modules/fs.realpath/index.js
new file mode 100644
index 0000000..b09c7c7
--- /dev/null
+++ b/node_modules/fs.realpath/index.js
@@ -0,0 +1,66 @@
+module.exports = realpath
+realpath.realpath = realpath
+realpath.sync = realpathSync
+realpath.realpathSync = realpathSync
+realpath.monkeypatch = monkeypatch
+realpath.unmonkeypatch = unmonkeypatch
+
+var fs = require('fs')
+var origRealpath = fs.realpath
+var origRealpathSync = fs.realpathSync
+
+var version = process.version
+var ok = /^v[0-5]\./.test(version)
+var old = require('./old.js')
+
+function newError (er) {
+ return er && er.syscall === 'realpath' && (
+ er.code === 'ELOOP' ||
+ er.code === 'ENOMEM' ||
+ er.code === 'ENAMETOOLONG'
+ )
+}
+
+function realpath (p, cache, cb) {
+ if (ok) {
+ return origRealpath(p, cache, cb)
+ }
+
+ if (typeof cache === 'function') {
+ cb = cache
+ cache = null
+ }
+ origRealpath(p, cache, function (er, result) {
+ if (newError(er)) {
+ old.realpath(p, cache, cb)
+ } else {
+ cb(er, result)
+ }
+ })
+}
+
+function realpathSync (p, cache) {
+ if (ok) {
+ return origRealpathSync(p, cache)
+ }
+
+ try {
+ return origRealpathSync(p, cache)
+ } catch (er) {
+ if (newError(er)) {
+ return old.realpathSync(p, cache)
+ } else {
+ throw er
+ }
+ }
+}
+
+function monkeypatch () {
+ fs.realpath = realpath
+ fs.realpathSync = realpathSync
+}
+
+function unmonkeypatch () {
+ fs.realpath = origRealpath
+ fs.realpathSync = origRealpathSync
+}
diff --git a/node_modules/fs.realpath/old.js b/node_modules/fs.realpath/old.js
new file mode 100644
index 0000000..b40305e
--- /dev/null
+++ b/node_modules/fs.realpath/old.js
@@ -0,0 +1,303 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var pathModule = require('path');
+var isWindows = process.platform === 'win32';
+var fs = require('fs');
+
+// JavaScript implementation of realpath, ported from node pre-v6
+
+var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);
+
+function rethrow() {
+ // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
+ // is fairly slow to generate.
+ var callback;
+ if (DEBUG) {
+ var backtrace = new Error;
+ callback = debugCallback;
+ } else
+ callback = missingCallback;
+
+ return callback;
+
+ function debugCallback(err) {
+ if (err) {
+ backtrace.message = err.message;
+ err = backtrace;
+ missingCallback(err);
+ }
+ }
+
+ function missingCallback(err) {
+ if (err) {
+ if (process.throwDeprecation)
+ throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
+ else if (!process.noDeprecation) {
+ var msg = 'fs: missing callback ' + (err.stack || err.message);
+ if (process.traceDeprecation)
+ console.trace(msg);
+ else
+ console.error(msg);
+ }
+ }
+ }
+}
+
+function maybeCallback(cb) {
+ return typeof cb === 'function' ? cb : rethrow();
+}
+
+var normalize = pathModule.normalize;
+
+// Regexp that finds the next partion of a (partial) path
+// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
+if (isWindows) {
+ var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
+} else {
+ var nextPartRe = /(.*?)(?:[\/]+|$)/g;
+}
+
+// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
+if (isWindows) {
+ var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
+} else {
+ var splitRootRe = /^[\/]*/;
+}
+
+exports.realpathSync = function realpathSync(p, cache) {
+ // make p is absolute
+ p = pathModule.resolve(p);
+
+ if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
+ return cache[p];
+ }
+
+ var original = p,
+ seenLinks = {},
+ knownHard = {};
+
+ // current character position in p
+ var pos;
+ // the partial path so far, including a trailing slash if any
+ var current;
+ // the partial path without a trailing slash (except when pointing at a root)
+ var base;
+ // the partial path scanned in the previous round, with slash
+ var previous;
+
+ start();
+
+ function start() {
+ // Skip over roots
+ var m = splitRootRe.exec(p);
+ pos = m[0].length;
+ current = m[0];
+ base = m[0];
+ previous = '';
+
+ // On windows, check that the root exists. On unix there is no need.
+ if (isWindows && !knownHard[base]) {
+ fs.lstatSync(base);
+ knownHard[base] = true;
+ }
+ }
+
+ // walk down the path, swapping out linked pathparts for their real
+ // values
+ // NB: p.length changes.
+ while (pos < p.length) {
+ // find the next part
+ nextPartRe.lastIndex = pos;
+ var result = nextPartRe.exec(p);
+ previous = current;
+ current += result[0];
+ base = previous + result[1];
+ pos = nextPartRe.lastIndex;
+
+ // continue if not a symlink
+ if (knownHard[base] || (cache && cache[base] === base)) {
+ continue;
+ }
+
+ var resolvedLink;
+ if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
+ // some known symbolic link. no need to stat again.
+ resolvedLink = cache[base];
+ } else {
+ var stat = fs.lstatSync(base);
+ if (!stat.isSymbolicLink()) {
+ knownHard[base] = true;
+ if (cache) cache[base] = base;
+ continue;
+ }
+
+ // read the link if it wasn't read before
+ // dev/ino always return 0 on windows, so skip the check.
+ var linkTarget = null;
+ if (!isWindows) {
+ var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
+ if (seenLinks.hasOwnProperty(id)) {
+ linkTarget = seenLinks[id];
+ }
+ }
+ if (linkTarget === null) {
+ fs.statSync(base);
+ linkTarget = fs.readlinkSync(base);
+ }
+ resolvedLink = pathModule.resolve(previous, linkTarget);
+ // track this, if given a cache.
+ if (cache) cache[base] = resolvedLink;
+ if (!isWindows) seenLinks[id] = linkTarget;
+ }
+
+ // resolve the link, then start over
+ p = pathModule.resolve(resolvedLink, p.slice(pos));
+ start();
+ }
+
+ if (cache) cache[original] = p;
+
+ return p;
+};
+
+
+exports.realpath = function realpath(p, cache, cb) {
+ if (typeof cb !== 'function') {
+ cb = maybeCallback(cache);
+ cache = null;
+ }
+
+ // make p is absolute
+ p = pathModule.resolve(p);
+
+ if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
+ return process.nextTick(cb.bind(null, null, cache[p]));
+ }
+
+ var original = p,
+ seenLinks = {},
+ knownHard = {};
+
+ // current character position in p
+ var pos;
+ // the partial path so far, including a trailing slash if any
+ var current;
+ // the partial path without a trailing slash (except when pointing at a root)
+ var base;
+ // the partial path scanned in the previous round, with slash
+ var previous;
+
+ start();
+
+ function start() {
+ // Skip over roots
+ var m = splitRootRe.exec(p);
+ pos = m[0].length;
+ current = m[0];
+ base = m[0];
+ previous = '';
+
+ // On windows, check that the root exists. On unix there is no need.
+ if (isWindows && !knownHard[base]) {
+ fs.lstat(base, function(err) {
+ if (err) return cb(err);
+ knownHard[base] = true;
+ LOOP();
+ });
+ } else {
+ process.nextTick(LOOP);
+ }
+ }
+
+ // walk down the path, swapping out linked pathparts for their real
+ // values
+ function LOOP() {
+ // stop if scanned past end of path
+ if (pos >= p.length) {
+ if (cache) cache[original] = p;
+ return cb(null, p);
+ }
+
+ // find the next part
+ nextPartRe.lastIndex = pos;
+ var result = nextPartRe.exec(p);
+ previous = current;
+ current += result[0];
+ base = previous + result[1];
+ pos = nextPartRe.lastIndex;
+
+ // continue if not a symlink
+ if (knownHard[base] || (cache && cache[base] === base)) {
+ return process.nextTick(LOOP);
+ }
+
+ if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
+ // known symbolic link. no need to stat again.
+ return gotResolvedLink(cache[base]);
+ }
+
+ return fs.lstat(base, gotStat);
+ }
+
+ function gotStat(err, stat) {
+ if (err) return cb(err);
+
+ // if not a symlink, skip to the next path part
+ if (!stat.isSymbolicLink()) {
+ knownHard[base] = true;
+ if (cache) cache[base] = base;
+ return process.nextTick(LOOP);
+ }
+
+ // stat & read the link if not read before
+ // call gotTarget as soon as the link target is known
+ // dev/ino always return 0 on windows, so skip the check.
+ if (!isWindows) {
+ var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
+ if (seenLinks.hasOwnProperty(id)) {
+ return gotTarget(null, seenLinks[id], base);
+ }
+ }
+ fs.stat(base, function(err) {
+ if (err) return cb(err);
+
+ fs.readlink(base, function(err, target) {
+ if (!isWindows) seenLinks[id] = target;
+ gotTarget(err, target);
+ });
+ });
+ }
+
+ function gotTarget(err, target, base) {
+ if (err) return cb(err);
+
+ var resolvedLink = pathModule.resolve(previous, target);
+ if (cache) cache[base] = resolvedLink;
+ gotResolvedLink(resolvedLink);
+ }
+
+ function gotResolvedLink(resolvedLink) {
+ // resolve the link, then start over
+ p = pathModule.resolve(resolvedLink, p.slice(pos));
+ start();
+ }
+};
diff --git a/node_modules/fs.realpath/package.json b/node_modules/fs.realpath/package.json
new file mode 100644
index 0000000..46bdd63
--- /dev/null
+++ b/node_modules/fs.realpath/package.json
@@ -0,0 +1,94 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "fs.realpath@^1.0.0",
+ "scope": null,
+ "escapedName": "fs.realpath",
+ "name": "fs.realpath",
+ "rawSpec": "^1.0.0",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob"
+ ]
+ ],
+ "_from": "fs.realpath@>=1.0.0 <2.0.0",
+ "_id": "fs.realpath@1.0.0",
+ "_inCache": true,
+ "_location": "/fs.realpath",
+ "_nodeVersion": "4.4.4",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/fs.realpath-1.0.0.tgz_1466015941059_0.3332864767871797"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_npmVersion": "3.9.1",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "fs.realpath@^1.0.0",
+ "scope": null,
+ "escapedName": "fs.realpath",
+ "name": "fs.realpath",
+ "rawSpec": "^1.0.0",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "_shasum": "1504ad2523158caa40db4a2787cb01411994ea4f",
+ "_shrinkwrap": null,
+ "_spec": "fs.realpath@^1.0.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/fs.realpath/issues"
+ },
+ "dependencies": {},
+ "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails",
+ "devDependencies": {},
+ "directories": {},
+ "dist": {
+ "shasum": "1504ad2523158caa40db4a2787cb01411994ea4f",
+ "tarball": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ },
+ "files": [
+ "old.js",
+ "index.js"
+ ],
+ "gitHead": "03e7c884431fe185dfebbc9b771aeca339c1807a",
+ "homepage": "https://github.com/isaacs/fs.realpath#readme",
+ "keywords": [
+ "realpath",
+ "fs",
+ "polyfill"
+ ],
+ "license": "ISC",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "name": "fs.realpath",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/isaacs/fs.realpath.git"
+ },
+ "scripts": {
+ "test": "tap test/*.js --cov"
+ },
+ "version": "1.0.0"
+}
diff --git a/node_modules/function-bind/.eslintrc b/node_modules/function-bind/.eslintrc
new file mode 100644
index 0000000..420b253
--- /dev/null
+++ b/node_modules/function-bind/.eslintrc
@@ -0,0 +1,13 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "max-nested-callbacks": [2, 3],
+ "max-params": [2, 3],
+ "max-statements": [2, 20],
+ "no-new-func": [1],
+ "strict": [0]
+ }
+}
diff --git a/node_modules/function-bind/.jscs.json b/node_modules/function-bind/.jscs.json
new file mode 100644
index 0000000..d7047f6
--- /dev/null
+++ b/node_modules/function-bind/.jscs.json
@@ -0,0 +1,159 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 8
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": "asc-insensitive",
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false,
+
+ "requireCapitalizedConstructorsNew": {
+ "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
+ }
+}
+
diff --git a/node_modules/function-bind/.npmignore b/node_modules/function-bind/.npmignore
new file mode 100644
index 0000000..8363b8e
--- /dev/null
+++ b/node_modules/function-bind/.npmignore
@@ -0,0 +1,16 @@
+.DS_Store
+.monitor
+.*.swp
+.nodemonignore
+releases
+*.log
+*.err
+fleet.json
+public/browserify
+bin/*.json
+.bin
+build
+compile
+.lock-wscript
+coverage
+node_modules
diff --git a/node_modules/function-bind/.travis.yml b/node_modules/function-bind/.travis.yml
new file mode 100644
index 0000000..caabb46
--- /dev/null
+++ b/node_modules/function-bind/.travis.yml
@@ -0,0 +1,77 @@
+language: node_js
+node_js:
+ - "5.6"
+ - "5.5"
+ - "5.4"
+ - "5.3"
+ - "5.2"
+ - "5.1"
+ - "5.0"
+ - "4.3"
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+script:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "4.3" ]; then npm run tests-only ; else npm test ; fi'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "5.5"
+ - node_js: "5.4"
+ - node_js: "5.3"
+ - node_js: "5.2"
+ - node_js: "5.1"
+ - node_js: "5.0"
+ - node_js: "4.2"
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/function-bind/LICENSE b/node_modules/function-bind/LICENSE
new file mode 100644
index 0000000..62d6d23
--- /dev/null
+++ b/node_modules/function-bind/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2013 Raynos.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/node_modules/function-bind/README.md b/node_modules/function-bind/README.md
new file mode 100644
index 0000000..81862a0
--- /dev/null
+++ b/node_modules/function-bind/README.md
@@ -0,0 +1,48 @@
+# function-bind
+
+
+
+
+
+Implementation of function.prototype.bind
+
+## Example
+
+I mainly do this for unit tests I run on phantomjs.
+PhantomJS does not have Function.prototype.bind :(
+
+```js
+Function.prototype.bind = require("function-bind")
+```
+
+## Installation
+
+`npm install function-bind`
+
+## Contributors
+
+ - Raynos
+
+## MIT Licenced
+
+ [travis-svg]: https://travis-ci.org/Raynos/function-bind.svg
+ [travis-url]: https://travis-ci.org/Raynos/function-bind
+ [npm-badge-svg]: https://badge.fury.io/js/function-bind.svg
+ [npm-url]: https://npmjs.org/package/function-bind
+ [5]: https://coveralls.io/repos/Raynos/function-bind/badge.png
+ [6]: https://coveralls.io/r/Raynos/function-bind
+ [7]: https://gemnasium.com/Raynos/function-bind.png
+ [8]: https://gemnasium.com/Raynos/function-bind
+ [deps-svg]: https://david-dm.org/Raynos/function-bind.svg
+ [deps-url]: https://david-dm.org/Raynos/function-bind
+ [dev-deps-svg]: https://david-dm.org/Raynos/function-bind/dev-status.svg
+ [dev-deps-url]: https://david-dm.org/Raynos/function-bind#info=devDependencies
+ [11]: https://ci.testling.com/Raynos/function-bind.png
+ [12]: https://ci.testling.com/Raynos/function-bind
diff --git a/node_modules/function-bind/implementation.js b/node_modules/function-bind/implementation.js
new file mode 100644
index 0000000..5e91272
--- /dev/null
+++ b/node_modules/function-bind/implementation.js
@@ -0,0 +1,48 @@
+var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
+var slice = Array.prototype.slice;
+var toStr = Object.prototype.toString;
+var funcType = '[object Function]';
+
+module.exports = function bind(that) {
+ var target = this;
+ if (typeof target !== 'function' || toStr.call(target) !== funcType) {
+ throw new TypeError(ERROR_MESSAGE + target);
+ }
+ var args = slice.call(arguments, 1);
+
+ var bound;
+ var binder = function () {
+ if (this instanceof bound) {
+ var result = target.apply(
+ this,
+ args.concat(slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return this;
+ } else {
+ return target.apply(
+ that,
+ args.concat(slice.call(arguments))
+ );
+ }
+ };
+
+ var boundLength = Math.max(0, target.length - args.length);
+ var boundArgs = [];
+ for (var i = 0; i < boundLength; i++) {
+ boundArgs.push('$' + i);
+ }
+
+ bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
+
+ if (target.prototype) {
+ var Empty = function Empty() {};
+ Empty.prototype = target.prototype;
+ bound.prototype = new Empty();
+ Empty.prototype = null;
+ }
+
+ return bound;
+};
diff --git a/node_modules/function-bind/index.js b/node_modules/function-bind/index.js
new file mode 100644
index 0000000..60ba578
--- /dev/null
+++ b/node_modules/function-bind/index.js
@@ -0,0 +1,3 @@
+var implementation = require('./implementation');
+
+module.exports = Function.prototype.bind || implementation;
diff --git a/node_modules/function-bind/package.json b/node_modules/function-bind/package.json
new file mode 100644
index 0000000..8760b3a
--- /dev/null
+++ b/node_modules/function-bind/package.json
@@ -0,0 +1,140 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "function-bind@~1.1.0",
+ "scope": null,
+ "escapedName": "function-bind",
+ "name": "function-bind",
+ "rawSpec": "~1.1.0",
+ "spec": ">=1.1.0 <1.2.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "function-bind@>=1.1.0 <1.2.0",
+ "_id": "function-bind@1.1.0",
+ "_inCache": true,
+ "_location": "/function-bind",
+ "_nodeVersion": "5.6.0",
+ "_npmOperationalInternal": {
+ "host": "packages-6-west.internal.npmjs.com",
+ "tmp": "tmp/function-bind-1.1.0.tgz_1455438520627_0.822420896962285"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.6.0",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "function-bind@~1.1.0",
+ "scope": null,
+ "escapedName": "function-bind",
+ "name": "function-bind",
+ "rawSpec": "~1.1.0",
+ "spec": ">=1.1.0 <1.2.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/es-abstract",
+ "/has",
+ "/string.prototype.trim",
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
+ "_shasum": "16176714c801798e4e8f2cf7f7529467bb4a5771",
+ "_shrinkwrap": null,
+ "_spec": "function-bind@~1.1.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "Raynos",
+ "email": "raynos2@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/Raynos/function-bind/issues",
+ "email": "raynos2@gmail.com"
+ },
+ "contributors": [
+ {
+ "name": "Raynos"
+ },
+ {
+ "name": "Jordan Harband",
+ "url": "https://github.com/ljharb"
+ }
+ ],
+ "dependencies": {},
+ "description": "Implementation of Function.prototype.bind",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^2.1.0",
+ "covert": "^1.1.0",
+ "eslint": "^2.0.0",
+ "jscs": "^2.9.0",
+ "tape": "^4.4.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "16176714c801798e4e8f2cf7f7529467bb4a5771",
+ "tarball": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz"
+ },
+ "gitHead": "cb5057f2a0018ac48c812ccee86934a5af30efdb",
+ "homepage": "https://github.com/Raynos/function-bind",
+ "keywords": [
+ "function",
+ "bind",
+ "shim",
+ "es5"
+ ],
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://github.com/Raynos/function-bind/raw/master/LICENSE"
+ }
+ ],
+ "main": "index",
+ "maintainers": [
+ {
+ "name": "raynos",
+ "email": "raynos2@gmail.com"
+ },
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "function-bind",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/Raynos/function-bind.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "eslint": "eslint *.js */*.js",
+ "jscs": "jscs *.js */*.js",
+ "lint": "npm run jscs && npm run eslint",
+ "test": "npm run lint && npm run tests-only && npm run coverage-quiet",
+ "tests-only": "node test"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "ie/8..latest",
+ "firefox/16..latest",
+ "firefox/nightly",
+ "chrome/22..latest",
+ "chrome/canary",
+ "opera/12..latest",
+ "opera/next",
+ "safari/5.1..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2..latest"
+ ]
+ },
+ "version": "1.1.0"
+}
diff --git a/node_modules/function-bind/test/index.js b/node_modules/function-bind/test/index.js
new file mode 100644
index 0000000..ba1bfad
--- /dev/null
+++ b/node_modules/function-bind/test/index.js
@@ -0,0 +1,250 @@
+var test = require('tape');
+
+var functionBind = require('../implementation');
+var getCurrentContext = function () { return this; };
+
+test('functionBind is a function', function (t) {
+ t.equal(typeof functionBind, 'function');
+ t.end();
+});
+
+test('non-functions', function (t) {
+ var nonFunctions = [true, false, [], {}, 42, 'foo', NaN, /a/g];
+ t.plan(nonFunctions.length);
+ for (var i = 0; i < nonFunctions.length; ++i) {
+ try { functionBind.call(nonFunctions[i]); } catch (ex) {
+ t.ok(ex instanceof TypeError, 'throws when given ' + String(nonFunctions[i]));
+ }
+ }
+ t.end();
+});
+
+test('without a context', function (t) {
+ t.test('binds properly', function (st) {
+ var args, context;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ })
+ };
+ namespace.func(1, 2, 3);
+ st.deepEqual(args, [1, 2, 3]);
+ st.equal(context, getCurrentContext.call());
+ st.end();
+ });
+
+ t.test('binds properly, and still supplies bound arguments', function (st) {
+ var args, context;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ }, undefined, 1, 2, 3)
+ };
+ namespace.func(4, 5, 6);
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6]);
+ st.equal(context, getCurrentContext.call());
+ st.end();
+ });
+
+ t.test('returns properly', function (st) {
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, null)
+ };
+ var context = namespace.func(1, 2, 3);
+ st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
+ st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('returns properly with bound arguments', function (st) {
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, null, 1, 2, 3)
+ };
+ var context = namespace.func(4, 5, 6);
+ st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('called as a constructor', function (st) {
+ var thunkify = function (value) {
+ return function () { return value; };
+ };
+ st.test('returns object value', function (sst) {
+ var expectedReturnValue = [1, 2, 3];
+ var Constructor = functionBind.call(thunkify(expectedReturnValue), null);
+ var result = new Constructor();
+ sst.equal(result, expectedReturnValue);
+ sst.end();
+ });
+
+ st.test('does not return primitive value', function (sst) {
+ var Constructor = functionBind.call(thunkify(42), null);
+ var result = new Constructor();
+ sst.notEqual(result, 42);
+ sst.end();
+ });
+
+ st.test('object from bound constructor is instance of original and bound constructor', function (sst) {
+ var A = function (x) {
+ this.name = x || 'A';
+ };
+ var B = functionBind.call(A, null, 'B');
+
+ var result = new B();
+ sst.ok(result instanceof B, 'result is instance of bound constructor');
+ sst.ok(result instanceof A, 'result is instance of original constructor');
+ sst.end();
+ });
+
+ st.end();
+ });
+
+ t.end();
+});
+
+test('with a context', function (t) {
+ t.test('with no bound arguments', function (st) {
+ var args, context;
+ var boundContext = {};
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ }, boundContext)
+ };
+ namespace.func(1, 2, 3);
+ st.equal(context, boundContext, 'binds a context properly');
+ st.deepEqual(args, [1, 2, 3], 'supplies passed arguments');
+ st.end();
+ });
+
+ t.test('with bound arguments', function (st) {
+ var args, context;
+ var boundContext = {};
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ context = this;
+ }, boundContext, 1, 2, 3)
+ };
+ namespace.func(4, 5, 6);
+ st.equal(context, boundContext, 'binds a context properly');
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'supplies bound and passed arguments');
+ st.end();
+ });
+
+ t.test('returns properly', function (st) {
+ var boundContext = {};
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, boundContext)
+ };
+ var context = namespace.func(1, 2, 3);
+ st.equal(context, boundContext, 'returned context is bound context');
+ st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
+ st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('returns properly with bound arguments', function (st) {
+ var boundContext = {};
+ var args;
+ var namespace = {
+ func: functionBind.call(function () {
+ args = Array.prototype.slice.call(arguments);
+ return this;
+ }, boundContext, 1, 2, 3)
+ };
+ var context = namespace.func(4, 5, 6);
+ st.equal(context, boundContext, 'returned context is bound context');
+ st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
+ st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
+ st.end();
+ });
+
+ t.test('passes the correct arguments when called as a constructor', function (st) {
+ var expected = { name: 'Correct' };
+ var namespace = {
+ Func: functionBind.call(function (arg) {
+ return arg;
+ }, { name: 'Incorrect' })
+ };
+ var returned = new namespace.Func(expected);
+ st.equal(returned, expected, 'returns the right arg when called as a constructor');
+ st.end();
+ });
+
+ t.test('has the new instance\'s context when called as a constructor', function (st) {
+ var actualContext;
+ var expectedContext = { foo: 'bar' };
+ var namespace = {
+ Func: functionBind.call(function () {
+ actualContext = this;
+ }, expectedContext)
+ };
+ var result = new namespace.Func();
+ st.equal(result instanceof namespace.Func, true);
+ st.notEqual(actualContext, expectedContext);
+ st.end();
+ });
+
+ t.end();
+});
+
+test('bound function length', function (t) {
+ t.test('sets a correct length without thisArg', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; });
+ st.equal(subject.length, 3);
+ st.equal(subject(1, 2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length with thisArg', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {});
+ st.equal(subject.length, 3);
+ st.equal(subject(1, 2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length without thisArg and first argument', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1);
+ st.equal(subject.length, 2);
+ st.equal(subject(2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length with thisArg and first argument', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1);
+ st.equal(subject.length, 2);
+ st.equal(subject(2, 3), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length without thisArg and too many arguments', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1, 2, 3, 4);
+ st.equal(subject.length, 0);
+ st.equal(subject(), 6);
+ st.end();
+ });
+
+ t.test('sets a correct length with thisArg and too many arguments', function (st) {
+ var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1, 2, 3, 4);
+ st.equal(subject.length, 0);
+ st.equal(subject(), 6);
+ st.end();
+ });
+});
diff --git a/node_modules/glob/LICENSE b/node_modules/glob/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/glob/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/glob/README.md b/node_modules/glob/README.md
new file mode 100644
index 0000000..baa1d1b
--- /dev/null
+++ b/node_modules/glob/README.md
@@ -0,0 +1,368 @@
+# Glob
+
+Match files using the patterns the shell uses, like stars and stuff.
+
+[](https://travis-ci.org/isaacs/node-glob/) [](https://ci.appveyor.com/project/isaacs/node-glob) [](https://coveralls.io/github/isaacs/node-glob?branch=master)
+
+This is a glob implementation in JavaScript. It uses the `minimatch`
+library to do its matching.
+
+
+
+## Usage
+
+Install with npm
+
+```
+npm i glob
+```
+
+```javascript
+var glob = require("glob")
+
+// options is optional
+glob("**/*.js", options, function (er, files) {
+ // files is an array of filenames.
+ // If the `nonull` option is set, and nothing
+ // was found, then files is ["**/*.js"]
+ // er is an error object or null.
+})
+```
+
+## Glob Primer
+
+"Globs" are the patterns you type when you do stuff like `ls *.js` on
+the command line, or put `build/*` in a `.gitignore` file.
+
+Before parsing the path part patterns, braced sections are expanded
+into a set. Braced sections start with `{` and end with `}`, with any
+number of comma-delimited sections within. Braced sections may contain
+slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`.
+
+The following characters have special magic meaning when used in a
+path portion:
+
+* `*` Matches 0 or more characters in a single path portion
+* `?` Matches 1 character
+* `[...]` Matches a range of characters, similar to a RegExp range.
+ If the first character of the range is `!` or `^` then it matches
+ any character not in the range.
+* `!(pattern|pattern|pattern)` Matches anything that does not match
+ any of the patterns provided.
+* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the
+ patterns provided.
+* `+(pattern|pattern|pattern)` Matches one or more occurrences of the
+ patterns provided.
+* `*(a|b|c)` Matches zero or more occurrences of the patterns provided
+* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
+ provided
+* `**` If a "globstar" is alone in a path portion, then it matches
+ zero or more directories and subdirectories searching for matches.
+ It does not crawl symlinked directories.
+
+### Dots
+
+If a file or directory path portion has a `.` as the first character,
+then it will not match any glob pattern unless that pattern's
+corresponding path part also has a `.` as its first character.
+
+For example, the pattern `a/.*/c` would match the file at `a/.b/c`.
+However the pattern `a/*/c` would not, because `*` does not start with
+a dot character.
+
+You can make glob treat dots as normal characters by setting
+`dot:true` in the options.
+
+### Basename Matching
+
+If you set `matchBase:true` in the options, and the pattern has no
+slashes in it, then it will seek for any file anywhere in the tree
+with a matching basename. For example, `*.js` would match
+`test/simple/basic.js`.
+
+### Empty Sets
+
+If no matching files are found, then an empty array is returned. This
+differs from the shell, where the pattern itself is returned. For
+example:
+
+ $ echo a*s*d*f
+ a*s*d*f
+
+To get the bash-style behavior, set the `nonull:true` in the options.
+
+### See Also:
+
+* `man sh`
+* `man bash` (Search for "Pattern Matching")
+* `man 3 fnmatch`
+* `man 5 gitignore`
+* [minimatch documentation](https://github.com/isaacs/minimatch)
+
+## glob.hasMagic(pattern, [options])
+
+Returns `true` if there are any special characters in the pattern, and
+`false` otherwise.
+
+Note that the options affect the results. If `noext:true` is set in
+the options object, then `+(a|b)` will not be considered a magic
+pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}`
+then that is considered magical, unless `nobrace:true` is set in the
+options.
+
+## glob(pattern, [options], cb)
+
+* `pattern` `{String}` Pattern to be matched
+* `options` `{Object}`
+* `cb` `{Function}`
+ * `err` `{Error | null}`
+ * `matches` `{Array}` filenames found matching the pattern
+
+Perform an asynchronous glob search.
+
+## glob.sync(pattern, [options])
+
+* `pattern` `{String}` Pattern to be matched
+* `options` `{Object}`
+* return: `{Array}` filenames found matching the pattern
+
+Perform a synchronous glob search.
+
+## Class: glob.Glob
+
+Create a Glob object by instantiating the `glob.Glob` class.
+
+```javascript
+var Glob = require("glob").Glob
+var mg = new Glob(pattern, options, cb)
+```
+
+It's an EventEmitter, and starts walking the filesystem to find matches
+immediately.
+
+### new glob.Glob(pattern, [options], [cb])
+
+* `pattern` `{String}` pattern to search for
+* `options` `{Object}`
+* `cb` `{Function}` Called when an error occurs, or matches are found
+ * `err` `{Error | null}`
+ * `matches` `{Array}` filenames found matching the pattern
+
+Note that if the `sync` flag is set in the options, then matches will
+be immediately available on the `g.found` member.
+
+### Properties
+
+* `minimatch` The minimatch object that the glob uses.
+* `options` The options object passed in.
+* `aborted` Boolean which is set to true when calling `abort()`. There
+ is no way at this time to continue a glob search after aborting, but
+ you can re-use the statCache to avoid having to duplicate syscalls.
+* `cache` Convenience object. Each field has the following possible
+ values:
+ * `false` - Path does not exist
+ * `true` - Path exists
+ * `'FILE'` - Path exists, and is not a directory
+ * `'DIR'` - Path exists, and is a directory
+ * `[file, entries, ...]` - Path exists, is a directory, and the
+ array value is the results of `fs.readdir`
+* `statCache` Cache of `fs.stat` results, to prevent statting the same
+ path multiple times.
+* `symlinks` A record of which paths are symbolic links, which is
+ relevant in resolving `**` patterns.
+* `realpathCache` An optional object which is passed to `fs.realpath`
+ to minimize unnecessary syscalls. It is stored on the instantiated
+ Glob object, and may be re-used.
+
+### Events
+
+* `end` When the matching is finished, this is emitted with all the
+ matches found. If the `nonull` option is set, and no match was found,
+ then the `matches` list contains the original pattern. The matches
+ are sorted, unless the `nosort` flag is set.
+* `match` Every time a match is found, this is emitted with the specific
+ thing that matched. It is not deduplicated or resolved to a realpath.
+* `error` Emitted when an unexpected error is encountered, or whenever
+ any fs error occurs if `options.strict` is set.
+* `abort` When `abort()` is called, this event is raised.
+
+### Methods
+
+* `pause` Temporarily stop the search
+* `resume` Resume the search
+* `abort` Stop the search forever
+
+### Options
+
+All the options that can be passed to Minimatch can also be passed to
+Glob to change pattern matching behavior. Also, some have been added,
+or have glob-specific ramifications.
+
+All options are false by default, unless otherwise noted.
+
+All options are added to the Glob object, as well.
+
+If you are running many `glob` operations, you can pass a Glob object
+as the `options` argument to a subsequent operation to shortcut some
+`stat` and `readdir` calls. At the very least, you may pass in shared
+`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that
+parallel glob operations will be sped up by sharing information about
+the filesystem.
+
+* `cwd` The current working directory in which to search. Defaults
+ to `process.cwd()`.
+* `root` The place where patterns starting with `/` will be mounted
+ onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix
+ systems, and `C:\` or some such on Windows.)
+* `dot` Include `.dot` files in normal matches and `globstar` matches.
+ Note that an explicit dot in a portion of the pattern will always
+ match dot files.
+* `nomount` By default, a pattern starting with a forward-slash will be
+ "mounted" onto the root setting, so that a valid filesystem path is
+ returned. Set this flag to disable that behavior.
+* `mark` Add a `/` character to directory matches. Note that this
+ requires additional stat calls.
+* `nosort` Don't sort the results.
+* `stat` Set to true to stat *all* results. This reduces performance
+ somewhat, and is completely unnecessary, unless `readdir` is presumed
+ to be an untrustworthy indicator of file existence.
+* `silent` When an unusual error is encountered when attempting to
+ read a directory, a warning will be printed to stderr. Set the
+ `silent` option to true to suppress these warnings.
+* `strict` When an unusual error is encountered when attempting to
+ read a directory, the process will just continue on in search of
+ other matches. Set the `strict` option to raise an error in these
+ cases.
+* `cache` See `cache` property above. Pass in a previously generated
+ cache object to save some fs calls.
+* `statCache` A cache of results of filesystem information, to prevent
+ unnecessary stat calls. While it should not normally be necessary
+ to set this, you may pass the statCache from one glob() call to the
+ options object of another, if you know that the filesystem will not
+ change between calls. (See "Race Conditions" below.)
+* `symlinks` A cache of known symbolic links. You may pass in a
+ previously generated `symlinks` object to save `lstat` calls when
+ resolving `**` matches.
+* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead.
+* `nounique` In some cases, brace-expanded patterns can result in the
+ same file showing up multiple times in the result set. By default,
+ this implementation prevents duplicates in the result set. Set this
+ flag to disable that behavior.
+* `nonull` Set to never return an empty set, instead returning a set
+ containing the pattern itself. This is the default in glob(3).
+* `debug` Set to enable debug logging in minimatch and glob.
+* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
+* `noglobstar` Do not match `**` against multiple filenames. (Ie,
+ treat it as a normal `*` instead.)
+* `noext` Do not match `+(a|b)` "extglob" patterns.
+* `nocase` Perform a case-insensitive match. Note: on
+ case-insensitive filesystems, non-magic patterns will match by
+ default, since `stat` and `readdir` will not raise errors.
+* `matchBase` Perform a basename-only match if the pattern does not
+ contain any slash characters. That is, `*.js` would be treated as
+ equivalent to `**/*.js`, matching all js files in all directories.
+* `nodir` Do not match directories, only files. (Note: to match
+ *only* directories, simply put a `/` at the end of the pattern.)
+* `ignore` Add a pattern or an array of glob patterns to exclude matches.
+ Note: `ignore` patterns are *always* in `dot:true` mode, regardless
+ of any other settings.
+* `follow` Follow symlinked directories when expanding `**` patterns.
+ Note that this can result in a lot of duplicate references in the
+ presence of cyclic links.
+* `realpath` Set to true to call `fs.realpath` on all of the results.
+ In the case of a symlink that cannot be resolved, the full absolute
+ path to the matched entry is returned (though it will usually be a
+ broken symlink)
+* `absolute` Set to true to always receive absolute paths for matched
+ files. Unlike `realpath`, this also affects the values returned in
+ the `match` event.
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between node-glob and other
+implementations, and are intentional.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set. This is supported in the manner of bsdglob
+and bash 4.3, where `**` only has special significance if it is the only
+thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+Note that symlinked directories are not crawled as part of a `**`,
+though their contents may match against subsequent portions of the
+pattern. This prevents infinite loops and duplicates and the like.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then glob returns the pattern as-provided, rather than
+interpreting the character escapes. For example,
+`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`. This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern. Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity. Since those two are valid, matching proceeds.
+
+### Comments and Negation
+
+Previously, this module let you mark a pattern as a "comment" if it
+started with a `#` character, or a "negated" pattern if it started
+with a `!` character.
+
+These options were deprecated in version 5, and removed in version 6.
+
+To specify things that should not match, use the `ignore` option.
+
+## Windows
+
+**Please only use forward-slashes in glob expressions.**
+
+Though windows uses either `/` or `\` as its path separator, only `/`
+characters are used by this glob implementation. You must use
+forward-slashes **only** in glob expressions. Back-slashes will always
+be interpreted as escape characters, not path separators.
+
+Results from absolute patterns such as `/foo/*` are mounted onto the
+root setting using `path.join`. On windows, this will by default result
+in `/foo/*` matching `C:\foo\bar.txt`.
+
+## Race Conditions
+
+Glob searching, by its very nature, is susceptible to race conditions,
+since it relies on directory walking and such.
+
+As a result, it is possible that a file that exists when glob looks for
+it may have been deleted or modified by the time it returns the result.
+
+As part of its internal implementation, this program caches all stat
+and readdir calls that it makes, in order to cut down on system
+overhead. However, this also makes it even more susceptible to races,
+especially if the cache or statCache objects are reused between glob
+calls.
+
+Users are thus advised not to use a glob result as a guarantee of
+filesystem state in the face of rapid changes. For the vast majority
+of operations, this is never a problem.
+
+## Contributing
+
+Any change to behavior (including bugfixes) must come with a test.
+
+Patches that fail tests or reduce performance will be rejected.
+
+```
+# to run tests
+npm test
+
+# to re-generate test fixtures
+npm run test-regen
+
+# to benchmark against bash/zsh
+npm run bench
+
+# to profile javascript
+npm run prof
+```
diff --git a/node_modules/glob/changelog.md b/node_modules/glob/changelog.md
new file mode 100644
index 0000000..4163677
--- /dev/null
+++ b/node_modules/glob/changelog.md
@@ -0,0 +1,67 @@
+## 7.0
+
+- Raise error if `options.cwd` is specified, and not a directory
+
+## 6.0
+
+- Remove comment and negation pattern support
+- Ignore patterns are always in `dot:true` mode
+
+## 5.0
+
+- Deprecate comment and negation patterns
+- Fix regression in `mark` and `nodir` options from making all cache
+ keys absolute path.
+- Abort if `fs.readdir` returns an error that's unexpected
+- Don't emit `match` events for ignored items
+- Treat ENOTSUP like ENOTDIR in readdir
+
+## 4.5
+
+- Add `options.follow` to always follow directory symlinks in globstar
+- Add `options.realpath` to call `fs.realpath` on all results
+- Always cache based on absolute path
+
+## 4.4
+
+- Add `options.ignore`
+- Fix handling of broken symlinks
+
+## 4.3
+
+- Bump minimatch to 2.x
+- Pass all tests on Windows
+
+## 4.2
+
+- Add `glob.hasMagic` function
+- Add `options.nodir` flag
+
+## 4.1
+
+- Refactor sync and async implementations for performance
+- Throw if callback provided to sync glob function
+- Treat symbolic links in globstar results the same as Bash 4.3
+
+## 4.0
+
+- Use `^` for dependency versions (bumped major because this breaks
+ older npm versions)
+- Ensure callbacks are only ever called once
+- switch to ISC license
+
+## 3.x
+
+- Rewrite in JavaScript
+- Add support for setting root, cwd, and windows support
+- Cache many fs calls
+- Add globstar support
+- emit match events
+
+## 2.x
+
+- Use `glob.h` and `fnmatch.h` from NetBSD
+
+## 1.x
+
+- `glob.h` static binding.
diff --git a/node_modules/glob/common.js b/node_modules/glob/common.js
new file mode 100644
index 0000000..66651bb
--- /dev/null
+++ b/node_modules/glob/common.js
@@ -0,0 +1,240 @@
+exports.alphasort = alphasort
+exports.alphasorti = alphasorti
+exports.setopts = setopts
+exports.ownProp = ownProp
+exports.makeAbs = makeAbs
+exports.finish = finish
+exports.mark = mark
+exports.isIgnored = isIgnored
+exports.childrenIgnored = childrenIgnored
+
+function ownProp (obj, field) {
+ return Object.prototype.hasOwnProperty.call(obj, field)
+}
+
+var path = require("path")
+var minimatch = require("minimatch")
+var isAbsolute = require("path-is-absolute")
+var Minimatch = minimatch.Minimatch
+
+function alphasorti (a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase())
+}
+
+function alphasort (a, b) {
+ return a.localeCompare(b)
+}
+
+function setupIgnores (self, options) {
+ self.ignore = options.ignore || []
+
+ if (!Array.isArray(self.ignore))
+ self.ignore = [self.ignore]
+
+ if (self.ignore.length) {
+ self.ignore = self.ignore.map(ignoreMap)
+ }
+}
+
+// ignore patterns are always in dot:true mode.
+function ignoreMap (pattern) {
+ var gmatcher = null
+ if (pattern.slice(-3) === '/**') {
+ var gpattern = pattern.replace(/(\/\*\*)+$/, '')
+ gmatcher = new Minimatch(gpattern, { dot: true })
+ }
+
+ return {
+ matcher: new Minimatch(pattern, { dot: true }),
+ gmatcher: gmatcher
+ }
+}
+
+function setopts (self, pattern, options) {
+ if (!options)
+ options = {}
+
+ // base-matching: just use globstar for that.
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
+ if (options.noglobstar) {
+ throw new Error("base matching requires globstar")
+ }
+ pattern = "**/" + pattern
+ }
+
+ self.silent = !!options.silent
+ self.pattern = pattern
+ self.strict = options.strict !== false
+ self.realpath = !!options.realpath
+ self.realpathCache = options.realpathCache || Object.create(null)
+ self.follow = !!options.follow
+ self.dot = !!options.dot
+ self.mark = !!options.mark
+ self.nodir = !!options.nodir
+ if (self.nodir)
+ self.mark = true
+ self.sync = !!options.sync
+ self.nounique = !!options.nounique
+ self.nonull = !!options.nonull
+ self.nosort = !!options.nosort
+ self.nocase = !!options.nocase
+ self.stat = !!options.stat
+ self.noprocess = !!options.noprocess
+ self.absolute = !!options.absolute
+
+ self.maxLength = options.maxLength || Infinity
+ self.cache = options.cache || Object.create(null)
+ self.statCache = options.statCache || Object.create(null)
+ self.symlinks = options.symlinks || Object.create(null)
+
+ setupIgnores(self, options)
+
+ self.changedCwd = false
+ var cwd = process.cwd()
+ if (!ownProp(options, "cwd"))
+ self.cwd = cwd
+ else {
+ self.cwd = path.resolve(options.cwd)
+ self.changedCwd = self.cwd !== cwd
+ }
+
+ self.root = options.root || path.resolve(self.cwd, "/")
+ self.root = path.resolve(self.root)
+ if (process.platform === "win32")
+ self.root = self.root.replace(/\\/g, "/")
+
+ // TODO: is an absolute `cwd` supposed to be resolved against `root`?
+ // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
+ self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
+ if (process.platform === "win32")
+ self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
+ self.nomount = !!options.nomount
+
+ // disable comments and negation in Minimatch.
+ // Note that they are not supported in Glob itself anyway.
+ options.nonegate = true
+ options.nocomment = true
+
+ self.minimatch = new Minimatch(pattern, options)
+ self.options = self.minimatch.options
+}
+
+function finish (self) {
+ var nou = self.nounique
+ var all = nou ? [] : Object.create(null)
+
+ for (var i = 0, l = self.matches.length; i < l; i ++) {
+ var matches = self.matches[i]
+ if (!matches || Object.keys(matches).length === 0) {
+ if (self.nonull) {
+ // do like the shell, and spit out the literal glob
+ var literal = self.minimatch.globSet[i]
+ if (nou)
+ all.push(literal)
+ else
+ all[literal] = true
+ }
+ } else {
+ // had matches
+ var m = Object.keys(matches)
+ if (nou)
+ all.push.apply(all, m)
+ else
+ m.forEach(function (m) {
+ all[m] = true
+ })
+ }
+ }
+
+ if (!nou)
+ all = Object.keys(all)
+
+ if (!self.nosort)
+ all = all.sort(self.nocase ? alphasorti : alphasort)
+
+ // at *some* point we statted all of these
+ if (self.mark) {
+ for (var i = 0; i < all.length; i++) {
+ all[i] = self._mark(all[i])
+ }
+ if (self.nodir) {
+ all = all.filter(function (e) {
+ var notDir = !(/\/$/.test(e))
+ var c = self.cache[e] || self.cache[makeAbs(self, e)]
+ if (notDir && c)
+ notDir = c !== 'DIR' && !Array.isArray(c)
+ return notDir
+ })
+ }
+ }
+
+ if (self.ignore.length)
+ all = all.filter(function(m) {
+ return !isIgnored(self, m)
+ })
+
+ self.found = all
+}
+
+function mark (self, p) {
+ var abs = makeAbs(self, p)
+ var c = self.cache[abs]
+ var m = p
+ if (c) {
+ var isDir = c === 'DIR' || Array.isArray(c)
+ var slash = p.slice(-1) === '/'
+
+ if (isDir && !slash)
+ m += '/'
+ else if (!isDir && slash)
+ m = m.slice(0, -1)
+
+ if (m !== p) {
+ var mabs = makeAbs(self, m)
+ self.statCache[mabs] = self.statCache[abs]
+ self.cache[mabs] = self.cache[abs]
+ }
+ }
+
+ return m
+}
+
+// lotta situps...
+function makeAbs (self, f) {
+ var abs = f
+ if (f.charAt(0) === '/') {
+ abs = path.join(self.root, f)
+ } else if (isAbsolute(f) || f === '') {
+ abs = f
+ } else if (self.changedCwd) {
+ abs = path.resolve(self.cwd, f)
+ } else {
+ abs = path.resolve(f)
+ }
+
+ if (process.platform === 'win32')
+ abs = abs.replace(/\\/g, '/')
+
+ return abs
+}
+
+
+// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
+// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
+function isIgnored (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
+
+function childrenIgnored (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
diff --git a/node_modules/glob/glob.js b/node_modules/glob/glob.js
new file mode 100644
index 0000000..bfdd7a1
--- /dev/null
+++ b/node_modules/glob/glob.js
@@ -0,0 +1,792 @@
+// Approach:
+//
+// 1. Get the minimatch set
+// 2. For each pattern in the set, PROCESS(pattern, false)
+// 3. Store matches per-set, then uniq them
+//
+// PROCESS(pattern, inGlobStar)
+// Get the first [n] items from pattern that are all strings
+// Join these together. This is PREFIX.
+// If there is no more remaining, then stat(PREFIX) and
+// add to matches if it succeeds. END.
+//
+// If inGlobStar and PREFIX is symlink and points to dir
+// set ENTRIES = []
+// else readdir(PREFIX) as ENTRIES
+// If fail, END
+//
+// with ENTRIES
+// If pattern[n] is GLOBSTAR
+// // handle the case where the globstar match is empty
+// // by pruning it out, and testing the resulting pattern
+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
+// // handle other cases.
+// for ENTRY in ENTRIES (not dotfiles)
+// // attach globstar + tail onto the entry
+// // Mark that this entry is a globstar match
+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
+//
+// else // not globstar
+// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
+// Test ENTRY against pattern[n]
+// If fails, continue
+// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
+//
+// Caveat:
+// Cache all stats and readdirs results to minimize syscall. Since all
+// we ever care about is existence and directory-ness, we can just keep
+// `true` for files, and [children,...] for directories, or `false` for
+// things that don't exist.
+
+module.exports = glob
+
+var fs = require('fs')
+var rp = require('fs.realpath')
+var minimatch = require('minimatch')
+var Minimatch = minimatch.Minimatch
+var inherits = require('inherits')
+var EE = require('events').EventEmitter
+var path = require('path')
+var assert = require('assert')
+var isAbsolute = require('path-is-absolute')
+var globSync = require('./sync.js')
+var common = require('./common.js')
+var alphasort = common.alphasort
+var alphasorti = common.alphasorti
+var setopts = common.setopts
+var ownProp = common.ownProp
+var inflight = require('inflight')
+var util = require('util')
+var childrenIgnored = common.childrenIgnored
+var isIgnored = common.isIgnored
+
+var once = require('once')
+
+function glob (pattern, options, cb) {
+ if (typeof options === 'function') cb = options, options = {}
+ if (!options) options = {}
+
+ if (options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return globSync(pattern, options)
+ }
+
+ return new Glob(pattern, options, cb)
+}
+
+glob.sync = globSync
+var GlobSync = glob.GlobSync = globSync.GlobSync
+
+// old api surface
+glob.glob = glob
+
+function extend (origin, add) {
+ if (add === null || typeof add !== 'object') {
+ return origin
+ }
+
+ var keys = Object.keys(add)
+ var i = keys.length
+ while (i--) {
+ origin[keys[i]] = add[keys[i]]
+ }
+ return origin
+}
+
+glob.hasMagic = function (pattern, options_) {
+ var options = extend({}, options_)
+ options.noprocess = true
+
+ var g = new Glob(pattern, options)
+ var set = g.minimatch.set
+
+ if (!pattern)
+ return false
+
+ if (set.length > 1)
+ return true
+
+ for (var j = 0; j < set[0].length; j++) {
+ if (typeof set[0][j] !== 'string')
+ return true
+ }
+
+ return false
+}
+
+glob.Glob = Glob
+inherits(Glob, EE)
+function Glob (pattern, options, cb) {
+ if (typeof options === 'function') {
+ cb = options
+ options = null
+ }
+
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
+ }
+
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
+
+ setopts(this, pattern, options)
+ this._didRealPath = false
+
+ // process each pattern in the minimatch set
+ var n = this.minimatch.set.length
+
+ // The matches are stored as {: true,...} so that
+ // duplicates are automagically pruned.
+ // Later, we do an Object.keys() on these.
+ // Keep them as a list so we can fill in when nonull is set.
+ this.matches = new Array(n)
+
+ if (typeof cb === 'function') {
+ cb = once(cb)
+ this.on('error', cb)
+ this.on('end', function (matches) {
+ cb(null, matches)
+ })
+ }
+
+ var self = this
+ var n = this.minimatch.set.length
+ this._processing = 0
+ this.matches = new Array(n)
+
+ this._emitQueue = []
+ this._processQueue = []
+ this.paused = false
+
+ if (this.noprocess)
+ return this
+
+ if (n === 0)
+ return done()
+
+ var sync = true
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done)
+ }
+ sync = false
+
+ function done () {
+ --self._processing
+ if (self._processing <= 0) {
+ if (sync) {
+ process.nextTick(function () {
+ self._finish()
+ })
+ } else {
+ self._finish()
+ }
+ }
+ }
+}
+
+Glob.prototype._finish = function () {
+ assert(this instanceof Glob)
+ if (this.aborted)
+ return
+
+ if (this.realpath && !this._didRealpath)
+ return this._realpath()
+
+ common.finish(this)
+ this.emit('end', this.found)
+}
+
+Glob.prototype._realpath = function () {
+ if (this._didRealpath)
+ return
+
+ this._didRealpath = true
+
+ var n = this.matches.length
+ if (n === 0)
+ return this._finish()
+
+ var self = this
+ for (var i = 0; i < this.matches.length; i++)
+ this._realpathSet(i, next)
+
+ function next () {
+ if (--n === 0)
+ self._finish()
+ }
+}
+
+Glob.prototype._realpathSet = function (index, cb) {
+ var matchset = this.matches[index]
+ if (!matchset)
+ return cb()
+
+ var found = Object.keys(matchset)
+ var self = this
+ var n = found.length
+
+ if (n === 0)
+ return cb()
+
+ var set = this.matches[index] = Object.create(null)
+ found.forEach(function (p, i) {
+ // If there's a problem with the stat, then it means that
+ // one or more of the links in the realpath couldn't be
+ // resolved. just return the abs value in that case.
+ p = self._makeAbs(p)
+ rp.realpath(p, self.realpathCache, function (er, real) {
+ if (!er)
+ set[real] = true
+ else if (er.syscall === 'stat')
+ set[p] = true
+ else
+ self.emit('error', er) // srsly wtf right here
+
+ if (--n === 0) {
+ self.matches[index] = set
+ cb()
+ }
+ })
+ })
+}
+
+Glob.prototype._mark = function (p) {
+ return common.mark(this, p)
+}
+
+Glob.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
+}
+
+Glob.prototype.abort = function () {
+ this.aborted = true
+ this.emit('abort')
+}
+
+Glob.prototype.pause = function () {
+ if (!this.paused) {
+ this.paused = true
+ this.emit('pause')
+ }
+}
+
+Glob.prototype.resume = function () {
+ if (this.paused) {
+ this.emit('resume')
+ this.paused = false
+ if (this._emitQueue.length) {
+ var eq = this._emitQueue.slice(0)
+ this._emitQueue.length = 0
+ for (var i = 0; i < eq.length; i ++) {
+ var e = eq[i]
+ this._emitMatch(e[0], e[1])
+ }
+ }
+ if (this._processQueue.length) {
+ var pq = this._processQueue.slice(0)
+ this._processQueue.length = 0
+ for (var i = 0; i < pq.length; i ++) {
+ var p = pq[i]
+ this._processing--
+ this._process(p[0], p[1], p[2], p[3])
+ }
+ }
+ }
+}
+
+Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
+ assert(this instanceof Glob)
+ assert(typeof cb === 'function')
+
+ if (this.aborted)
+ return
+
+ this._processing++
+ if (this.paused) {
+ this._processQueue.push([pattern, index, inGlobStar, cb])
+ return
+ }
+
+ //console.error('PROCESS %d', this._processing, pattern)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0
+ while (typeof pattern[n] === 'string') {
+ n ++
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // see if there's anything else
+ var prefix
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index, cb)
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/')
+ break
+ }
+
+ var remain = pattern.slice(n)
+
+ // get the list of entries.
+ var read
+ if (prefix === null)
+ read = '.'
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix
+ read = prefix
+ } else
+ read = prefix
+
+ var abs = this._makeAbs(read)
+
+ //if ignored, skip _processing
+ if (childrenIgnored(this, read))
+ return cb()
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
+}
+
+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return cb()
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === '.'
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
+ }
+ }
+
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return cb()
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this._emitMatch(index, e)
+ }
+ // This was the last one, and no stats were needed
+ return cb()
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+ this._process([e].concat(remain), index, inGlobStar, cb)
+ }
+ cb()
+}
+
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
+
+ if (isIgnored(this, e))
+ return
+
+ if (this.paused) {
+ this._emitQueue.push([index, e])
+ return
+ }
+
+ var abs = isAbsolute(e) ? e : this._makeAbs(e)
+
+ if (this.mark)
+ e = this._mark(e)
+
+ if (this.absolute)
+ e = abs
+
+ if (this.matches[index][e])
+ return
+
+ if (this.nodir) {
+ var c = this.cache[abs]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ this.matches[index][e] = true
+
+ var st = this.statCache[abs]
+ if (st)
+ this.emit('stat', e, st)
+
+ this.emit('match', e)
+}
+
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
+
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false, cb)
+
+ var lstatkey = 'lstat\0' + abs
+ var self = this
+ var lstatcb = inflight(lstatkey, lstatcb_)
+
+ if (lstatcb)
+ fs.lstat(abs, lstatcb)
+
+ function lstatcb_ (er, lstat) {
+ if (er && er.code === 'ENOENT')
+ return cb()
+
+ var isSym = lstat && lstat.isSymbolicLink()
+ self.symlinks[abs] = isSym
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && lstat && !lstat.isDirectory()) {
+ self.cache[abs] = 'FILE'
+ cb()
+ } else
+ self._readdir(abs, false, cb)
+ }
+}
+
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
+
+ cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
+ if (!cb)
+ return
+
+ //console.error('RD %j %j', +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return cb()
+
+ if (Array.isArray(c))
+ return cb(null, c)
+ }
+
+ var self = this
+ fs.readdir(abs, readdirCb(this, abs, cb))
+}
+
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb)
+ else
+ self._readdirEntries(abs, entries, cb)
+ }
+}
+
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
+
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === '/')
+ e = abs + e
+ else
+ e = abs + '/' + e
+ this.cache[e] = true
+ }
+ }
+
+ this.cache[abs] = entries
+ return cb(null, entries)
+}
+
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
+
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ var abs = this._makeAbs(f)
+ this.cache[abs] = 'FILE'
+ if (abs === this.cwdAbs) {
+ var error = new Error(er.code + ' invalid cwd ' + this.cwd)
+ error.path = this.cwd
+ error.code = er.code
+ this.emit('error', error)
+ this.abort()
+ }
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false
+ if (this.strict) {
+ this.emit('error', er)
+ // If the error is handled, then we abort
+ // if not, we threw out of here
+ this.abort()
+ }
+ if (!this.silent)
+ console.error('glob error', er)
+ break
+ }
+
+ return cb()
+}
+
+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+
+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+ //console.error('pgs2', prefix, remain[0], entries)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return cb()
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false, cb)
+
+ var isSym = this.symlinks[abs]
+ var len = entries.length
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return cb()
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true, cb)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true, cb)
+ }
+
+ cb()
+}
+
+Glob.prototype._processSimple = function (prefix, index, cb) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var self = this
+ this._stat(prefix, function (er, exists) {
+ self._processSimple2(prefix, index, er, exists, cb)
+ })
+}
+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
+
+ //console.error('ps2', prefix, exists)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return cb()
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === '/') {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/')
+
+ // Mark this as a match
+ this._emitMatch(index, prefix)
+ cb()
+}
+
+// Returns either 'DIR', 'FILE', or false
+Glob.prototype._stat = function (f, cb) {
+ var abs = this._makeAbs(f)
+ var needDir = f.slice(-1) === '/'
+
+ if (f.length > this.maxLength)
+ return cb()
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return cb(null, c)
+
+ if (needDir && c === 'FILE')
+ return cb()
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (stat !== undefined) {
+ if (stat === false)
+ return cb(null, stat)
+ else {
+ var type = stat.isDirectory() ? 'DIR' : 'FILE'
+ if (needDir && type === 'FILE')
+ return cb()
+ else
+ return cb(null, type, stat)
+ }
+ }
+
+ var self = this
+ var statcb = inflight('stat\0' + abs, lstatcb_)
+ if (statcb)
+ fs.lstat(abs, statcb)
+
+ function lstatcb_ (er, lstat) {
+ if (lstat && lstat.isSymbolicLink()) {
+ // If it's a symlink, then treat it as the target, unless
+ // the target does not exist, then treat it as a file.
+ return fs.stat(abs, function (er, stat) {
+ if (er)
+ self._stat2(f, abs, null, lstat, cb)
+ else
+ self._stat2(f, abs, er, stat, cb)
+ })
+ } else {
+ self._stat2(f, abs, er, lstat, cb)
+ }
+ }
+}
+
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
+ this.statCache[abs] = false
+ return cb()
+ }
+
+ var needDir = f.slice(-1) === '/'
+ this.statCache[abs] = stat
+
+ if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
+ return cb(null, false, stat)
+
+ var c = true
+ if (stat)
+ c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[abs] = this.cache[abs] || c
+
+ if (needDir && c === 'FILE')
+ return cb()
+
+ return cb(null, c, stat)
+}
diff --git a/node_modules/glob/package.json b/node_modules/glob/package.json
new file mode 100644
index 0000000..361a95a
--- /dev/null
+++ b/node_modules/glob/package.json
@@ -0,0 +1,111 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "glob@~7.1.0",
+ "scope": null,
+ "escapedName": "glob",
+ "name": "glob",
+ "rawSpec": "~7.1.0",
+ "spec": ">=7.1.0 <7.2.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "glob@>=7.1.0 <7.2.0",
+ "_id": "glob@7.1.1",
+ "_inCache": true,
+ "_location": "/glob",
+ "_nodeVersion": "6.5.0",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/glob-7.1.1.tgz_1475876991562_0.924720095237717"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_npmVersion": "3.10.7",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "glob@~7.1.0",
+ "scope": null,
+ "escapedName": "glob",
+ "name": "glob",
+ "rawSpec": "~7.1.0",
+ "spec": ">=7.1.0 <7.2.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "_shasum": "805211df04faaf1c63a3600306cdf5ade50b2ec8",
+ "_shrinkwrap": null,
+ "_spec": "glob@~7.1.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/node-glob/issues"
+ },
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.2",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "description": "a little globber",
+ "devDependencies": {
+ "mkdirp": "0",
+ "rimraf": "^2.2.8",
+ "tap": "^7.1.2",
+ "tick": "0.0.6"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "805211df04faaf1c63a3600306cdf5ade50b2ec8",
+ "tarball": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "files": [
+ "glob.js",
+ "sync.js",
+ "common.js"
+ ],
+ "gitHead": "bc8d43b736a98a9e289fdfceee9266cff35e5742",
+ "homepage": "https://github.com/isaacs/node-glob#readme",
+ "license": "ISC",
+ "main": "glob.js",
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "name": "glob",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/node-glob.git"
+ },
+ "scripts": {
+ "bench": "bash benchmark.sh",
+ "benchclean": "node benchclean.js",
+ "prepublish": "npm run benchclean",
+ "prof": "bash prof.sh && cat profile.txt",
+ "profclean": "rm -f v8.log profile.txt",
+ "test": "tap test/*.js --cov",
+ "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js"
+ },
+ "version": "7.1.1"
+}
diff --git a/node_modules/glob/sync.js b/node_modules/glob/sync.js
new file mode 100644
index 0000000..c952134
--- /dev/null
+++ b/node_modules/glob/sync.js
@@ -0,0 +1,486 @@
+module.exports = globSync
+globSync.GlobSync = GlobSync
+
+var fs = require('fs')
+var rp = require('fs.realpath')
+var minimatch = require('minimatch')
+var Minimatch = minimatch.Minimatch
+var Glob = require('./glob.js').Glob
+var util = require('util')
+var path = require('path')
+var assert = require('assert')
+var isAbsolute = require('path-is-absolute')
+var common = require('./common.js')
+var alphasort = common.alphasort
+var alphasorti = common.alphasorti
+var setopts = common.setopts
+var ownProp = common.ownProp
+var childrenIgnored = common.childrenIgnored
+var isIgnored = common.isIgnored
+
+function globSync (pattern, options) {
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ return new GlobSync(pattern, options).found
+}
+
+function GlobSync (pattern, options) {
+ if (!pattern)
+ throw new Error('must provide pattern')
+
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ if (!(this instanceof GlobSync))
+ return new GlobSync(pattern, options)
+
+ setopts(this, pattern, options)
+
+ if (this.noprocess)
+ return this
+
+ var n = this.minimatch.set.length
+ this.matches = new Array(n)
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false)
+ }
+ this._finish()
+}
+
+GlobSync.prototype._finish = function () {
+ assert(this instanceof GlobSync)
+ if (this.realpath) {
+ var self = this
+ this.matches.forEach(function (matchset, index) {
+ var set = self.matches[index] = Object.create(null)
+ for (var p in matchset) {
+ try {
+ p = self._makeAbs(p)
+ var real = rp.realpathSync(p, self.realpathCache)
+ set[real] = true
+ } catch (er) {
+ if (er.syscall === 'stat')
+ set[self._makeAbs(p)] = true
+ else
+ throw er
+ }
+ }
+ })
+ }
+ common.finish(this)
+}
+
+
+GlobSync.prototype._process = function (pattern, index, inGlobStar) {
+ assert(this instanceof GlobSync)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0
+ while (typeof pattern[n] === 'string') {
+ n ++
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // See if there's anything else
+ var prefix
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index)
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/')
+ break
+ }
+
+ var remain = pattern.slice(n)
+
+ // get the list of entries.
+ var read
+ if (prefix === null)
+ read = '.'
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix
+ read = prefix
+ } else
+ read = prefix
+
+ var abs = this._makeAbs(read)
+
+ //if ignored, skip processing
+ if (childrenIgnored(this, read))
+ return
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
+}
+
+
+GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
+ var entries = this._readdir(abs, inGlobStar)
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === '.'
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
+ }
+ }
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix.slice(-1) !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this._emitMatch(index, e)
+ }
+ // This was the last one, and no stats were needed
+ return
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix)
+ newPattern = [prefix, e]
+ else
+ newPattern = [e]
+ this._process(newPattern.concat(remain), index, inGlobStar)
+ }
+}
+
+
+GlobSync.prototype._emitMatch = function (index, e) {
+ if (isIgnored(this, e))
+ return
+
+ var abs = this._makeAbs(e)
+
+ if (this.mark)
+ e = this._mark(e)
+
+ if (this.absolute) {
+ e = abs
+ }
+
+ if (this.matches[index][e])
+ return
+
+ if (this.nodir) {
+ var c = this.cache[abs]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ this.matches[index][e] = true
+
+ if (this.stat)
+ this._stat(e)
+}
+
+
+GlobSync.prototype._readdirInGlobStar = function (abs) {
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false)
+
+ var entries
+ var lstat
+ var stat
+ try {
+ lstat = fs.lstatSync(abs)
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ // lstat failed, doesn't exist
+ return null
+ }
+ }
+
+ var isSym = lstat && lstat.isSymbolicLink()
+ this.symlinks[abs] = isSym
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && lstat && !lstat.isDirectory())
+ this.cache[abs] = 'FILE'
+ else
+ entries = this._readdir(abs, false)
+
+ return entries
+}
+
+GlobSync.prototype._readdir = function (abs, inGlobStar) {
+ var entries
+
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return null
+
+ if (Array.isArray(c))
+ return c
+ }
+
+ try {
+ return this._readdirEntries(abs, fs.readdirSync(abs))
+ } catch (er) {
+ this._readdirError(abs, er)
+ return null
+ }
+}
+
+GlobSync.prototype._readdirEntries = function (abs, entries) {
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === '/')
+ e = abs + e
+ else
+ e = abs + '/' + e
+ this.cache[e] = true
+ }
+ }
+
+ this.cache[abs] = entries
+
+ // mark and cache dir-ness
+ return entries
+}
+
+GlobSync.prototype._readdirError = function (f, er) {
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ var abs = this._makeAbs(f)
+ this.cache[abs] = 'FILE'
+ if (abs === this.cwdAbs) {
+ var error = new Error(er.code + ' invalid cwd ' + this.cwd)
+ error.path = this.cwd
+ error.code = er.code
+ throw error
+ }
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false
+ if (this.strict)
+ throw er
+ if (!this.silent)
+ console.error('glob error', er)
+ break
+ }
+}
+
+GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
+
+ var entries = this._readdir(abs, inGlobStar)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false)
+
+ var len = entries.length
+ var isSym = this.symlinks[abs]
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true)
+ }
+}
+
+GlobSync.prototype._processSimple = function (prefix, index) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var exists = this._stat(prefix)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === '/') {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/')
+
+ // Mark this as a match
+ this._emitMatch(index, prefix)
+}
+
+// Returns either 'DIR', 'FILE', or false
+GlobSync.prototype._stat = function (f) {
+ var abs = this._makeAbs(f)
+ var needDir = f.slice(-1) === '/'
+
+ if (f.length > this.maxLength)
+ return false
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return c
+
+ if (needDir && c === 'FILE')
+ return false
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (!stat) {
+ var lstat
+ try {
+ lstat = fs.lstatSync(abs)
+ } catch (er) {
+ if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
+ this.statCache[abs] = false
+ return false
+ }
+ }
+
+ if (lstat && lstat.isSymbolicLink()) {
+ try {
+ stat = fs.statSync(abs)
+ } catch (er) {
+ stat = lstat
+ }
+ } else {
+ stat = lstat
+ }
+ }
+
+ this.statCache[abs] = stat
+
+ var c = true
+ if (stat)
+ c = stat.isDirectory() ? 'DIR' : 'FILE'
+
+ this.cache[abs] = this.cache[abs] || c
+
+ if (needDir && c === 'FILE')
+ return false
+
+ return c
+}
+
+GlobSync.prototype._mark = function (p) {
+ return common.mark(this, p)
+}
+
+GlobSync.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
+}
diff --git a/node_modules/has/.jshintrc b/node_modules/has/.jshintrc
new file mode 100644
index 0000000..6a61a73
--- /dev/null
+++ b/node_modules/has/.jshintrc
@@ -0,0 +1,14 @@
+{
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "sub": true,
+ "undef": true,
+ "boss": true,
+ "eqnull": true,
+ "node": true,
+ "browser": true
+}
\ No newline at end of file
diff --git a/node_modules/has/.npmignore b/node_modules/has/.npmignore
new file mode 100644
index 0000000..8419859
--- /dev/null
+++ b/node_modules/has/.npmignore
@@ -0,0 +1,3 @@
+/node_modules/
+*.log
+*~
diff --git a/node_modules/has/LICENSE-MIT b/node_modules/has/LICENSE-MIT
new file mode 100644
index 0000000..ae7014d
--- /dev/null
+++ b/node_modules/has/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Thiago de Arruda
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/has/README.mkd b/node_modules/has/README.mkd
new file mode 100644
index 0000000..635e3a4
--- /dev/null
+++ b/node_modules/has/README.mkd
@@ -0,0 +1,18 @@
+# has
+
+> Object.prototype.hasOwnProperty.call shortcut
+
+## Installation
+
+```sh
+npm install --save has
+```
+
+## Usage
+
+```js
+var has = require('has');
+
+has({}, 'hasOwnProperty'); // false
+has(Object.prototype, 'hasOwnProperty'); // true
+```
diff --git a/node_modules/has/package.json b/node_modules/has/package.json
new file mode 100644
index 0000000..ce73193
--- /dev/null
+++ b/node_modules/has/package.json
@@ -0,0 +1,93 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "has@~1.0.1",
+ "scope": null,
+ "escapedName": "has",
+ "name": "has",
+ "rawSpec": "~1.0.1",
+ "spec": ">=1.0.1 <1.1.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "has@>=1.0.1 <1.1.0",
+ "_id": "has@1.0.1",
+ "_inCache": true,
+ "_location": "/has",
+ "_nodeVersion": "2.2.1",
+ "_npmUser": {
+ "name": "tarruda",
+ "email": "tpadilha84@gmail.com"
+ },
+ "_npmVersion": "2.11.0",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "has@~1.0.1",
+ "scope": null,
+ "escapedName": "has",
+ "name": "has",
+ "rawSpec": "~1.0.1",
+ "spec": ">=1.0.1 <1.1.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "_shasum": "8461733f538b0837c9361e39a9ab9e9704dc2f28",
+ "_shrinkwrap": null,
+ "_spec": "has@~1.0.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "Thiago de Arruda",
+ "email": "tpadilha84@gmail.com"
+ },
+ "bugs": {
+ "url": "https://github.com/tarruda/has/issues"
+ },
+ "dependencies": {
+ "function-bind": "^1.0.2"
+ },
+ "description": "Object.prototype.hasOwnProperty.call shortcut",
+ "devDependencies": {
+ "chai": "~1.7.2",
+ "mocha": "^1.21.4"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "8461733f538b0837c9361e39a9ab9e9704dc2f28",
+ "tarball": "https://registry.npmjs.org/has/-/has-1.0.1.tgz"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "gitHead": "535c5c8ed1dc255c9e223829e702548dd514d2a5",
+ "homepage": "https://github.com/tarruda/has",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "https://github.com/tarruda/has/blob/master/LICENSE-MIT"
+ }
+ ],
+ "main": "./src/index",
+ "maintainers": [
+ {
+ "name": "tarruda",
+ "email": "tpadilha84@gmail.com"
+ }
+ ],
+ "name": "has",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/tarruda/has.git"
+ },
+ "scripts": {
+ "test": "node_modules/mocha/bin/mocha"
+ },
+ "version": "1.0.1"
+}
diff --git a/node_modules/has/src/index.js b/node_modules/has/src/index.js
new file mode 100644
index 0000000..cdf3285
--- /dev/null
+++ b/node_modules/has/src/index.js
@@ -0,0 +1,3 @@
+var bind = require('function-bind');
+
+module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
diff --git a/node_modules/has/test/.jshintrc b/node_modules/has/test/.jshintrc
new file mode 100644
index 0000000..e1da2e4
--- /dev/null
+++ b/node_modules/has/test/.jshintrc
@@ -0,0 +1,7 @@
+{
+ "globals": {
+ "expect": false,
+ "run": false
+ },
+ "expr": true
+}
\ No newline at end of file
diff --git a/node_modules/has/test/index.js b/node_modules/has/test/index.js
new file mode 100644
index 0000000..38909b0
--- /dev/null
+++ b/node_modules/has/test/index.js
@@ -0,0 +1,10 @@
+global.expect = require('chai').expect;
+var has = require('../src');
+
+
+describe('has', function() {
+ it('works!', function() {
+ expect(has({}, 'hasOwnProperty')).to.be.false;
+ expect(has(Object.prototype, 'hasOwnProperty')).to.be.true;
+ });
+});
diff --git a/node_modules/inflight/LICENSE b/node_modules/inflight/LICENSE
new file mode 100644
index 0000000..05eeeb8
--- /dev/null
+++ b/node_modules/inflight/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/inflight/README.md b/node_modules/inflight/README.md
new file mode 100644
index 0000000..6dc8929
--- /dev/null
+++ b/node_modules/inflight/README.md
@@ -0,0 +1,37 @@
+# inflight
+
+Add callbacks to requests in flight to avoid async duplication
+
+## USAGE
+
+```javascript
+var inflight = require('inflight')
+
+// some request that does some stuff
+function req(key, callback) {
+ // key is any random string. like a url or filename or whatever.
+ //
+ // will return either a falsey value, indicating that the
+ // request for this key is already in flight, or a new callback
+ // which when called will call all callbacks passed to inflightk
+ // with the same key
+ callback = inflight(key, callback)
+
+ // If we got a falsey value back, then there's already a req going
+ if (!callback) return
+
+ // this is where you'd fetch the url or whatever
+ // callback is also once()-ified, so it can safely be assigned
+ // to multiple events etc. First call wins.
+ setTimeout(function() {
+ callback(null, key)
+ }, 100)
+}
+
+// only assigns a single setTimeout
+// when it dings, all cbs get called
+req('foo', cb1)
+req('foo', cb2)
+req('foo', cb3)
+req('foo', cb4)
+```
diff --git a/node_modules/inflight/inflight.js b/node_modules/inflight/inflight.js
new file mode 100644
index 0000000..48202b3
--- /dev/null
+++ b/node_modules/inflight/inflight.js
@@ -0,0 +1,54 @@
+var wrappy = require('wrappy')
+var reqs = Object.create(null)
+var once = require('once')
+
+module.exports = wrappy(inflight)
+
+function inflight (key, cb) {
+ if (reqs[key]) {
+ reqs[key].push(cb)
+ return null
+ } else {
+ reqs[key] = [cb]
+ return makeres(key)
+ }
+}
+
+function makeres (key) {
+ return once(function RES () {
+ var cbs = reqs[key]
+ var len = cbs.length
+ var args = slice(arguments)
+
+ // XXX It's somewhat ambiguous whether a new callback added in this
+ // pass should be queued for later execution if something in the
+ // list of callbacks throws, or if it should just be discarded.
+ // However, it's such an edge case that it hardly matters, and either
+ // choice is likely as surprising as the other.
+ // As it happens, we do go ahead and schedule it for later execution.
+ try {
+ for (var i = 0; i < len; i++) {
+ cbs[i].apply(null, args)
+ }
+ } finally {
+ if (cbs.length > len) {
+ // added more in the interim.
+ // de-zalgo, just in case, but don't call again.
+ cbs.splice(0, len)
+ process.nextTick(function () {
+ RES.apply(null, args)
+ })
+ } else {
+ delete reqs[key]
+ }
+ }
+ })
+}
+
+function slice (args) {
+ var length = args.length
+ var array = []
+
+ for (var i = 0; i < length; i++) array[i] = args[i]
+ return array
+}
diff --git a/node_modules/inflight/package.json b/node_modules/inflight/package.json
new file mode 100644
index 0000000..04ddfa6
--- /dev/null
+++ b/node_modules/inflight/package.json
@@ -0,0 +1,105 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "inflight@^1.0.4",
+ "scope": null,
+ "escapedName": "inflight",
+ "name": "inflight",
+ "rawSpec": "^1.0.4",
+ "spec": ">=1.0.4 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob"
+ ]
+ ],
+ "_from": "inflight@>=1.0.4 <2.0.0",
+ "_id": "inflight@1.0.6",
+ "_inCache": true,
+ "_location": "/inflight",
+ "_nodeVersion": "6.5.0",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/inflight-1.0.6.tgz_1476330807696_0.10388551792129874"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_npmVersion": "3.10.7",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "inflight@^1.0.4",
+ "scope": null,
+ "escapedName": "inflight",
+ "name": "inflight",
+ "rawSpec": "^1.0.4",
+ "spec": ">=1.0.4 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "_shasum": "49bd6331d7d02d0c09bc910a1075ba8165b56df9",
+ "_shrinkwrap": null,
+ "_spec": "inflight@^1.0.4",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/inflight/issues"
+ },
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ },
+ "description": "Add callbacks to requests in flight to avoid async duplication",
+ "devDependencies": {
+ "tap": "^7.1.2"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "49bd6331d7d02d0c09bc910a1075ba8165b56df9",
+ "tarball": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ },
+ "files": [
+ "inflight.js"
+ ],
+ "gitHead": "a547881738c8f57b27795e584071d67cf6ac1a57",
+ "homepage": "https://github.com/isaacs/inflight",
+ "license": "ISC",
+ "main": "inflight.js",
+ "maintainers": [
+ {
+ "name": "iarna",
+ "email": "me@re-becca.org"
+ },
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ {
+ "name": "othiym23",
+ "email": "ogd@aoaioxxysz.net"
+ },
+ {
+ "name": "zkat",
+ "email": "kat@sykosomatic.org"
+ }
+ ],
+ "name": "inflight",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/inflight.git"
+ },
+ "scripts": {
+ "test": "tap test.js --100"
+ },
+ "version": "1.0.6"
+}
diff --git a/node_modules/inherits/LICENSE b/node_modules/inherits/LICENSE
new file mode 100644
index 0000000..dea3013
--- /dev/null
+++ b/node_modules/inherits/LICENSE
@@ -0,0 +1,16 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/node_modules/inherits/README.md b/node_modules/inherits/README.md
new file mode 100644
index 0000000..b1c5665
--- /dev/null
+++ b/node_modules/inherits/README.md
@@ -0,0 +1,42 @@
+Browser-friendly inheritance fully compatible with standard node.js
+[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
+
+This package exports standard `inherits` from node.js `util` module in
+node environment, but also provides alternative browser-friendly
+implementation through [browser
+field](https://gist.github.com/shtylman/4339901). Alternative
+implementation is a literal copy of standard one located in standalone
+module to avoid requiring of `util`. It also has a shim for old
+browsers with no `Object.create` support.
+
+While keeping you sure you are using standard `inherits`
+implementation in node.js environment, it allows bundlers such as
+[browserify](https://github.com/substack/node-browserify) to not
+include full `util` package to your client code if all you need is
+just `inherits` function. It worth, because browser shim for `util`
+package is large and `inherits` is often the single function you need
+from it.
+
+It's recommended to use this package instead of
+`require('util').inherits` for any code that has chances to be used
+not only in node.js but in browser too.
+
+## usage
+
+```js
+var inherits = require('inherits');
+// then use exactly as the standard one
+```
+
+## note on version ~1.0
+
+Version ~1.0 had completely different motivation and is not compatible
+neither with 2.0 nor with standard node.js `inherits`.
+
+If you are using version ~1.0 and planning to switch to ~2.0, be
+careful:
+
+* new version uses `super_` instead of `super` for referencing
+ superclass
+* new version overwrites current prototype while old one preserves any
+ existing fields on it
diff --git a/node_modules/inherits/inherits.js b/node_modules/inherits/inherits.js
new file mode 100644
index 0000000..3b94763
--- /dev/null
+++ b/node_modules/inherits/inherits.js
@@ -0,0 +1,7 @@
+try {
+ var util = require('util');
+ if (typeof util.inherits !== 'function') throw '';
+ module.exports = util.inherits;
+} catch (e) {
+ module.exports = require('./inherits_browser.js');
+}
diff --git a/node_modules/inherits/inherits_browser.js b/node_modules/inherits/inherits_browser.js
new file mode 100644
index 0000000..c1e78a7
--- /dev/null
+++ b/node_modules/inherits/inherits_browser.js
@@ -0,0 +1,23 @@
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
diff --git a/node_modules/inherits/package.json b/node_modules/inherits/package.json
new file mode 100644
index 0000000..300f5c0
--- /dev/null
+++ b/node_modules/inherits/package.json
@@ -0,0 +1,98 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "inherits@~2.0.3",
+ "scope": null,
+ "escapedName": "inherits",
+ "name": "inherits",
+ "rawSpec": "~2.0.3",
+ "spec": ">=2.0.3 <2.1.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "inherits@>=2.0.3 <2.1.0",
+ "_id": "inherits@2.0.3",
+ "_inCache": true,
+ "_location": "/inherits",
+ "_nodeVersion": "6.5.0",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/inherits-2.0.3.tgz_1473295776489_0.08142363070510328"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_npmVersion": "3.10.7",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "inherits@~2.0.3",
+ "scope": null,
+ "escapedName": "inherits",
+ "name": "inherits",
+ "rawSpec": "~2.0.3",
+ "spec": ">=2.0.3 <2.1.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/glob",
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "_shasum": "633c2c83e3da42a502f52466022480f4208261de",
+ "_shrinkwrap": null,
+ "_spec": "inherits@~2.0.3",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "browser": "./inherits_browser.js",
+ "bugs": {
+ "url": "https://github.com/isaacs/inherits/issues"
+ },
+ "dependencies": {},
+ "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
+ "devDependencies": {
+ "tap": "^7.1.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "633c2c83e3da42a502f52466022480f4208261de",
+ "tarball": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+ },
+ "files": [
+ "inherits.js",
+ "inherits_browser.js"
+ ],
+ "gitHead": "e05d0fb27c61a3ec687214f0476386b765364d5f",
+ "homepage": "https://github.com/isaacs/inherits#readme",
+ "keywords": [
+ "inheritance",
+ "class",
+ "klass",
+ "oop",
+ "object-oriented",
+ "inherits",
+ "browser",
+ "browserify"
+ ],
+ "license": "ISC",
+ "main": "./inherits.js",
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "name": "inherits",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/inherits.git"
+ },
+ "scripts": {
+ "test": "node test"
+ },
+ "version": "2.0.3"
+}
diff --git a/node_modules/is-callable/.eslintrc b/node_modules/is-callable/.eslintrc
new file mode 100644
index 0000000..29ddad8
--- /dev/null
+++ b/node_modules/is-callable/.eslintrc
@@ -0,0 +1,5 @@
+{
+ "root": true,
+
+ "extends": "@ljharb"
+}
diff --git a/node_modules/is-callable/.jscs.json b/node_modules/is-callable/.jscs.json
new file mode 100644
index 0000000..59bfb01
--- /dev/null
+++ b/node_modules/is-callable/.jscs.json
@@ -0,0 +1,163 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 1
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": "asc-insensitive",
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false,
+
+ "requireCapitalizedConstructorsNew": {
+ "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
+ },
+
+ "requireImportAlphabetized": false,
+
+ "disallowSpacesInsideTemplateStringPlaceholders": true
+}
+
diff --git a/node_modules/is-callable/.npmignore b/node_modules/is-callable/.npmignore
new file mode 100644
index 0000000..59d842b
--- /dev/null
+++ b/node_modules/is-callable/.npmignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# Commenting this out is preferred by some people, see
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
+node_modules
+
+# Users Environment Variables
+.lock-wscript
diff --git a/node_modules/is-callable/.travis.yml b/node_modules/is-callable/.travis.yml
new file mode 100644
index 0000000..6bd399c
--- /dev/null
+++ b/node_modules/is-callable/.travis.yml
@@ -0,0 +1,79 @@
+language: node_js
+node_js:
+ - "5.7"
+ - "5.6"
+ - "5.5"
+ - "5.4"
+ - "5.3"
+ - "5.2"
+ - "5.1"
+ - "5.0"
+ - "4.3"
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+script:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "4.3" ]; then npm run tests-only ; else npm test ; fi'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "5.6"
+ - node_js: "5.5"
+ - node_js: "5.4"
+ - node_js: "5.3"
+ - node_js: "5.2"
+ - node_js: "5.1"
+ - node_js: "5.0"
+ - node_js: "4.2"
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/is-callable/CHANGELOG.md b/node_modules/is-callable/CHANGELOG.md
new file mode 100644
index 0000000..de230a6
--- /dev/null
+++ b/node_modules/is-callable/CHANGELOG.md
@@ -0,0 +1,50 @@
+1.1.3 / 2016-02-27
+=================
+ * [Fix] ensure “class “ doesn’t screw up “class” detection
+ * [Tests] up to `node` `v5.7`, `v4.3`
+ * [Dev Deps] update to `eslint` v2, `@ljharb/eslint-config`, `jscs`
+
+1.1.2 / 2016-01-15
+=================
+ * [Fix] Make sure comments don’t screw up “class” detection (#4)
+ * [Tests] up to `node` `v5.3`
+ * [Tests] Add `parallelshell`, run both `--es-staging` and stock tests at once
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
+ * [Refactor] convert `isNonES6ClassFn` into `isES6ClassFn`
+
+1.1.1 / 2015-11-30
+=================
+ * [Fix] do not throw when a non-function has a function in its [[Prototype]] (#2)
+ * [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `jscs`, `nsp`, `semver`
+ * [Tests] up to `node` `v5.1`
+ * [Tests] no longer allow node 0.8 to fail.
+ * [Tests] fix npm upgrades in older nodes
+
+1.1.0 / 2015-10-02
+=================
+ * [Fix] Some browsers report TypedArray constructors as `typeof object`
+ * [New] return false for "class" constructors, when possible.
+ * [Tests] up to `io.js` `v3.3`, `node` `v4.1`
+ * [Dev Deps] update `eslint`, `editorconfig-tools`, `nsp`, `tape`, `semver`, `jscs`, `covert`, `make-arrow-function`
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+
+1.0.4 / 2015-01-30
+=================
+ * If @@toStringTag is not present, use the old-school Object#toString test.
+
+1.0.3 / 2015-01-29
+=================
+ * Add tests to ensure arrow functions are callable.
+ * Refactor to aid optimization of non-try/catch code.
+
+1.0.2 / 2015-01-29
+=================
+ * Fix broken package.json
+
+1.0.1 / 2015-01-29
+=================
+ * Add early exit for typeof not "function"
+
+1.0.0 / 2015-01-29
+=================
+ * Initial release.
diff --git a/node_modules/is-callable/LICENSE b/node_modules/is-callable/LICENSE
new file mode 100644
index 0000000..b43df44
--- /dev/null
+++ b/node_modules/is-callable/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/is-callable/Makefile b/node_modules/is-callable/Makefile
new file mode 100644
index 0000000..b9e4fe1
--- /dev/null
+++ b/node_modules/is-callable/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/is-callable/README.md b/node_modules/is-callable/README.md
new file mode 100644
index 0000000..0cb6587
--- /dev/null
+++ b/node_modules/is-callable/README.md
@@ -0,0 +1,59 @@
+# is-callable [![Version Badge][2]][1]
+
+[![Build Status][3]][4]
+[![dependency status][5]][6]
+[![dev dependency status][7]][8]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][11]][1]
+
+[![browser support][9]][10]
+
+Is this JS value callable? Works with Functions and GeneratorFunctions, despite ES6 @@toStringTag.
+
+## Example
+
+```js
+var isCallable = require('is-callable');
+var assert = require('assert');
+
+assert.notOk(isCallable(undefined));
+assert.notOk(isCallable(null));
+assert.notOk(isCallable(false));
+assert.notOk(isCallable(true));
+assert.notOk(isCallable([]));
+assert.notOk(isCallable({}));
+assert.notOk(isCallable(/a/g));
+assert.notOk(isCallable(new RegExp('a', 'g')));
+assert.notOk(isCallable(new Date()));
+assert.notOk(isCallable(42));
+assert.notOk(isCallable(NaN));
+assert.notOk(isCallable(Infinity));
+assert.notOk(isCallable(new Number(42)));
+assert.notOk(isCallable('foo'));
+assert.notOk(isCallable(Object('foo')));
+
+assert.ok(isCallable(function () {}));
+assert.ok(isCallable(function* () {}));
+assert.ok(isCallable(x => x * x));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[1]: https://npmjs.org/package/is-callable
+[2]: http://versionbadg.es/ljharb/is-callable.svg
+[3]: https://travis-ci.org/ljharb/is-callable.svg
+[4]: https://travis-ci.org/ljharb/is-callable
+[5]: https://david-dm.org/ljharb/is-callable.svg
+[6]: https://david-dm.org/ljharb/is-callable
+[7]: https://david-dm.org/ljharb/is-callable/dev-status.svg
+[8]: https://david-dm.org/ljharb/is-callable#info=devDependencies
+[9]: https://ci.testling.com/ljharb/is-callable.png
+[10]: https://ci.testling.com/ljharb/is-callable
+[11]: https://nodei.co/npm/is-callable.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/is-callable.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/is-callable.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=is-callable
diff --git a/node_modules/is-callable/index.js b/node_modules/is-callable/index.js
new file mode 100644
index 0000000..9e70b79
--- /dev/null
+++ b/node_modules/is-callable/index.js
@@ -0,0 +1,39 @@
+'use strict';
+
+var fnToStr = Function.prototype.toString;
+
+var constructorRegex = /^\s*class /;
+var isES6ClassFn = function isES6ClassFn(value) {
+ try {
+ var fnStr = fnToStr.call(value);
+ var singleStripped = fnStr.replace(/\/\/.*\n/g, '');
+ var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, '');
+ var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' ');
+ return constructorRegex.test(spaceStripped);
+ } catch (e) {
+ return false; // not a function
+ }
+};
+
+var tryFunctionObject = function tryFunctionObject(value) {
+ try {
+ if (isES6ClassFn(value)) { return false; }
+ fnToStr.call(value);
+ return true;
+ } catch (e) {
+ return false;
+ }
+};
+var toStr = Object.prototype.toString;
+var fnClass = '[object Function]';
+var genClass = '[object GeneratorFunction]';
+var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
+
+module.exports = function isCallable(value) {
+ if (!value) { return false; }
+ if (typeof value !== 'function' && typeof value !== 'object') { return false; }
+ if (hasToStringTag) { return tryFunctionObject(value); }
+ if (isES6ClassFn(value)) { return false; }
+ var strClass = toStr.call(value);
+ return strClass === fnClass || strClass === genClass;
+};
diff --git a/node_modules/is-callable/package.json b/node_modules/is-callable/package.json
new file mode 100644
index 0000000..abd0e92
--- /dev/null
+++ b/node_modules/is-callable/package.json
@@ -0,0 +1,149 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "is-callable@^1.1.3",
+ "scope": null,
+ "escapedName": "is-callable",
+ "name": "is-callable",
+ "rawSpec": "^1.1.3",
+ "spec": ">=1.1.3 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-abstract"
+ ]
+ ],
+ "_from": "is-callable@>=1.1.3 <2.0.0",
+ "_id": "is-callable@1.1.3",
+ "_inCache": true,
+ "_location": "/is-callable",
+ "_nodeVersion": "5.7.0",
+ "_npmOperationalInternal": {
+ "host": "packages-6-west.internal.npmjs.com",
+ "tmp": "tmp/is-callable-1.1.3.tgz_1456622777980_0.3157460247166455"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.6.0",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "is-callable@^1.1.3",
+ "scope": null,
+ "escapedName": "is-callable",
+ "name": "is-callable",
+ "rawSpec": "^1.1.3",
+ "spec": ">=1.1.3 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/es-abstract",
+ "/es-to-primitive"
+ ],
+ "_resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
+ "_shasum": "86eb75392805ddc33af71c92a0eedf74ee7604b2",
+ "_shrinkwrap": null,
+ "_spec": "is-callable@^1.1.3",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-abstract",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/is-callable/issues"
+ },
+ "contributors": [
+ {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ }
+ ],
+ "dependencies": {},
+ "description": "Is this JS value callable? Works with Functions and GeneratorFunctions, despite ES6 @@toStringTag.",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^2.1.1",
+ "covert": "^1.1.0",
+ "editorconfig-tools": "^0.1.1",
+ "eslint": "^2.2.0",
+ "foreach": "^2.0.5",
+ "jscs": "^2.10.1",
+ "make-arrow-function": "^1.1.0",
+ "make-generator-function": "^1.1.0",
+ "nsp": "^2.2.0",
+ "parallelshell": "^2.0.0",
+ "semver": "^5.1.0",
+ "tape": "^4.4.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "86eb75392805ddc33af71c92a0eedf74ee7604b2",
+ "tarball": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "24d113fb908482c43ef4f6a5a27614314e7bb0df",
+ "homepage": "https://github.com/ljharb/is-callable#readme",
+ "keywords": [
+ "Function",
+ "function",
+ "callable",
+ "generator",
+ "generator function",
+ "arrow",
+ "arrow function",
+ "ES6",
+ "toStringTag",
+ "@@toStringTag"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "is-callable",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/is-callable.git"
+ },
+ "scripts": {
+ "coverage": "covert test.js",
+ "coverage-quiet": "covert test.js --quiet",
+ "eccheck": "editorconfig-tools check *.js **/*.js > /dev/null",
+ "eslint": "eslint *.js",
+ "jscs": "jscs *.js",
+ "lint": "npm run jscs && npm run eslint",
+ "security": "nsp check",
+ "test": "npm run lint && npm run tests-only && npm run security",
+ "test:staging": "node --es-staging test.js",
+ "test:stock": "node test.js",
+ "tests-only": "parallelshell 'npm run test:stock' 'npm run test:staging'"
+ },
+ "testling": {
+ "files": "test.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.1.3"
+}
diff --git a/node_modules/is-callable/test.js b/node_modules/is-callable/test.js
new file mode 100644
index 0000000..2176387
--- /dev/null
+++ b/node_modules/is-callable/test.js
@@ -0,0 +1,121 @@
+'use strict';
+
+/* eslint no-magic-numbers: 1 */
+
+var test = require('tape');
+var isCallable = require('./');
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
+var genFn = require('make-generator-function');
+var arrowFn = require('make-arrow-function')();
+var forEach = require('foreach');
+
+var invokeFunction = function invokeFunction(str) {
+ var result;
+ try {
+ /* eslint-disable no-new-func */
+ var fn = Function(str);
+ /* eslint-enable no-new-func */
+ result = fn();
+ } catch (e) { /**/ }
+ return result;
+};
+
+var classConstructor = invokeFunction('"use strict"; return class Foo {}');
+
+var commentedClass = invokeFunction('"use strict"; return class/*kkk*/\n\/\/blah\n Bar\n\/\/blah\n {}');
+
+test('not callables', function (t) {
+ t.test('non-number/string primitives', function (st) {
+ st.notOk(isCallable(), 'undefined is not callable');
+ st.notOk(isCallable(null), 'null is not callable');
+ st.notOk(isCallable(false), 'false is not callable');
+ st.notOk(isCallable(true), 'true is not callable');
+ st.end();
+ });
+
+ t.notOk(isCallable([]), 'array is not callable');
+ t.notOk(isCallable({}), 'object is not callable');
+ t.notOk(isCallable(/a/g), 'regex literal is not callable');
+ t.notOk(isCallable(new RegExp('a', 'g')), 'regex object is not callable');
+ t.notOk(isCallable(new Date()), 'new Date() is not callable');
+
+ t.test('numbers', function (st) {
+ st.notOk(isCallable(42), 'number is not callable');
+ st.notOk(isCallable(Object(42)), 'number object is not callable');
+ st.notOk(isCallable(NaN), 'NaN is not callable');
+ st.notOk(isCallable(Infinity), 'Infinity is not callable');
+ st.end();
+ });
+
+ t.test('strings', function (st) {
+ st.notOk(isCallable('foo'), 'string primitive is not callable');
+ st.notOk(isCallable(Object('foo')), 'string object is not callable');
+ st.end();
+ });
+
+ t.test('non-function with function in its [[Prototype]] chain', function (st) {
+ var Foo = function Bar() {};
+ Foo.prototype = function () {};
+ st.equal(true, isCallable(Foo), 'sanity check: Foo is callable');
+ st.equal(false, isCallable(new Foo()), 'instance of Foo is not callable');
+ st.end();
+ });
+
+ t.end();
+});
+
+test('@@toStringTag', { skip: !hasSymbols || !Symbol.toStringTag }, function (t) {
+ var fn = function () { return 3; };
+ var fakeFunction = {
+ toString: function () { return String(fn); },
+ valueOf: function () { return fn; }
+ };
+ fakeFunction[Symbol.toStringTag] = 'Function';
+ t.notOk(isCallable(fakeFunction), 'fake Function with @@toStringTag "Function" is not callable');
+ t.end();
+});
+
+var typedArrayNames = [
+ 'Int8Array',
+ 'Uint8Array',
+ 'Uint8ClampedArray',
+ 'Int16Array',
+ 'Uint16Array',
+ 'Int32Array',
+ 'Uint32Array',
+ 'Float32Array',
+ 'Float64Array'
+];
+
+test('Functions', function (t) {
+ t.ok(isCallable(function () {}), 'function is callable');
+ t.ok(isCallable(function classFake() { }), 'function with name containing "class" is callable');
+ t.ok(isCallable(function () { return ' class '; }), 'function with string " class " is callable');
+ t.ok(isCallable(isCallable), 'isCallable is callable');
+ t.end();
+});
+
+test('Typed Arrays', function (st) {
+ forEach(typedArrayNames, function (typedArray) {
+ if (typeof global[typedArray] !== 'undefined') {
+ st.ok(isCallable(global[typedArray]), typedArray + ' is callable');
+ }
+ });
+ st.end();
+});
+
+test('Generators', { skip: !genFn }, function (t) {
+ t.ok(isCallable(genFn), 'generator function is callable');
+ t.end();
+});
+
+test('Arrow functions', { skip: !arrowFn }, function (t) {
+ t.ok(isCallable(arrowFn), 'arrow function is callable');
+ t.end();
+});
+
+test('"Class" constructors', { skip: !classConstructor || !commentedClass }, function (t) {
+ t.notOk(isCallable(classConstructor), 'class constructors are not callable');
+ t.notOk(isCallable(commentedClass), 'class constructors with comments in the signature are not callable');
+ t.end();
+});
diff --git a/node_modules/is-date-object/.eslintrc b/node_modules/is-date-object/.eslintrc
new file mode 100644
index 0000000..1228f97
--- /dev/null
+++ b/node_modules/is-date-object/.eslintrc
@@ -0,0 +1,9 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "max-statements": [2, 12]
+ }
+}
diff --git a/node_modules/is-date-object/.jscs.json b/node_modules/is-date-object/.jscs.json
new file mode 100644
index 0000000..040bb68
--- /dev/null
+++ b/node_modules/is-date-object/.jscs.json
@@ -0,0 +1,122 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": true,
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 1
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "validateOrderInObjectKeys": "asc-insensitive"
+}
+
diff --git a/node_modules/is-date-object/.npmignore b/node_modules/is-date-object/.npmignore
new file mode 100644
index 0000000..59d842b
--- /dev/null
+++ b/node_modules/is-date-object/.npmignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# Commenting this out is preferred by some people, see
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
+node_modules
+
+# Users Environment Variables
+.lock-wscript
diff --git a/node_modules/is-date-object/.travis.yml b/node_modules/is-date-object/.travis.yml
new file mode 100644
index 0000000..4c29ed5
--- /dev/null
+++ b/node_modules/is-date-object/.travis.yml
@@ -0,0 +1,58 @@
+language: node_js
+node_js:
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - '[ "${TRAVIS_NODE_VERSION}" = "0.6" ] || npm install -g npm@1.4.28 && npm install -g npm'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.8"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/is-date-object/CHANGELOG.md b/node_modules/is-date-object/CHANGELOG.md
new file mode 100644
index 0000000..4a7eab6
--- /dev/null
+++ b/node_modules/is-date-object/CHANGELOG.md
@@ -0,0 +1,10 @@
+1.0.1 / 2015-09-27
+=================
+ * [Fix] If `@@toStringTag` is not present, use the old-school `Object#toString` test
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+ * [Dev Deps] update `is`, `eslint`, `@ljharb/eslint-config`, `semver`, `tape`, `jscs`, `nsp`, `covert`
+ * [Tests] up to `io.js` `v3.3`, `node` `v4.1`
+
+1.0.0 / 2015-01-28
+=================
+ * Initial release.
diff --git a/node_modules/is-date-object/LICENSE b/node_modules/is-date-object/LICENSE
new file mode 100644
index 0000000..b43df44
--- /dev/null
+++ b/node_modules/is-date-object/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/is-date-object/Makefile b/node_modules/is-date-object/Makefile
new file mode 100644
index 0000000..b9e4fe1
--- /dev/null
+++ b/node_modules/is-date-object/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/is-date-object/README.md b/node_modules/is-date-object/README.md
new file mode 100644
index 0000000..55b0c59
--- /dev/null
+++ b/node_modules/is-date-object/README.md
@@ -0,0 +1,53 @@
+# is-date-object [![Version Badge][2]][1]
+
+[![Build Status][3]][4]
+[![dependency status][5]][6]
+[![dev dependency status][7]][8]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][11]][1]
+
+[![browser support][9]][10]
+
+Is this value a JS Date object? This module works cross-realm/iframe, and despite ES6 @@toStringTag.
+
+## Example
+
+```js
+var isDate = require('is-date-object');
+var assert = require('assert');
+
+assert.notOk(isDate(undefined));
+assert.notOk(isDate(null));
+assert.notOk(isDate(false));
+assert.notOk(isDate(true));
+assert.notOk(isDate(42));
+assert.notOk(isDate('foo'));
+assert.notOk(isDate(function () {}));
+assert.notOk(isDate([]));
+assert.notOk(isDate({}));
+assert.notOk(isDate(/a/g));
+assert.notOk(isDate(new RegExp('a', 'g')));
+
+assert.ok(isDate(new Date()));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[1]: https://npmjs.org/package/is-date-object
+[2]: http://versionbadg.es/ljharb/is-date-object.svg
+[3]: https://travis-ci.org/ljharb/is-date-object.svg
+[4]: https://travis-ci.org/ljharb/is-date-object
+[5]: https://david-dm.org/ljharb/is-date-object.svg
+[6]: https://david-dm.org/ljharb/is-date-object
+[7]: https://david-dm.org/ljharb/is-date-object/dev-status.svg
+[8]: https://david-dm.org/ljharb/is-date-object#info=devDependencies
+[9]: https://ci.testling.com/ljharb/is-date-object.png
+[10]: https://ci.testling.com/ljharb/is-date-object
+[11]: https://nodei.co/npm/is-date-object.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/is-date-object.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/is-date-object.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=is-date-object
diff --git a/node_modules/is-date-object/index.js b/node_modules/is-date-object/index.js
new file mode 100644
index 0000000..fe0d7ec
--- /dev/null
+++ b/node_modules/is-date-object/index.js
@@ -0,0 +1,20 @@
+'use strict';
+
+var getDay = Date.prototype.getDay;
+var tryDateObject = function tryDateObject(value) {
+ try {
+ getDay.call(value);
+ return true;
+ } catch (e) {
+ return false;
+ }
+};
+
+var toStr = Object.prototype.toString;
+var dateClass = '[object Date]';
+var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
+
+module.exports = function isDateObject(value) {
+ if (typeof value !== 'object' || value === null) { return false; }
+ return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;
+};
diff --git a/node_modules/is-date-object/package.json b/node_modules/is-date-object/package.json
new file mode 100644
index 0000000..9755b6d
--- /dev/null
+++ b/node_modules/is-date-object/package.json
@@ -0,0 +1,124 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "is-date-object@^1.0.1",
+ "scope": null,
+ "escapedName": "is-date-object",
+ "name": "is-date-object",
+ "rawSpec": "^1.0.1",
+ "spec": ">=1.0.1 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-to-primitive"
+ ]
+ ],
+ "_from": "is-date-object@>=1.0.1 <2.0.0",
+ "_id": "is-date-object@1.0.1",
+ "_inCache": true,
+ "_location": "/is-date-object",
+ "_nodeVersion": "4.1.1",
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "2.14.4",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "is-date-object@^1.0.1",
+ "scope": null,
+ "escapedName": "is-date-object",
+ "name": "is-date-object",
+ "rawSpec": "^1.0.1",
+ "spec": ">=1.0.1 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/es-to-primitive"
+ ],
+ "_resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "_shasum": "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16",
+ "_shrinkwrap": null,
+ "_spec": "is-date-object@^1.0.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-to-primitive",
+ "author": {
+ "name": "Jordan Harband"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/is-date-object/issues"
+ },
+ "dependencies": {},
+ "description": "Is this value a JS Date object? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^1.2.0",
+ "covert": "^1.1.0",
+ "eslint": "^1.5.1",
+ "foreach": "^2.0.5",
+ "indexof": "^0.0.1",
+ "is": "^3.1.0",
+ "jscs": "^2.1.1",
+ "nsp": "^1.1.0",
+ "semver": "^5.0.3",
+ "tape": "^4.2.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16",
+ "tarball": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "b03d8e939fec4f139f135a01ff2a3229a424e8fd",
+ "homepage": "https://github.com/ljharb/is-date-object#readme",
+ "keywords": [
+ "Date",
+ "ES6",
+ "toStringTag",
+ "@@toStringTag",
+ "Date object"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "is-date-object",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/is-date-object.git"
+ },
+ "scripts": {
+ "coverage": "covert test.js",
+ "coverage-quiet": "covert test.js --quiet",
+ "eslint": "eslint test.js *.js",
+ "jscs": "jscs test.js *.js",
+ "lint": "npm run jscs && npm run eslint",
+ "security": "nsp package",
+ "test": "npm run lint && node --harmony --es-staging test.js && npm run security"
+ },
+ "testling": {
+ "files": "test.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.0.1"
+}
diff --git a/node_modules/is-date-object/test.js b/node_modules/is-date-object/test.js
new file mode 100644
index 0000000..29f0917
--- /dev/null
+++ b/node_modules/is-date-object/test.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var test = require('tape');
+var isDate = require('./');
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
+
+test('not Dates', function (t) {
+ t.notOk(isDate(), 'undefined is not Date');
+ t.notOk(isDate(null), 'null is not Date');
+ t.notOk(isDate(false), 'false is not Date');
+ t.notOk(isDate(true), 'true is not Date');
+ t.notOk(isDate(42), 'number is not Date');
+ t.notOk(isDate('foo'), 'string is not Date');
+ t.notOk(isDate([]), 'array is not Date');
+ t.notOk(isDate({}), 'object is not Date');
+ t.notOk(isDate(function () {}), 'function is not Date');
+ t.notOk(isDate(/a/g), 'regex literal is not Date');
+ t.notOk(isDate(new RegExp('a', 'g')), 'regex object is not Date');
+ t.end();
+});
+
+test('@@toStringTag', { skip: !hasSymbols || !Symbol.toStringTag }, function (t) {
+ var realDate = new Date();
+ var fakeDate = { toString: function () { return String(realDate); }, valueOf: function () { return realDate.getTime(); } };
+ fakeDate[Symbol.toStringTag] = 'Date';
+ t.notOk(isDate(fakeDate), 'fake Date with @@toStringTag "Date" is not Date');
+ t.end();
+});
+
+test('Dates', function (t) {
+ t.ok(isDate(new Date()), 'new Date() is Date');
+ t.end();
+});
diff --git a/node_modules/is-regex/.eslintrc b/node_modules/is-regex/.eslintrc
new file mode 100644
index 0000000..9f56994
--- /dev/null
+++ b/node_modules/is-regex/.eslintrc
@@ -0,0 +1,160 @@
+{
+ "env": {
+ "browser": false,
+ "node": true,
+ "amd": false,
+ "mocha": false,
+ "jasmine": false
+ },
+
+ "rules": {
+ "block-scoped-var": [0],
+ "brace-style": [2, "1tbs", { "allowSingleLine": true }],
+ "camelcase": [2],
+ "comma-spacing": [2],
+ "comma-style": [2, "last"],
+ "complexity": [0, 11],
+ "consistent-return": [2],
+ "consistent-this": [0, "that"],
+ "curly": [2, "all"],
+ "default-case": [2],
+ "dot-notation": [2, { "allowKeywords": true }],
+ "eol-last": [2],
+ "eqeqeq": [2],
+ "func-names": [0],
+ "func-style": [0, "declaration"],
+ "global-strict": [0, "never"],
+ "guard-for-in": [0],
+ "handle-callback-err": [0],
+ "key-spacing": [2, { "beforeColon": false, "afterColon": true }],
+ "quotes": [2, "single", "avoid-escape"],
+ "max-depth": [0, 4],
+ "max-len": [0, 80, 4],
+ "max-nested-callbacks": [0, 2],
+ "max-params": [0, 3],
+ "max-statements": [0, 10],
+ "new-parens": [2],
+ "new-cap": [2],
+ "no-alert": [2],
+ "no-array-constructor": [2],
+ "no-bitwise": [0],
+ "no-caller": [2],
+ "no-catch-shadow": [2],
+ "no-comma-dangle": [2],
+ "no-cond-assign": [2],
+ "no-console": [2],
+ "no-constant-condition": [2],
+ "no-control-regex": [2],
+ "no-debugger": [2],
+ "no-delete-var": [2],
+ "no-div-regex": [0],
+ "no-dupe-keys": [2],
+ "no-else-return": [0],
+ "no-empty": [2],
+ "no-empty-class": [2],
+ "no-empty-label": [2],
+ "no-eq-null": [0],
+ "no-eval": [2],
+ "no-ex-assign": [2],
+ "no-extend-native": [2],
+ "no-extra-bind": [2],
+ "no-extra-boolean-cast": [2],
+ "no-extra-parens": [0],
+ "no-extra-semi": [2],
+ "no-extra-strict": [2],
+ "no-fallthrough": [2],
+ "no-floating-decimal": [2],
+ "no-func-assign": [2],
+ "no-implied-eval": [2],
+ "no-inline-comments": [0],
+ "no-inner-declarations": [2, "functions"],
+ "no-invalid-regexp": [2],
+ "no-irregular-whitespace": [2],
+ "no-iterator": [2],
+ "no-label-var": [2],
+ "no-labels": [2],
+ "no-lone-blocks": [2],
+ "no-lonely-if": [2],
+ "no-loop-func": [2],
+ "no-mixed-requires": [0, false],
+ "no-mixed-spaces-and-tabs": [2, false],
+ "no-multi-spaces": [2],
+ "no-multi-str": [2],
+ "no-multiple-empty-lines": [0, {"max": 2}],
+ "no-native-reassign": [2],
+ "no-negated-in-lhs": [2],
+ "no-nested-ternary": [0],
+ "no-new": [2],
+ "no-new-func": [2],
+ "no-new-object": [2],
+ "no-new-require": [0],
+ "no-new-wrappers": [2],
+ "no-obj-calls": [2],
+ "no-octal": [2],
+ "no-octal-escape": [2],
+ "no-path-concat": [0],
+ "no-plusplus": [0],
+ "no-process-env": [0],
+ "no-process-exit": [2],
+ "no-proto": [2],
+ "no-redeclare": [2],
+ "no-regex-spaces": [2],
+ "no-reserved-keys": [2],
+ "no-restricted-modules": [0],
+ "no-return-assign": [2],
+ "no-script-url": [2],
+ "no-self-compare": [0],
+ "no-sequences": [2],
+ "no-shadow": [2],
+ "no-shadow-restricted-names": [2],
+ "no-space-before-semi": [2],
+ "no-spaced-func": [2],
+ "no-sparse-arrays": [2],
+ "no-sync": [0],
+ "no-ternary": [0],
+ "no-trailing-spaces": [2],
+ "no-undef": [2],
+ "no-undef-init": [2],
+ "no-undefined": [0],
+ "no-underscore-dangle": [2],
+ "no-unreachable": [2],
+ "no-unused-expressions": [2],
+ "no-unused-vars": [2, { "vars": "all", "args": "after-used" }],
+ "no-use-before-define": [2],
+ "no-void": [0],
+ "no-warning-comments": [0, { "terms": ["todo", "fixme", "xxx"], "location": "start" }],
+ "no-with": [2],
+ "no-wrap-func": [2],
+ "one-var": [0],
+ "operator-assignment": [0, "always"],
+ "padded-blocks": [0],
+ "quote-props": [0],
+ "radix": [0],
+ "semi": [2],
+ "sort-vars": [0],
+ "space-after-keywords": [2, "always", { "checkFunctionKeyword": true }],
+ "space-before-blocks": [0, "always"],
+ "space-in-brackets": [0, "never", {
+ "singleValue": true,
+ "arraysInArrays": false,
+ "arraysInObjects": false,
+ "objectsInArrays": true,
+ "objectsInObjects": true,
+ "propertyName": false
+ }],
+ "space-in-parens": [2, "never"],
+ "space-infix-ops": [2],
+ "space-return-throw-case": [2],
+ "space-after-function-name": [2, "never"],
+ "space-unary-ops": [2, { "words": true, "nonwords": false }],
+ "spaced-line-comment": [0, "always"],
+ "strict": [0],
+ "use-isnan": [2],
+ "valid-jsdoc": [0],
+ "valid-typeof": [2],
+ "vars-on-top": [0],
+ "wrap-iife": [2],
+ "wrap-regex": [2],
+ "yoda": [2, "never", { "exceptRange": true }]
+ }
+}
diff --git a/node_modules/is-regex/.jscs.json b/node_modules/is-regex/.jscs.json
new file mode 100644
index 0000000..496777b
--- /dev/null
+++ b/node_modules/is-regex/.jscs.json
@@ -0,0 +1,68 @@
+{
+ "additionalRules": [],
+
+ "requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": true,
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ }
+}
+
diff --git a/node_modules/is-regex/.npmignore b/node_modules/is-regex/.npmignore
new file mode 100644
index 0000000..a72b52e
--- /dev/null
+++ b/node_modules/is-regex/.npmignore
@@ -0,0 +1,15 @@
+lib-cov
+*.seed
+*.log
+*.csv
+*.dat
+*.out
+*.pid
+*.gz
+
+pids
+logs
+results
+
+npm-debug.log
+node_modules
diff --git a/node_modules/is-regex/.travis.yml b/node_modules/is-regex/.travis.yml
new file mode 100644
index 0000000..e318c1d
--- /dev/null
+++ b/node_modules/is-regex/.travis.yml
@@ -0,0 +1,18 @@
+language: node_js
+node_js:
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - '[ "${TRAVIS_NODE_VERSION}" == "0.6" ] || npm install -g npm@~1.4.6'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/is-regex/CHANGELOG.md b/node_modules/is-regex/CHANGELOG.md
new file mode 100644
index 0000000..a253bcd
--- /dev/null
+++ b/node_modules/is-regex/CHANGELOG.md
@@ -0,0 +1,16 @@
+1.0.3 / 2015-01-29
+=================
+ * If @@toStringTag is not present, use the old-school Object#toString test.
+
+1.0.2 / 2015-01-29
+=================
+ * Improve optimization by separating the try/catch, and bailing out early when not typeof "object".
+
+1.0.1 / 2015-01-28
+=================
+ * Update `jscs`, `tape`, `covert`
+ * Use RegExp#exec to test if something is a regex, which works even with ES6 @@toStringTag.
+
+1.0.0 / 2014-05-19
+=================
+ * Initial release.
diff --git a/node_modules/is-regex/LICENSE b/node_modules/is-regex/LICENSE
new file mode 100644
index 0000000..47b7b50
--- /dev/null
+++ b/node_modules/is-regex/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/is-regex/Makefile b/node_modules/is-regex/Makefile
new file mode 100644
index 0000000..b9e4fe1
--- /dev/null
+++ b/node_modules/is-regex/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/is-regex/README.md b/node_modules/is-regex/README.md
new file mode 100644
index 0000000..cd09468
--- /dev/null
+++ b/node_modules/is-regex/README.md
@@ -0,0 +1,54 @@
+#is-regex [![Version Badge][2]][1]
+
+[![Build Status][3]][4]
+[![dependency status][5]][6]
+[![dev dependency status][7]][8]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][11]][1]
+
+[![browser support][9]][10]
+
+Is this value a JS regex?
+This module works cross-realm/iframe, and despite ES6 @@toStringTag.
+
+## Example
+
+```js
+var isRegex = require('is-regex');
+var assert = require('assert');
+
+assert.notOk(isRegex(undefined));
+assert.notOk(isRegex(null));
+assert.notOk(isRegex(false));
+assert.notOk(isRegex(true));
+assert.notOk(isRegex(42));
+assert.notOk(isRegex('foo'));
+assert.notOk(isRegex(function () {}));
+assert.notOk(isRegex([]));
+assert.notOk(isRegex({}));
+
+assert.ok(isRegex(/a/g));
+assert.ok(isRegex(new RegExp('a', 'g')));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[1]: https://npmjs.org/package/is-regex
+[2]: http://vb.teelaun.ch/ljharb/is-regex.svg
+[3]: https://travis-ci.org/ljharb/is-regex.svg
+[4]: https://travis-ci.org/ljharb/is-regex
+[5]: https://david-dm.org/ljharb/is-regex.svg
+[6]: https://david-dm.org/ljharb/is-regex
+[7]: https://david-dm.org/ljharb/is-regex/dev-status.svg
+[8]: https://david-dm.org/ljharb/is-regex#info=devDependencies
+[9]: https://ci.testling.com/ljharb/is-regex.png
+[10]: https://ci.testling.com/ljharb/is-regex
+[11]: https://nodei.co/npm/is-regex.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/is-regex.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/is-regex.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=is-regex
+
diff --git a/node_modules/is-regex/index.js b/node_modules/is-regex/index.js
new file mode 100644
index 0000000..7676c75
--- /dev/null
+++ b/node_modules/is-regex/index.js
@@ -0,0 +1,19 @@
+'use strict';
+
+var regexExec = RegExp.prototype.exec;
+var tryRegexExec = function tryRegexExec(value) {
+ try {
+ regexExec.call(value);
+ return true;
+ } catch (e) {
+ return false;
+ }
+};
+var toStr = Object.prototype.toString;
+var regexClass = '[object RegExp]';
+var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
+
+module.exports = function isRegex(value) {
+ if (typeof value !== 'object') { return false; }
+ return hasToStringTag ? tryRegexExec(value) : toStr.call(value) === regexClass;
+};
diff --git a/node_modules/is-regex/package.json b/node_modules/is-regex/package.json
new file mode 100644
index 0000000..f77e675
--- /dev/null
+++ b/node_modules/is-regex/package.json
@@ -0,0 +1,124 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "is-regex@^1.0.3",
+ "scope": null,
+ "escapedName": "is-regex",
+ "name": "is-regex",
+ "rawSpec": "^1.0.3",
+ "spec": ">=1.0.3 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-abstract"
+ ]
+ ],
+ "_from": "is-regex@>=1.0.3 <2.0.0",
+ "_id": "is-regex@1.0.3",
+ "_inCache": true,
+ "_location": "/is-regex",
+ "_nodeVersion": "1.0.4",
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "2.3.0",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "is-regex@^1.0.3",
+ "scope": null,
+ "escapedName": "is-regex",
+ "name": "is-regex",
+ "rawSpec": "^1.0.3",
+ "spec": ">=1.0.3 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/es-abstract"
+ ],
+ "_resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.3.tgz",
+ "_shasum": "0d55182bddf9f2fde278220aec3a75642c908637",
+ "_shrinkwrap": null,
+ "_spec": "is-regex@^1.0.3",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-abstract",
+ "author": {
+ "name": "Jordan Harband"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/is-regex/issues"
+ },
+ "dependencies": {},
+ "description": "Is this value a JS regex? Works cross-realm/iframe, and despite ES6 @@toStringTag",
+ "devDependencies": {
+ "covert": "1.0.0",
+ "editorconfig-tools": "~0.0.1",
+ "eslint": "~0.13.0",
+ "jscs": "~1.10.0",
+ "nsp": "~1.0.0",
+ "semver": "~4.2.0",
+ "tape": "~3.4.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "0d55182bddf9f2fde278220aec3a75642c908637",
+ "tarball": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.3.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "405685f6172a14d85e7a5f45e7112c9a608813f2",
+ "homepage": "https://github.com/ljharb/is-regex",
+ "keywords": [
+ "regex",
+ "regexp",
+ "is",
+ "regular expression",
+ "regular",
+ "expression"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "is-regex",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/is-regex.git"
+ },
+ "scripts": {
+ "coverage": "covert test.js",
+ "coverage-quiet": "covert test.js --quiet",
+ "eccheck": "editorconfig-tools check *.js **/*.js > /dev/null",
+ "eslint": "eslint test.js *.js",
+ "jscs": "jscs *.js",
+ "lint": "npm run jscs && npm run eslint",
+ "security": "nsp package",
+ "test": "npm run lint && node test.js && npm run security"
+ },
+ "testling": {
+ "files": "test.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..12.0",
+ "opera/15.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.0.3"
+}
diff --git a/node_modules/is-regex/test.js b/node_modules/is-regex/test.js
new file mode 100644
index 0000000..ee88953
--- /dev/null
+++ b/node_modules/is-regex/test.js
@@ -0,0 +1,32 @@
+'use strict';
+
+var test = require('tape');
+var isRegex = require('./');
+var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
+
+test('not regexes', function (t) {
+ t.notOk(isRegex(), 'undefined is not regex');
+ t.notOk(isRegex(null), 'null is not regex');
+ t.notOk(isRegex(false), 'false is not regex');
+ t.notOk(isRegex(true), 'true is not regex');
+ t.notOk(isRegex(42), 'number is not regex');
+ t.notOk(isRegex('foo'), 'string is not regex');
+ t.notOk(isRegex([]), 'array is not regex');
+ t.notOk(isRegex({}), 'object is not regex');
+ t.notOk(isRegex(function () {}), 'function is not regex');
+ t.end();
+});
+
+test('@@toStringTag', { skip: !hasToStringTag }, function (t) {
+ var regex = /a/g;
+ var fakeRegex = { valueOf: function () { return regex; }, toString: function () { return String(regex); } };
+ fakeRegex[Symbol.toStringTag] = function () { return 'RegExp'; };
+ t.notOk(isRegex(fakeRegex), 'fake RegExp with @@toStringTag "RegExp" is not regex');
+ t.end();
+});
+
+test('regexes', function (t) {
+ t.ok(isRegex(/a/g), 'regex literal is regex');
+ t.ok(isRegex(new RegExp('a', 'g')), 'regex object is regex');
+ t.end();
+});
diff --git a/node_modules/is-symbol/.editorconfig b/node_modules/is-symbol/.editorconfig
new file mode 100644
index 0000000..eaa2141
--- /dev/null
+++ b/node_modules/is-symbol/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+indent_style = tab;
+insert_final_newline = true;
+quote_type = auto;
+space_after_anonymous_functions = true;
+space_after_control_statements = true;
+spaces_around_operators = true;
+trim_trailing_whitespace = true;
+spaces_in_brackets = false;
+end_of_line = lf;
+
diff --git a/node_modules/is-symbol/.eslintrc b/node_modules/is-symbol/.eslintrc
new file mode 100644
index 0000000..9f56994
--- /dev/null
+++ b/node_modules/is-symbol/.eslintrc
@@ -0,0 +1,160 @@
+{
+ "env": {
+ "browser": false,
+ "node": true,
+ "amd": false,
+ "mocha": false,
+ "jasmine": false
+ },
+
+ "rules": {
+ "block-scoped-var": [0],
+ "brace-style": [2, "1tbs", { "allowSingleLine": true }],
+ "camelcase": [2],
+ "comma-spacing": [2],
+ "comma-style": [2, "last"],
+ "complexity": [0, 11],
+ "consistent-return": [2],
+ "consistent-this": [0, "that"],
+ "curly": [2, "all"],
+ "default-case": [2],
+ "dot-notation": [2, { "allowKeywords": true }],
+ "eol-last": [2],
+ "eqeqeq": [2],
+ "func-names": [0],
+ "func-style": [0, "declaration"],
+ "global-strict": [0, "never"],
+ "guard-for-in": [0],
+ "handle-callback-err": [0],
+ "key-spacing": [2, { "beforeColon": false, "afterColon": true }],
+ "quotes": [2, "single", "avoid-escape"],
+ "max-depth": [0, 4],
+ "max-len": [0, 80, 4],
+ "max-nested-callbacks": [0, 2],
+ "max-params": [0, 3],
+ "max-statements": [0, 10],
+ "new-parens": [2],
+ "new-cap": [2],
+ "no-alert": [2],
+ "no-array-constructor": [2],
+ "no-bitwise": [0],
+ "no-caller": [2],
+ "no-catch-shadow": [2],
+ "no-comma-dangle": [2],
+ "no-cond-assign": [2],
+ "no-console": [2],
+ "no-constant-condition": [2],
+ "no-control-regex": [2],
+ "no-debugger": [2],
+ "no-delete-var": [2],
+ "no-div-regex": [0],
+ "no-dupe-keys": [2],
+ "no-else-return": [0],
+ "no-empty": [2],
+ "no-empty-class": [2],
+ "no-empty-label": [2],
+ "no-eq-null": [0],
+ "no-eval": [2],
+ "no-ex-assign": [2],
+ "no-extend-native": [2],
+ "no-extra-bind": [2],
+ "no-extra-boolean-cast": [2],
+ "no-extra-parens": [0],
+ "no-extra-semi": [2],
+ "no-extra-strict": [2],
+ "no-fallthrough": [2],
+ "no-floating-decimal": [2],
+ "no-func-assign": [2],
+ "no-implied-eval": [2],
+ "no-inline-comments": [0],
+ "no-inner-declarations": [2, "functions"],
+ "no-invalid-regexp": [2],
+ "no-irregular-whitespace": [2],
+ "no-iterator": [2],
+ "no-label-var": [2],
+ "no-labels": [2],
+ "no-lone-blocks": [2],
+ "no-lonely-if": [2],
+ "no-loop-func": [2],
+ "no-mixed-requires": [0, false],
+ "no-mixed-spaces-and-tabs": [2, false],
+ "no-multi-spaces": [2],
+ "no-multi-str": [2],
+ "no-multiple-empty-lines": [0, {"max": 2}],
+ "no-native-reassign": [2],
+ "no-negated-in-lhs": [2],
+ "no-nested-ternary": [0],
+ "no-new": [2],
+ "no-new-func": [2],
+ "no-new-object": [2],
+ "no-new-require": [0],
+ "no-new-wrappers": [2],
+ "no-obj-calls": [2],
+ "no-octal": [2],
+ "no-octal-escape": [2],
+ "no-path-concat": [0],
+ "no-plusplus": [0],
+ "no-process-env": [0],
+ "no-process-exit": [2],
+ "no-proto": [2],
+ "no-redeclare": [2],
+ "no-regex-spaces": [2],
+ "no-reserved-keys": [2],
+ "no-restricted-modules": [0],
+ "no-return-assign": [2],
+ "no-script-url": [2],
+ "no-self-compare": [0],
+ "no-sequences": [2],
+ "no-shadow": [2],
+ "no-shadow-restricted-names": [2],
+ "no-space-before-semi": [2],
+ "no-spaced-func": [2],
+ "no-sparse-arrays": [2],
+ "no-sync": [0],
+ "no-ternary": [0],
+ "no-trailing-spaces": [2],
+ "no-undef": [2],
+ "no-undef-init": [2],
+ "no-undefined": [0],
+ "no-underscore-dangle": [2],
+ "no-unreachable": [2],
+ "no-unused-expressions": [2],
+ "no-unused-vars": [2, { "vars": "all", "args": "after-used" }],
+ "no-use-before-define": [2],
+ "no-void": [0],
+ "no-warning-comments": [0, { "terms": ["todo", "fixme", "xxx"], "location": "start" }],
+ "no-with": [2],
+ "no-wrap-func": [2],
+ "one-var": [0],
+ "operator-assignment": [0, "always"],
+ "padded-blocks": [0],
+ "quote-props": [0],
+ "radix": [0],
+ "semi": [2],
+ "sort-vars": [0],
+ "space-after-keywords": [2, "always", { "checkFunctionKeyword": true }],
+ "space-before-blocks": [0, "always"],
+ "space-in-brackets": [0, "never", {
+ "singleValue": true,
+ "arraysInArrays": false,
+ "arraysInObjects": false,
+ "objectsInArrays": true,
+ "objectsInObjects": true,
+ "propertyName": false
+ }],
+ "space-in-parens": [2, "never"],
+ "space-infix-ops": [2],
+ "space-return-throw-case": [2],
+ "space-after-function-name": [2, "never"],
+ "space-unary-ops": [2, { "words": true, "nonwords": false }],
+ "spaced-line-comment": [0, "always"],
+ "strict": [0],
+ "use-isnan": [2],
+ "valid-jsdoc": [0],
+ "valid-typeof": [2],
+ "vars-on-top": [0],
+ "wrap-iife": [2],
+ "wrap-regex": [2],
+ "yoda": [2, "never", { "exceptRange": true }]
+ }
+}
diff --git a/node_modules/is-symbol/.jscs.json b/node_modules/is-symbol/.jscs.json
new file mode 100644
index 0000000..496777b
--- /dev/null
+++ b/node_modules/is-symbol/.jscs.json
@@ -0,0 +1,68 @@
+{
+ "additionalRules": [],
+
+ "requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": true,
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ }
+}
+
diff --git a/node_modules/is-symbol/.npmignore b/node_modules/is-symbol/.npmignore
new file mode 100644
index 0000000..59d842b
--- /dev/null
+++ b/node_modules/is-symbol/.npmignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# Commenting this out is preferred by some people, see
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
+node_modules
+
+# Users Environment Variables
+.lock-wscript
diff --git a/node_modules/is-symbol/.nvmrc b/node_modules/is-symbol/.nvmrc
new file mode 100644
index 0000000..c9c594c
--- /dev/null
+++ b/node_modules/is-symbol/.nvmrc
@@ -0,0 +1 @@
+iojs
diff --git a/node_modules/is-symbol/.travis.yml b/node_modules/is-symbol/.travis.yml
new file mode 100644
index 0000000..c80407f
--- /dev/null
+++ b/node_modules/is-symbol/.travis.yml
@@ -0,0 +1,18 @@
+language: node_js
+node_js:
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - '[ "${TRAVIS_NODE_VERSION}" == "0.6" ] || npm install -g npm@1.4.6'
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
+
diff --git a/node_modules/is-symbol/CHANGELOG.md b/node_modules/is-symbol/CHANGELOG.md
new file mode 100644
index 0000000..e1a62a4
--- /dev/null
+++ b/node_modules/is-symbol/CHANGELOG.md
@@ -0,0 +1,7 @@
+1.0.1 / 2015-01-26
+=================
+ * Corrected description
+
+1.0.0 / 2015-01-24
+=================
+ * Initial release
diff --git a/node_modules/is-symbol/LICENSE b/node_modules/is-symbol/LICENSE
new file mode 100644
index 0000000..b43df44
--- /dev/null
+++ b/node_modules/is-symbol/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/is-symbol/Makefile b/node_modules/is-symbol/Makefile
new file mode 100644
index 0000000..b9e4fe1
--- /dev/null
+++ b/node_modules/is-symbol/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/is-symbol/README.md b/node_modules/is-symbol/README.md
new file mode 100644
index 0000000..ad3df64
--- /dev/null
+++ b/node_modules/is-symbol/README.md
@@ -0,0 +1,46 @@
+#is-symbol [![Version Badge][2]][1]
+
+[![Build Status][3]][4]
+[![dependency status][5]][6]
+[![dev dependency status][7]][8]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][11]][1]
+
+[![browser support][9]][10]
+
+Is this an ES6 Symbol value?
+
+## Example
+
+```js
+var isSymbol = require('is-symbol');
+assert(!isSymbol(function () {}));
+assert(!isSymbol(null));
+assert(!isSymbol(function* () { yield 42; return Infinity; });
+
+assert(isSymbol(Symbol.iterator));
+assert(isSymbol(Symbol('foo')));
+assert(isSymbol(Symbol.for('foo')));
+assert(isSymbol(Object(Symbol('foo'))));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[1]: https://npmjs.org/package/is-symbol
+[2]: http://vb.teelaun.ch/ljharb/is-symbol.svg
+[3]: https://travis-ci.org/ljharb/is-symbol.svg
+[4]: https://travis-ci.org/ljharb/is-symbol
+[5]: https://david-dm.org/ljharb/is-symbol.svg
+[6]: https://david-dm.org/ljharb/is-symbol
+[7]: https://david-dm.org/ljharb/is-symbol/dev-status.svg
+[8]: https://david-dm.org/ljharb/is-symbol#info=devDependencies
+[9]: https://ci.testling.com/ljharb/is-symbol.png
+[10]: https://ci.testling.com/ljharb/is-symbol
+[11]: https://nodei.co/npm/is-symbol.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/is-symbol.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/is-symbol.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=is-symbol
diff --git a/node_modules/is-symbol/index.js b/node_modules/is-symbol/index.js
new file mode 100644
index 0000000..a938cbf
--- /dev/null
+++ b/node_modules/is-symbol/index.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var toStr = Object.prototype.toString;
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
+
+if (hasSymbols) {
+ var symToStr = Symbol.prototype.toString;
+ var symStringRegex = /^Symbol\(.*\)$/;
+ var isSymbolObject = function isSymbolObject(value) {
+ if (typeof value.valueOf() !== 'symbol') { return false; }
+ return symStringRegex.test(symToStr.call(value));
+ };
+ module.exports = function isSymbol(value) {
+ if (typeof value === 'symbol') { return true; }
+ if (toStr.call(value) !== '[object Symbol]') { return false; }
+ try {
+ return isSymbolObject(value);
+ } catch (e) {
+ return false;
+ }
+ };
+} else {
+ module.exports = function isSymbol(value) {
+ // this environment does not support Symbols.
+ return false;
+ };
+}
diff --git a/node_modules/is-symbol/package.json b/node_modules/is-symbol/package.json
new file mode 100644
index 0000000..c0e5a49
--- /dev/null
+++ b/node_modules/is-symbol/package.json
@@ -0,0 +1,115 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "is-symbol@^1.0.1",
+ "scope": null,
+ "escapedName": "is-symbol",
+ "name": "is-symbol",
+ "rawSpec": "^1.0.1",
+ "spec": ">=1.0.1 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-to-primitive"
+ ]
+ ],
+ "_from": "is-symbol@>=1.0.1 <2.0.0",
+ "_id": "is-symbol@1.0.1",
+ "_inCache": true,
+ "_location": "/is-symbol",
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "1.4.28",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "is-symbol@^1.0.1",
+ "scope": null,
+ "escapedName": "is-symbol",
+ "name": "is-symbol",
+ "rawSpec": "^1.0.1",
+ "spec": ">=1.0.1 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/es-to-primitive"
+ ],
+ "_resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+ "_shasum": "3cc59f00025194b6ab2e38dbae6689256b660572",
+ "_shrinkwrap": null,
+ "_spec": "is-symbol@^1.0.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/es-to-primitive",
+ "author": {
+ "name": "Jordan Harband"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/is-symbol/issues"
+ },
+ "dependencies": {},
+ "description": "Determine if a value is an ES6 Symbol or not.",
+ "devDependencies": {
+ "covert": "1.0.0",
+ "jscs": "~1.10.0",
+ "nsp": "~1.0.0",
+ "semver": "~4.2.0",
+ "tape": "~3.4.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "3cc59f00025194b6ab2e38dbae6689256b660572",
+ "tarball": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "5bbd991ff41a459a941d205de65d533cc6c3cd8c",
+ "homepage": "https://github.com/ljharb/is-symbol",
+ "keywords": [
+ "symbol",
+ "es6",
+ "is",
+ "Symbol"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "is-symbol",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/is-symbol.git"
+ },
+ "scripts": {
+ "coverage": "covert test/index.js",
+ "coverage:quiet": "covert test/index.js --quiet",
+ "lint": "jscs *.js */*.js",
+ "security": "nsp package",
+ "test": "npm run lint && node --es-staging --harmony test/index.js && npm run security"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.0.1"
+}
diff --git a/node_modules/is-symbol/test/index.js b/node_modules/is-symbol/test/index.js
new file mode 100644
index 0000000..697a7b2
--- /dev/null
+++ b/node_modules/is-symbol/test/index.js
@@ -0,0 +1,106 @@
+'use strict';
+
+var test = require('tape');
+var isSymbol = require('../index');
+
+var forEach = function (arr, func) {
+ var i;
+ for (i = 0; i < arr.length; ++i) {
+ func(arr[i], i, arr);
+ }
+};
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
+var debug = function (value, msg) {
+ var output = '';
+ if (hasSymbols) {
+ try { output += String(value); }
+ catch (e) { output += Symbol.prototype.toString.call(value); }
+ if (output === '') {
+ output = JSON.stringify(value);
+ }
+ }
+ var type = Object.prototype.toString.call(value).toLowerCase().slice(8, -1);
+ output += ' (' + type;
+ var typeOf = typeof value;
+ if (type !== typeOf) {
+ output += ', typeof: ' + typeOf;
+ }
+ return output + ') ' + msg;
+};
+
+test('non-symbol values', function (t) {
+ var nonSymbols = [
+ true,
+ false,
+ Object(true),
+ Object(false),
+ null,
+ undefined,
+ {},
+ [],
+ /a/g,
+ 'string',
+ 42,
+ new Date(),
+ function () {},
+ NaN
+ ];
+ t.plan(nonSymbols.length);
+ forEach(nonSymbols, function (nonSymbol) {
+ t.equal(false, isSymbol(nonSymbol), debug(nonSymbol, 'is not a symbol'));
+ });
+ t.end();
+});
+
+test('faked symbol values', function (t) {
+ t.test('real symbol valueOf', { skip: !hasSymbols }, function (st) {
+ var fakeSymbol = { valueOf: function () { return Symbol('foo'); } };
+ st.equal(false, isSymbol(fakeSymbol), 'object with valueOf returning a symbol is not a symbol');
+ st.end();
+ });
+
+ t.test('faked @@toStringTag', { skip: !hasSymbols || !Symbol.toStringTag }, function (st) {
+ var fakeSymbol = { valueOf: function () { return Symbol('foo'); } };
+ fakeSymbol[Symbol.toStringTag] = 'Symbol';
+ st.equal(false, isSymbol(fakeSymbol), 'object with fake Symbol @@toStringTag and valueOf returning a symbol is not a symbol');
+ var notSoFakeSymbol = { valueOf: function () { return 42; } };
+ notSoFakeSymbol[Symbol.toStringTag] = 'Symbol';
+ st.equal(false, isSymbol(notSoFakeSymbol), 'object with fake Symbol @@toStringTag and valueOf not returning a symbol is not a symbol');
+ st.end();
+ });
+
+ var fakeSymbolString = { toString: function () { return 'Symbol(foo)'; } };
+ t.equal(false, isSymbol(fakeSymbolString), 'object with toString returning Symbol(foo) is not a symbol');
+
+ t.end();
+});
+
+test('Symbol support', { skip: !hasSymbols }, function (t) {
+ t.test('well-known Symbols', function (st) {
+ var wellKnownSymbols = Object.getOwnPropertyNames(Symbol).filter(function filterer(name) {
+ return name !== 'for' && name !== 'keyFor' && !(name in filterer);
+ });
+ wellKnownSymbols.forEach(function (name) {
+ var sym = Symbol[name];
+ st.equal(true, isSymbol(sym), debug(sym, ' is a symbol'));
+ });
+ st.end();
+ });
+
+ t.test('user-created symbols', function (st) {
+ var symbols = [
+ Symbol(),
+ Symbol('foo'),
+ Symbol.for('foo'),
+ Object(Symbol('object'))
+ ];
+ symbols.forEach(function (sym) {
+ st.equal(true, isSymbol(sym), debug(sym, ' is a symbol'));
+ });
+ st.end();
+ });
+
+ t.end();
+});
+
diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/minimatch/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md
new file mode 100644
index 0000000..ad72b81
--- /dev/null
+++ b/node_modules/minimatch/README.md
@@ -0,0 +1,209 @@
+# minimatch
+
+A minimal matching utility.
+
+[](http://travis-ci.org/isaacs/minimatch)
+
+
+This is the matching library used internally by npm.
+
+It works by converting glob expressions into JavaScript `RegExp`
+objects.
+
+## Usage
+
+```javascript
+var minimatch = require("minimatch")
+
+minimatch("bar.foo", "*.foo") // true!
+minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
+```
+
+## Features
+
+Supports these glob features:
+
+* Brace Expansion
+* Extended glob matching
+* "Globstar" `**` matching
+
+See:
+
+* `man sh`
+* `man bash`
+* `man 3 fnmatch`
+* `man 5 gitignore`
+
+## Minimatch Class
+
+Create a minimatch object by instantiating the `minimatch.Minimatch` class.
+
+```javascript
+var Minimatch = require("minimatch").Minimatch
+var mm = new Minimatch(pattern, options)
+```
+
+### Properties
+
+* `pattern` The original pattern the minimatch object represents.
+* `options` The options supplied to the constructor.
+* `set` A 2-dimensional array of regexp or string expressions.
+ Each row in the
+ array corresponds to a brace-expanded pattern. Each item in the row
+ corresponds to a single path-part. For example, the pattern
+ `{a,b/c}/d` would expand to a set of patterns like:
+
+ [ [ a, d ]
+ , [ b, c, d ] ]
+
+ If a portion of the pattern doesn't have any "magic" in it
+ (that is, it's something like `"foo"` rather than `fo*o?`), then it
+ will be left as a string rather than converted to a regular
+ expression.
+
+* `regexp` Created by the `makeRe` method. A single regular expression
+ expressing the entire pattern. This is useful in cases where you wish
+ to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
+* `negate` True if the pattern is negated.
+* `comment` True if the pattern is a comment.
+* `empty` True if the pattern is `""`.
+
+### Methods
+
+* `makeRe` Generate the `regexp` member if necessary, and return it.
+ Will return `false` if the pattern is invalid.
+* `match(fname)` Return true if the filename matches the pattern, or
+ false otherwise.
+* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
+ filename, and match it against a single row in the `regExpSet`. This
+ method is mainly for internal use, but is exposed so that it can be
+ used by a glob-walker that needs to avoid excessive filesystem calls.
+
+All other methods are internal, and will be called as necessary.
+
+### minimatch(path, pattern, options)
+
+Main export. Tests a path against the pattern using the options.
+
+```javascript
+var isJS = minimatch(file, "*.js", { matchBase: true })
+```
+
+### minimatch.filter(pattern, options)
+
+Returns a function that tests its
+supplied argument, suitable for use with `Array.filter`. Example:
+
+```javascript
+var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
+```
+
+### minimatch.match(list, pattern, options)
+
+Match against the list of
+files, in the style of fnmatch or glob. If nothing is matched, and
+options.nonull is set, then return a list containing the pattern itself.
+
+```javascript
+var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
+```
+
+### minimatch.makeRe(pattern, options)
+
+Make a regular expression object from the pattern.
+
+## Options
+
+All options are `false` by default.
+
+### debug
+
+Dump a ton of stuff to stderr.
+
+### nobrace
+
+Do not expand `{a,b}` and `{1..3}` brace sets.
+
+### noglobstar
+
+Disable `**` matching against multiple folder names.
+
+### dot
+
+Allow patterns to match filenames starting with a period, even if
+the pattern does not explicitly have a period in that spot.
+
+Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
+is set.
+
+### noext
+
+Disable "extglob" style patterns like `+(a|b)`.
+
+### nocase
+
+Perform a case-insensitive match.
+
+### nonull
+
+When a match is not found by `minimatch.match`, return a list containing
+the pattern itself if this option is set. When not set, an empty list
+is returned if there are no matches.
+
+### matchBase
+
+If set, then patterns without slashes will be matched
+against the basename of the path if it contains slashes. For example,
+`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
+
+### nocomment
+
+Suppress the behavior of treating `#` at the start of a pattern as a
+comment.
+
+### nonegate
+
+Suppress the behavior of treating a leading `!` character as negation.
+
+### flipNegate
+
+Returns from negate expressions the same as if they were not negated.
+(Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated. Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally. This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything. Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set. This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes. For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`. This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern. Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity. Since those two are valid, matching proceeds.
diff --git a/node_modules/minimatch/minimatch.js b/node_modules/minimatch/minimatch.js
new file mode 100644
index 0000000..5b5f8cf
--- /dev/null
+++ b/node_modules/minimatch/minimatch.js
@@ -0,0 +1,923 @@
+module.exports = minimatch
+minimatch.Minimatch = Minimatch
+
+var path = { sep: '/' }
+try {
+ path = require('path')
+} catch (er) {}
+
+var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
+var expand = require('brace-expansion')
+
+var plTypes = {
+ '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
+ '?': { open: '(?:', close: ')?' },
+ '+': { open: '(?:', close: ')+' },
+ '*': { open: '(?:', close: ')*' },
+ '@': { open: '(?:', close: ')' }
+}
+
+// any single thing other than /
+// don't need to escape / when using new RegExp()
+var qmark = '[^/]'
+
+// * => any number of characters
+var star = qmark + '*?'
+
+// ** when dots are allowed. Anything goes, except .. and .
+// not (^ or / followed by one or two dots followed by $ or /),
+// followed by anything, any number of times.
+var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
+
+// not a ^ or / followed by a dot,
+// followed by anything, any number of times.
+var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
+
+// characters that need to be escaped in RegExp.
+var reSpecials = charSet('().*{}+?[]^$\\!')
+
+// "abc" -> { a:true, b:true, c:true }
+function charSet (s) {
+ return s.split('').reduce(function (set, c) {
+ set[c] = true
+ return set
+ }, {})
+}
+
+// normalizes slashes.
+var slashSplit = /\/+/
+
+minimatch.filter = filter
+function filter (pattern, options) {
+ options = options || {}
+ return function (p, i, list) {
+ return minimatch(p, pattern, options)
+ }
+}
+
+function ext (a, b) {
+ a = a || {}
+ b = b || {}
+ var t = {}
+ Object.keys(b).forEach(function (k) {
+ t[k] = b[k]
+ })
+ Object.keys(a).forEach(function (k) {
+ t[k] = a[k]
+ })
+ return t
+}
+
+minimatch.defaults = function (def) {
+ if (!def || !Object.keys(def).length) return minimatch
+
+ var orig = minimatch
+
+ var m = function minimatch (p, pattern, options) {
+ return orig.minimatch(p, pattern, ext(def, options))
+ }
+
+ m.Minimatch = function Minimatch (pattern, options) {
+ return new orig.Minimatch(pattern, ext(def, options))
+ }
+
+ return m
+}
+
+Minimatch.defaults = function (def) {
+ if (!def || !Object.keys(def).length) return Minimatch
+ return minimatch.defaults(def).Minimatch
+}
+
+function minimatch (p, pattern, options) {
+ if (typeof pattern !== 'string') {
+ throw new TypeError('glob pattern string required')
+ }
+
+ if (!options) options = {}
+
+ // shortcut: comments match nothing.
+ if (!options.nocomment && pattern.charAt(0) === '#') {
+ return false
+ }
+
+ // "" only matches ""
+ if (pattern.trim() === '') return p === ''
+
+ return new Minimatch(pattern, options).match(p)
+}
+
+function Minimatch (pattern, options) {
+ if (!(this instanceof Minimatch)) {
+ return new Minimatch(pattern, options)
+ }
+
+ if (typeof pattern !== 'string') {
+ throw new TypeError('glob pattern string required')
+ }
+
+ if (!options) options = {}
+ pattern = pattern.trim()
+
+ // windows support: need to use /, not \
+ if (path.sep !== '/') {
+ pattern = pattern.split(path.sep).join('/')
+ }
+
+ this.options = options
+ this.set = []
+ this.pattern = pattern
+ this.regexp = null
+ this.negate = false
+ this.comment = false
+ this.empty = false
+
+ // make the set of regexps etc.
+ this.make()
+}
+
+Minimatch.prototype.debug = function () {}
+
+Minimatch.prototype.make = make
+function make () {
+ // don't do it more than once.
+ if (this._made) return
+
+ var pattern = this.pattern
+ var options = this.options
+
+ // empty patterns and comments match nothing.
+ if (!options.nocomment && pattern.charAt(0) === '#') {
+ this.comment = true
+ return
+ }
+ if (!pattern) {
+ this.empty = true
+ return
+ }
+
+ // step 1: figure out negation, etc.
+ this.parseNegate()
+
+ // step 2: expand braces
+ var set = this.globSet = this.braceExpand()
+
+ if (options.debug) this.debug = console.error
+
+ this.debug(this.pattern, set)
+
+ // step 3: now we have a set, so turn each one into a series of path-portion
+ // matching patterns.
+ // These will be regexps, except in the case of "**", which is
+ // set to the GLOBSTAR object for globstar behavior,
+ // and will not contain any / characters
+ set = this.globParts = set.map(function (s) {
+ return s.split(slashSplit)
+ })
+
+ this.debug(this.pattern, set)
+
+ // glob --> regexps
+ set = set.map(function (s, si, set) {
+ return s.map(this.parse, this)
+ }, this)
+
+ this.debug(this.pattern, set)
+
+ // filter out everything that didn't compile properly.
+ set = set.filter(function (s) {
+ return s.indexOf(false) === -1
+ })
+
+ this.debug(this.pattern, set)
+
+ this.set = set
+}
+
+Minimatch.prototype.parseNegate = parseNegate
+function parseNegate () {
+ var pattern = this.pattern
+ var negate = false
+ var options = this.options
+ var negateOffset = 0
+
+ if (options.nonegate) return
+
+ for (var i = 0, l = pattern.length
+ ; i < l && pattern.charAt(i) === '!'
+ ; i++) {
+ negate = !negate
+ negateOffset++
+ }
+
+ if (negateOffset) this.pattern = pattern.substr(negateOffset)
+ this.negate = negate
+}
+
+// Brace expansion:
+// a{b,c}d -> abd acd
+// a{b,}c -> abc ac
+// a{0..3}d -> a0d a1d a2d a3d
+// a{b,c{d,e}f}g -> abg acdfg acefg
+// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
+//
+// Invalid sets are not expanded.
+// a{2..}b -> a{2..}b
+// a{b}c -> a{b}c
+minimatch.braceExpand = function (pattern, options) {
+ return braceExpand(pattern, options)
+}
+
+Minimatch.prototype.braceExpand = braceExpand
+
+function braceExpand (pattern, options) {
+ if (!options) {
+ if (this instanceof Minimatch) {
+ options = this.options
+ } else {
+ options = {}
+ }
+ }
+
+ pattern = typeof pattern === 'undefined'
+ ? this.pattern : pattern
+
+ if (typeof pattern === 'undefined') {
+ throw new TypeError('undefined pattern')
+ }
+
+ if (options.nobrace ||
+ !pattern.match(/\{.*\}/)) {
+ // shortcut. no need to expand.
+ return [pattern]
+ }
+
+ return expand(pattern)
+}
+
+// parse a component of the expanded set.
+// At this point, no pattern may contain "/" in it
+// so we're going to return a 2d array, where each entry is the full
+// pattern, split on '/', and then turned into a regular expression.
+// A regexp is made at the end which joins each array with an
+// escaped /, and another full one which joins each regexp with |.
+//
+// Following the lead of Bash 4.1, note that "**" only has special meaning
+// when it is the *only* thing in a path portion. Otherwise, any series
+// of * is equivalent to a single *. Globstar behavior is enabled by
+// default, and can be disabled by setting options.noglobstar.
+Minimatch.prototype.parse = parse
+var SUBPARSE = {}
+function parse (pattern, isSub) {
+ if (pattern.length > 1024 * 64) {
+ throw new TypeError('pattern is too long')
+ }
+
+ var options = this.options
+
+ // shortcuts
+ if (!options.noglobstar && pattern === '**') return GLOBSTAR
+ if (pattern === '') return ''
+
+ var re = ''
+ var hasMagic = !!options.nocase
+ var escaping = false
+ // ? => one single character
+ var patternListStack = []
+ var negativeLists = []
+ var stateChar
+ var inClass = false
+ var reClassStart = -1
+ var classStart = -1
+ // . and .. never match anything that doesn't start with .,
+ // even when options.dot is set.
+ var patternStart = pattern.charAt(0) === '.' ? '' // anything
+ // not (start or / followed by . or .. followed by / or end)
+ : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
+ : '(?!\\.)'
+ var self = this
+
+ function clearStateChar () {
+ if (stateChar) {
+ // we had some state-tracking character
+ // that wasn't consumed by this pass.
+ switch (stateChar) {
+ case '*':
+ re += star
+ hasMagic = true
+ break
+ case '?':
+ re += qmark
+ hasMagic = true
+ break
+ default:
+ re += '\\' + stateChar
+ break
+ }
+ self.debug('clearStateChar %j %j', stateChar, re)
+ stateChar = false
+ }
+ }
+
+ for (var i = 0, len = pattern.length, c
+ ; (i < len) && (c = pattern.charAt(i))
+ ; i++) {
+ this.debug('%s\t%s %s %j', pattern, i, re, c)
+
+ // skip over any that are escaped.
+ if (escaping && reSpecials[c]) {
+ re += '\\' + c
+ escaping = false
+ continue
+ }
+
+ switch (c) {
+ case '/':
+ // completely not allowed, even escaped.
+ // Should already be path-split by now.
+ return false
+
+ case '\\':
+ clearStateChar()
+ escaping = true
+ continue
+
+ // the various stateChar values
+ // for the "extglob" stuff.
+ case '?':
+ case '*':
+ case '+':
+ case '@':
+ case '!':
+ this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
+
+ // all of those are literals inside a class, except that
+ // the glob [!a] means [^a] in regexp
+ if (inClass) {
+ this.debug(' in class')
+ if (c === '!' && i === classStart + 1) c = '^'
+ re += c
+ continue
+ }
+
+ // if we already have a stateChar, then it means
+ // that there was something like ** or +? in there.
+ // Handle the stateChar, then proceed with this one.
+ self.debug('call clearStateChar %j', stateChar)
+ clearStateChar()
+ stateChar = c
+ // if extglob is disabled, then +(asdf|foo) isn't a thing.
+ // just clear the statechar *now*, rather than even diving into
+ // the patternList stuff.
+ if (options.noext) clearStateChar()
+ continue
+
+ case '(':
+ if (inClass) {
+ re += '('
+ continue
+ }
+
+ if (!stateChar) {
+ re += '\\('
+ continue
+ }
+
+ patternListStack.push({
+ type: stateChar,
+ start: i - 1,
+ reStart: re.length,
+ open: plTypes[stateChar].open,
+ close: plTypes[stateChar].close
+ })
+ // negation is (?:(?!js)[^/]*)
+ re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
+ this.debug('plType %j %j', stateChar, re)
+ stateChar = false
+ continue
+
+ case ')':
+ if (inClass || !patternListStack.length) {
+ re += '\\)'
+ continue
+ }
+
+ clearStateChar()
+ hasMagic = true
+ var pl = patternListStack.pop()
+ // negation is (?:(?!js)[^/]*)
+ // The others are (?:)
+ re += pl.close
+ if (pl.type === '!') {
+ negativeLists.push(pl)
+ }
+ pl.reEnd = re.length
+ continue
+
+ case '|':
+ if (inClass || !patternListStack.length || escaping) {
+ re += '\\|'
+ escaping = false
+ continue
+ }
+
+ clearStateChar()
+ re += '|'
+ continue
+
+ // these are mostly the same in regexp and glob
+ case '[':
+ // swallow any state-tracking char before the [
+ clearStateChar()
+
+ if (inClass) {
+ re += '\\' + c
+ continue
+ }
+
+ inClass = true
+ classStart = i
+ reClassStart = re.length
+ re += c
+ continue
+
+ case ']':
+ // a right bracket shall lose its special
+ // meaning and represent itself in
+ // a bracket expression if it occurs
+ // first in the list. -- POSIX.2 2.8.3.2
+ if (i === classStart + 1 || !inClass) {
+ re += '\\' + c
+ escaping = false
+ continue
+ }
+
+ // handle the case where we left a class open.
+ // "[z-a]" is valid, equivalent to "\[z-a\]"
+ if (inClass) {
+ // split where the last [ was, make sure we don't have
+ // an invalid re. if so, re-walk the contents of the
+ // would-be class to re-translate any characters that
+ // were passed through as-is
+ // TODO: It would probably be faster to determine this
+ // without a try/catch and a new RegExp, but it's tricky
+ // to do safely. For now, this is safe and works.
+ var cs = pattern.substring(classStart + 1, i)
+ try {
+ RegExp('[' + cs + ']')
+ } catch (er) {
+ // not a valid class!
+ var sp = this.parse(cs, SUBPARSE)
+ re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
+ hasMagic = hasMagic || sp[1]
+ inClass = false
+ continue
+ }
+ }
+
+ // finish up the class.
+ hasMagic = true
+ inClass = false
+ re += c
+ continue
+
+ default:
+ // swallow any state char that wasn't consumed
+ clearStateChar()
+
+ if (escaping) {
+ // no need
+ escaping = false
+ } else if (reSpecials[c]
+ && !(c === '^' && inClass)) {
+ re += '\\'
+ }
+
+ re += c
+
+ } // switch
+ } // for
+
+ // handle the case where we left a class open.
+ // "[abc" is valid, equivalent to "\[abc"
+ if (inClass) {
+ // split where the last [ was, and escape it
+ // this is a huge pita. We now have to re-walk
+ // the contents of the would-be class to re-translate
+ // any characters that were passed through as-is
+ cs = pattern.substr(classStart + 1)
+ sp = this.parse(cs, SUBPARSE)
+ re = re.substr(0, reClassStart) + '\\[' + sp[0]
+ hasMagic = hasMagic || sp[1]
+ }
+
+ // handle the case where we had a +( thing at the *end*
+ // of the pattern.
+ // each pattern list stack adds 3 chars, and we need to go through
+ // and escape any | chars that were passed through as-is for the regexp.
+ // Go through and escape them, taking care not to double-escape any
+ // | chars that were already escaped.
+ for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
+ var tail = re.slice(pl.reStart + pl.open.length)
+ this.debug('setting tail', re, pl)
+ // maybe some even number of \, then maybe 1 \, followed by a |
+ tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
+ if (!$2) {
+ // the | isn't already escaped, so escape it.
+ $2 = '\\'
+ }
+
+ // need to escape all those slashes *again*, without escaping the
+ // one that we need for escaping the | character. As it works out,
+ // escaping an even number of slashes can be done by simply repeating
+ // it exactly after itself. That's why this trick works.
+ //
+ // I am sorry that you have to see this.
+ return $1 + $1 + $2 + '|'
+ })
+
+ this.debug('tail=%j\n %s', tail, tail, pl, re)
+ var t = pl.type === '*' ? star
+ : pl.type === '?' ? qmark
+ : '\\' + pl.type
+
+ hasMagic = true
+ re = re.slice(0, pl.reStart) + t + '\\(' + tail
+ }
+
+ // handle trailing things that only matter at the very end.
+ clearStateChar()
+ if (escaping) {
+ // trailing \\
+ re += '\\\\'
+ }
+
+ // only need to apply the nodot start if the re starts with
+ // something that could conceivably capture a dot
+ var addPatternStart = false
+ switch (re.charAt(0)) {
+ case '.':
+ case '[':
+ case '(': addPatternStart = true
+ }
+
+ // Hack to work around lack of negative lookbehind in JS
+ // A pattern like: *.!(x).!(y|z) needs to ensure that a name
+ // like 'a.xyz.yz' doesn't match. So, the first negative
+ // lookahead, has to look ALL the way ahead, to the end of
+ // the pattern.
+ for (var n = negativeLists.length - 1; n > -1; n--) {
+ var nl = negativeLists[n]
+
+ var nlBefore = re.slice(0, nl.reStart)
+ var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
+ var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
+ var nlAfter = re.slice(nl.reEnd)
+
+ nlLast += nlAfter
+
+ // Handle nested stuff like *(*.js|!(*.json)), where open parens
+ // mean that we should *not* include the ) in the bit that is considered
+ // "after" the negated section.
+ var openParensBefore = nlBefore.split('(').length - 1
+ var cleanAfter = nlAfter
+ for (i = 0; i < openParensBefore; i++) {
+ cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
+ }
+ nlAfter = cleanAfter
+
+ var dollar = ''
+ if (nlAfter === '' && isSub !== SUBPARSE) {
+ dollar = '$'
+ }
+ var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
+ re = newRe
+ }
+
+ // if the re is not "" at this point, then we need to make sure
+ // it doesn't match against an empty path part.
+ // Otherwise a/* will match a/, which it should not.
+ if (re !== '' && hasMagic) {
+ re = '(?=.)' + re
+ }
+
+ if (addPatternStart) {
+ re = patternStart + re
+ }
+
+ // parsing just a piece of a larger pattern.
+ if (isSub === SUBPARSE) {
+ return [re, hasMagic]
+ }
+
+ // skip the regexp for non-magical patterns
+ // unescape anything in it, though, so that it'll be
+ // an exact match against a file etc.
+ if (!hasMagic) {
+ return globUnescape(pattern)
+ }
+
+ var flags = options.nocase ? 'i' : ''
+ try {
+ var regExp = new RegExp('^' + re + '$', flags)
+ } catch (er) {
+ // If it was an invalid regular expression, then it can't match
+ // anything. This trick looks for a character after the end of
+ // the string, which is of course impossible, except in multi-line
+ // mode, but it's not a /m regex.
+ return new RegExp('$.')
+ }
+
+ regExp._glob = pattern
+ regExp._src = re
+
+ return regExp
+}
+
+minimatch.makeRe = function (pattern, options) {
+ return new Minimatch(pattern, options || {}).makeRe()
+}
+
+Minimatch.prototype.makeRe = makeRe
+function makeRe () {
+ if (this.regexp || this.regexp === false) return this.regexp
+
+ // at this point, this.set is a 2d array of partial
+ // pattern strings, or "**".
+ //
+ // It's better to use .match(). This function shouldn't
+ // be used, really, but it's pretty convenient sometimes,
+ // when you just want to work with a regex.
+ var set = this.set
+
+ if (!set.length) {
+ this.regexp = false
+ return this.regexp
+ }
+ var options = this.options
+
+ var twoStar = options.noglobstar ? star
+ : options.dot ? twoStarDot
+ : twoStarNoDot
+ var flags = options.nocase ? 'i' : ''
+
+ var re = set.map(function (pattern) {
+ return pattern.map(function (p) {
+ return (p === GLOBSTAR) ? twoStar
+ : (typeof p === 'string') ? regExpEscape(p)
+ : p._src
+ }).join('\\\/')
+ }).join('|')
+
+ // must match entire pattern
+ // ending in a * or ** will make it less strict.
+ re = '^(?:' + re + ')$'
+
+ // can match anything, as long as it's not this.
+ if (this.negate) re = '^(?!' + re + ').*$'
+
+ try {
+ this.regexp = new RegExp(re, flags)
+ } catch (ex) {
+ this.regexp = false
+ }
+ return this.regexp
+}
+
+minimatch.match = function (list, pattern, options) {
+ options = options || {}
+ var mm = new Minimatch(pattern, options)
+ list = list.filter(function (f) {
+ return mm.match(f)
+ })
+ if (mm.options.nonull && !list.length) {
+ list.push(pattern)
+ }
+ return list
+}
+
+Minimatch.prototype.match = match
+function match (f, partial) {
+ this.debug('match', f, this.pattern)
+ // short-circuit in the case of busted things.
+ // comments, etc.
+ if (this.comment) return false
+ if (this.empty) return f === ''
+
+ if (f === '/' && partial) return true
+
+ var options = this.options
+
+ // windows: need to use /, not \
+ if (path.sep !== '/') {
+ f = f.split(path.sep).join('/')
+ }
+
+ // treat the test path as a set of pathparts.
+ f = f.split(slashSplit)
+ this.debug(this.pattern, 'split', f)
+
+ // just ONE of the pattern sets in this.set needs to match
+ // in order for it to be valid. If negating, then just one
+ // match means that we have failed.
+ // Either way, return on the first hit.
+
+ var set = this.set
+ this.debug(this.pattern, 'set', set)
+
+ // Find the basename of the path by looking for the last non-empty segment
+ var filename
+ var i
+ for (i = f.length - 1; i >= 0; i--) {
+ filename = f[i]
+ if (filename) break
+ }
+
+ for (i = 0; i < set.length; i++) {
+ var pattern = set[i]
+ var file = f
+ if (options.matchBase && pattern.length === 1) {
+ file = [filename]
+ }
+ var hit = this.matchOne(file, pattern, partial)
+ if (hit) {
+ if (options.flipNegate) return true
+ return !this.negate
+ }
+ }
+
+ // didn't get any hits. this is success if it's a negative
+ // pattern, failure otherwise.
+ if (options.flipNegate) return false
+ return this.negate
+}
+
+// set partial to true to test if, for example,
+// "/a/b" matches the start of "/*/b/*/d"
+// Partial means, if you run out of file before you run
+// out of pattern, then that's fine, as long as all
+// the parts match.
+Minimatch.prototype.matchOne = function (file, pattern, partial) {
+ var options = this.options
+
+ this.debug('matchOne',
+ { 'this': this, file: file, pattern: pattern })
+
+ this.debug('matchOne', file.length, pattern.length)
+
+ for (var fi = 0,
+ pi = 0,
+ fl = file.length,
+ pl = pattern.length
+ ; (fi < fl) && (pi < pl)
+ ; fi++, pi++) {
+ this.debug('matchOne loop')
+ var p = pattern[pi]
+ var f = file[fi]
+
+ this.debug(pattern, p, f)
+
+ // should be impossible.
+ // some invalid regexp stuff in the set.
+ if (p === false) return false
+
+ if (p === GLOBSTAR) {
+ this.debug('GLOBSTAR', [pattern, p, f])
+
+ // "**"
+ // a/**/b/**/c would match the following:
+ // a/b/x/y/z/c
+ // a/x/y/z/b/c
+ // a/b/x/b/x/c
+ // a/b/c
+ // To do this, take the rest of the pattern after
+ // the **, and see if it would match the file remainder.
+ // If so, return success.
+ // If not, the ** "swallows" a segment, and try again.
+ // This is recursively awful.
+ //
+ // a/**/b/**/c matching a/b/x/y/z/c
+ // - a matches a
+ // - doublestar
+ // - matchOne(b/x/y/z/c, b/**/c)
+ // - b matches b
+ // - doublestar
+ // - matchOne(x/y/z/c, c) -> no
+ // - matchOne(y/z/c, c) -> no
+ // - matchOne(z/c, c) -> no
+ // - matchOne(c, c) yes, hit
+ var fr = fi
+ var pr = pi + 1
+ if (pr === pl) {
+ this.debug('** at the end')
+ // a ** at the end will just swallow the rest.
+ // We have found a match.
+ // however, it will not swallow /.x, unless
+ // options.dot is set.
+ // . and .. are *never* matched by **, for explosively
+ // exponential reasons.
+ for (; fi < fl; fi++) {
+ if (file[fi] === '.' || file[fi] === '..' ||
+ (!options.dot && file[fi].charAt(0) === '.')) return false
+ }
+ return true
+ }
+
+ // ok, let's see if we can swallow whatever we can.
+ while (fr < fl) {
+ var swallowee = file[fr]
+
+ this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
+
+ // XXX remove this slice. Just pass the start index.
+ if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+ this.debug('globstar found match!', fr, fl, swallowee)
+ // found a match.
+ return true
+ } else {
+ // can't swallow "." or ".." ever.
+ // can only swallow ".foo" when explicitly asked.
+ if (swallowee === '.' || swallowee === '..' ||
+ (!options.dot && swallowee.charAt(0) === '.')) {
+ this.debug('dot detected!', file, fr, pattern, pr)
+ break
+ }
+
+ // ** swallows a segment, and continue.
+ this.debug('globstar swallow a segment, and continue')
+ fr++
+ }
+ }
+
+ // no match was found.
+ // However, in partial mode, we can't say this is necessarily over.
+ // If there's more *pattern* left, then
+ if (partial) {
+ // ran out of file
+ this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
+ if (fr === fl) return true
+ }
+ return false
+ }
+
+ // something other than **
+ // non-magic patterns just have to match exactly
+ // patterns with magic have been turned into regexps.
+ var hit
+ if (typeof p === 'string') {
+ if (options.nocase) {
+ hit = f.toLowerCase() === p.toLowerCase()
+ } else {
+ hit = f === p
+ }
+ this.debug('string match', p, f, hit)
+ } else {
+ hit = f.match(p)
+ this.debug('pattern match', p, f, hit)
+ }
+
+ if (!hit) return false
+ }
+
+ // Note: ending in / means that we'll get a final ""
+ // at the end of the pattern. This can only match a
+ // corresponding "" at the end of the file.
+ // If the file ends in /, then it can only match a
+ // a pattern that ends in /, unless the pattern just
+ // doesn't have any more for it. But, a/b/ should *not*
+ // match "a/b/*", even though "" matches against the
+ // [^/]*? pattern, except in partial mode, where it might
+ // simply not be reached yet.
+ // However, a/b/ should still satisfy a/*
+
+ // now either we fell off the end of the pattern, or we're done.
+ if (fi === fl && pi === pl) {
+ // ran out of pattern and filename at the same time.
+ // an exact hit!
+ return true
+ } else if (fi === fl) {
+ // ran out of file, but still had pattern left.
+ // this is ok if we're doing the match as part of
+ // a glob fs traversal.
+ return partial
+ } else if (pi === pl) {
+ // ran out of pattern, still have file left.
+ // this is only acceptable if we're on the very last
+ // empty segment of a file with a trailing slash.
+ // a/* should match a/b/
+ var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
+ return emptyFileEnd
+ }
+
+ // should be unreachable.
+ throw new Error('wtf?')
+}
+
+// replace stuff like \* with *
+function globUnescape (s) {
+ return s.replace(/\\(.)/g, '$1')
+}
+
+function regExpEscape (s) {
+ return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
+}
diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json
new file mode 100644
index 0000000..9bc3f6f
--- /dev/null
+++ b/node_modules/minimatch/package.json
@@ -0,0 +1,97 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "minimatch@^3.0.2",
+ "scope": null,
+ "escapedName": "minimatch",
+ "name": "minimatch",
+ "rawSpec": "^3.0.2",
+ "spec": ">=3.0.2 <4.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob"
+ ]
+ ],
+ "_from": "minimatch@>=3.0.2 <4.0.0",
+ "_id": "minimatch@3.0.3",
+ "_inCache": true,
+ "_location": "/minimatch",
+ "_nodeVersion": "4.4.4",
+ "_npmOperationalInternal": {
+ "host": "packages-12-west.internal.npmjs.com",
+ "tmp": "tmp/minimatch-3.0.3.tgz_1470678322731_0.1892083385027945"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_npmVersion": "3.10.6",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "minimatch@^3.0.2",
+ "scope": null,
+ "escapedName": "minimatch",
+ "name": "minimatch",
+ "rawSpec": "^3.0.2",
+ "spec": ">=3.0.2 <4.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "_shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774",
+ "_shrinkwrap": null,
+ "_spec": "minimatch@^3.0.2",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/minimatch/issues"
+ },
+ "dependencies": {
+ "brace-expansion": "^1.0.0"
+ },
+ "description": "a glob matcher in javascript",
+ "devDependencies": {
+ "standard": "^3.7.2",
+ "tap": "^5.6.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774",
+ "tarball": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "files": [
+ "minimatch.js"
+ ],
+ "gitHead": "eed89491bd4a4e6bc463aac0dfb5c29ef0d1dc13",
+ "homepage": "https://github.com/isaacs/minimatch#readme",
+ "license": "ISC",
+ "main": "minimatch.js",
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "name": "minimatch",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/minimatch.git"
+ },
+ "scripts": {
+ "posttest": "standard minimatch.js test/*.js",
+ "test": "tap test/*.js"
+ },
+ "version": "3.0.3"
+}
diff --git a/node_modules/minimist/.travis.yml b/node_modules/minimist/.travis.yml
new file mode 100644
index 0000000..74c57bf
--- /dev/null
+++ b/node_modules/minimist/.travis.yml
@@ -0,0 +1,8 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
+ - "0.12"
+ - "iojs"
+before_install:
+ - npm install -g npm@~1.4.6
diff --git a/node_modules/minimist/LICENSE b/node_modules/minimist/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/minimist/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/minimist/example/parse.js b/node_modules/minimist/example/parse.js
new file mode 100644
index 0000000..abff3e8
--- /dev/null
+++ b/node_modules/minimist/example/parse.js
@@ -0,0 +1,2 @@
+var argv = require('../')(process.argv.slice(2));
+console.dir(argv);
diff --git a/node_modules/minimist/index.js b/node_modules/minimist/index.js
new file mode 100644
index 0000000..6a0559d
--- /dev/null
+++ b/node_modules/minimist/index.js
@@ -0,0 +1,236 @@
+module.exports = function (args, opts) {
+ if (!opts) opts = {};
+
+ var flags = { bools : {}, strings : {}, unknownFn: null };
+
+ if (typeof opts['unknown'] === 'function') {
+ flags.unknownFn = opts['unknown'];
+ }
+
+ if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
+ flags.allBools = true;
+ } else {
+ [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
+ flags.bools[key] = true;
+ });
+ }
+
+ var aliases = {};
+ Object.keys(opts.alias || {}).forEach(function (key) {
+ aliases[key] = [].concat(opts.alias[key]);
+ aliases[key].forEach(function (x) {
+ aliases[x] = [key].concat(aliases[key].filter(function (y) {
+ return x !== y;
+ }));
+ });
+ });
+
+ [].concat(opts.string).filter(Boolean).forEach(function (key) {
+ flags.strings[key] = true;
+ if (aliases[key]) {
+ flags.strings[aliases[key]] = true;
+ }
+ });
+
+ var defaults = opts['default'] || {};
+
+ var argv = { _ : [] };
+ Object.keys(flags.bools).forEach(function (key) {
+ setArg(key, defaults[key] === undefined ? false : defaults[key]);
+ });
+
+ var notFlags = [];
+
+ if (args.indexOf('--') !== -1) {
+ notFlags = args.slice(args.indexOf('--')+1);
+ args = args.slice(0, args.indexOf('--'));
+ }
+
+ function argDefined(key, arg) {
+ return (flags.allBools && /^--[^=]+$/.test(arg)) ||
+ flags.strings[key] || flags.bools[key] || aliases[key];
+ }
+
+ function setArg (key, val, arg) {
+ if (arg && flags.unknownFn && !argDefined(key, arg)) {
+ if (flags.unknownFn(arg) === false) return;
+ }
+
+ var value = !flags.strings[key] && isNumber(val)
+ ? Number(val) : val
+ ;
+ setKey(argv, key.split('.'), value);
+
+ (aliases[key] || []).forEach(function (x) {
+ setKey(argv, x.split('.'), value);
+ });
+ }
+
+ function setKey (obj, keys, value) {
+ var o = obj;
+ keys.slice(0,-1).forEach(function (key) {
+ if (o[key] === undefined) o[key] = {};
+ o = o[key];
+ });
+
+ var key = keys[keys.length - 1];
+ if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
+ o[key] = value;
+ }
+ else if (Array.isArray(o[key])) {
+ o[key].push(value);
+ }
+ else {
+ o[key] = [ o[key], value ];
+ }
+ }
+
+ function aliasIsBoolean(key) {
+ return aliases[key].some(function (x) {
+ return flags.bools[x];
+ });
+ }
+
+ for (var i = 0; i < args.length; i++) {
+ var arg = args[i];
+
+ if (/^--.+=/.test(arg)) {
+ // Using [\s\S] instead of . because js doesn't support the
+ // 'dotall' regex modifier. See:
+ // http://stackoverflow.com/a/1068308/13216
+ var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
+ var key = m[1];
+ var value = m[2];
+ if (flags.bools[key]) {
+ value = value !== 'false';
+ }
+ setArg(key, value, arg);
+ }
+ else if (/^--no-.+/.test(arg)) {
+ var key = arg.match(/^--no-(.+)/)[1];
+ setArg(key, false, arg);
+ }
+ else if (/^--.+/.test(arg)) {
+ var key = arg.match(/^--(.+)/)[1];
+ var next = args[i + 1];
+ if (next !== undefined && !/^-/.test(next)
+ && !flags.bools[key]
+ && !flags.allBools
+ && (aliases[key] ? !aliasIsBoolean(key) : true)) {
+ setArg(key, next, arg);
+ i++;
+ }
+ else if (/^(true|false)$/.test(next)) {
+ setArg(key, next === 'true', arg);
+ i++;
+ }
+ else {
+ setArg(key, flags.strings[key] ? '' : true, arg);
+ }
+ }
+ else if (/^-[^-]+/.test(arg)) {
+ var letters = arg.slice(1,-1).split('');
+
+ var broken = false;
+ for (var j = 0; j < letters.length; j++) {
+ var next = arg.slice(j+2);
+
+ if (next === '-') {
+ setArg(letters[j], next, arg)
+ continue;
+ }
+
+ if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
+ setArg(letters[j], next.split('=')[1], arg);
+ broken = true;
+ break;
+ }
+
+ if (/[A-Za-z]/.test(letters[j])
+ && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+ setArg(letters[j], next, arg);
+ broken = true;
+ break;
+ }
+
+ if (letters[j+1] && letters[j+1].match(/\W/)) {
+ setArg(letters[j], arg.slice(j+2), arg);
+ broken = true;
+ break;
+ }
+ else {
+ setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
+ }
+ }
+
+ var key = arg.slice(-1)[0];
+ if (!broken && key !== '-') {
+ if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
+ && !flags.bools[key]
+ && (aliases[key] ? !aliasIsBoolean(key) : true)) {
+ setArg(key, args[i+1], arg);
+ i++;
+ }
+ else if (args[i+1] && /true|false/.test(args[i+1])) {
+ setArg(key, args[i+1] === 'true', arg);
+ i++;
+ }
+ else {
+ setArg(key, flags.strings[key] ? '' : true, arg);
+ }
+ }
+ }
+ else {
+ if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
+ argv._.push(
+ flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
+ );
+ }
+ if (opts.stopEarly) {
+ argv._.push.apply(argv._, args.slice(i + 1));
+ break;
+ }
+ }
+ }
+
+ Object.keys(defaults).forEach(function (key) {
+ if (!hasKey(argv, key.split('.'))) {
+ setKey(argv, key.split('.'), defaults[key]);
+
+ (aliases[key] || []).forEach(function (x) {
+ setKey(argv, x.split('.'), defaults[key]);
+ });
+ }
+ });
+
+ if (opts['--']) {
+ argv['--'] = new Array();
+ notFlags.forEach(function(key) {
+ argv['--'].push(key);
+ });
+ }
+ else {
+ notFlags.forEach(function(key) {
+ argv._.push(key);
+ });
+ }
+
+ return argv;
+};
+
+function hasKey (obj, keys) {
+ var o = obj;
+ keys.slice(0,-1).forEach(function (key) {
+ o = (o[key] || {});
+ });
+
+ var key = keys[keys.length - 1];
+ return key in o;
+}
+
+function isNumber (x) {
+ if (typeof x === 'number') return true;
+ if (/^0x[0-9a-f]+$/i.test(x)) return true;
+ return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
+}
+
diff --git a/node_modules/minimist/package.json b/node_modules/minimist/package.json
new file mode 100644
index 0000000..32e9042
--- /dev/null
+++ b/node_modules/minimist/package.json
@@ -0,0 +1,105 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "minimist@~1.2.0",
+ "scope": null,
+ "escapedName": "minimist",
+ "name": "minimist",
+ "rawSpec": "~1.2.0",
+ "spec": ">=1.2.0 <1.3.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "minimist@>=1.2.0 <1.3.0",
+ "_id": "minimist@1.2.0",
+ "_inCache": true,
+ "_location": "/minimist",
+ "_nodeVersion": "2.4.0",
+ "_npmUser": {
+ "name": "substack",
+ "email": "substack@gmail.com"
+ },
+ "_npmVersion": "3.2.2",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "minimist@~1.2.0",
+ "scope": null,
+ "escapedName": "minimist",
+ "name": "minimist",
+ "rawSpec": "~1.2.0",
+ "spec": ">=1.2.0 <1.3.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "_shasum": "a35008b20f41383eec1fb914f4cd5df79a264284",
+ "_shrinkwrap": null,
+ "_spec": "minimist@~1.2.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/minimist/issues"
+ },
+ "dependencies": {},
+ "description": "parse argument options",
+ "devDependencies": {
+ "covert": "^1.0.0",
+ "tap": "~0.4.0",
+ "tape": "^3.5.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "a35008b20f41383eec1fb914f4cd5df79a264284",
+ "tarball": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"
+ },
+ "gitHead": "dc624482fcfec5bc669c68cdb861f00573ed4e64",
+ "homepage": "https://github.com/substack/minimist",
+ "keywords": [
+ "argv",
+ "getopt",
+ "parser",
+ "optimist"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "name": "minimist",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/minimist.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "test": "tap test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/6..latest",
+ "ff/5",
+ "firefox/latest",
+ "chrome/10",
+ "chrome/latest",
+ "safari/5.1",
+ "safari/latest",
+ "opera/12"
+ ]
+ },
+ "version": "1.2.0"
+}
diff --git a/node_modules/minimist/readme.markdown b/node_modules/minimist/readme.markdown
new file mode 100644
index 0000000..30a74cf
--- /dev/null
+++ b/node_modules/minimist/readme.markdown
@@ -0,0 +1,91 @@
+# minimist
+
+parse argument options
+
+This module is the guts of optimist's argument parser without all the
+fanciful decoration.
+
+[](http://ci.testling.com/substack/minimist)
+
+[](http://travis-ci.org/substack/minimist)
+
+# example
+
+``` js
+var argv = require('minimist')(process.argv.slice(2));
+console.dir(argv);
+```
+
+```
+$ node example/parse.js -a beep -b boop
+{ _: [], a: 'beep', b: 'boop' }
+```
+
+```
+$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
+{ _: [ 'foo', 'bar', 'baz' ],
+ x: 3,
+ y: 4,
+ n: 5,
+ a: true,
+ b: true,
+ c: true,
+ beep: 'boop' }
+```
+
+# methods
+
+``` js
+var parseArgs = require('minimist')
+```
+
+## var argv = parseArgs(args, opts={})
+
+Return an argument object `argv` populated with the array arguments from `args`.
+
+`argv._` contains all the arguments that didn't have an option associated with
+them.
+
+Numeric-looking arguments will be returned as numbers unless `opts.string` or
+`opts.boolean` is set for that argument name.
+
+Any arguments after `'--'` will not be parsed and will end up in `argv._`.
+
+options can be:
+
+* `opts.string` - a string or array of strings argument names to always treat as
+strings
+* `opts.boolean` - a boolean, string or array of strings to always treat as
+booleans. if `true` will treat all double hyphenated arguments without equal signs
+as boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`)
+* `opts.alias` - an object mapping string names to strings or arrays of string
+argument names to use as aliases
+* `opts.default` - an object mapping string argument names to default values
+* `opts.stopEarly` - when true, populate `argv._` with everything after the
+first non-option
+* `opts['--']` - when true, populate `argv._` with everything before the `--`
+and `argv['--']` with everything after the `--`. Here's an example:
+* `opts.unknown` - a function which is invoked with a command line parameter not
+defined in the `opts` configuration object. If the function returns `false`, the
+unknown option is not added to `argv`.
+
+```
+> require('./')('one two three -- four five --six'.split(' '), { '--': true })
+{ _: [ 'one', 'two', 'three' ],
+ '--': [ 'four', 'five', '--six' ] }
+```
+
+Note that with `opts['--']` set, parsing for arguments still stops after the
+`--`.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install minimist
+```
+
+# license
+
+MIT
diff --git a/node_modules/minimist/test/all_bool.js b/node_modules/minimist/test/all_bool.js
new file mode 100644
index 0000000..ac83548
--- /dev/null
+++ b/node_modules/minimist/test/all_bool.js
@@ -0,0 +1,32 @@
+var parse = require('../');
+var test = require('tape');
+
+test('flag boolean true (default all --args to boolean)', function (t) {
+ var argv = parse(['moo', '--honk', 'cow'], {
+ boolean: true
+ });
+
+ t.deepEqual(argv, {
+ honk: true,
+ _: ['moo', 'cow']
+ });
+
+ t.deepEqual(typeof argv.honk, 'boolean');
+ t.end();
+});
+
+test('flag boolean true only affects double hyphen arguments without equals signs', function (t) {
+ var argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], {
+ boolean: true
+ });
+
+ t.deepEqual(argv, {
+ honk: true,
+ tacos: 'good',
+ p: 55,
+ _: ['moo', 'cow']
+ });
+
+ t.deepEqual(typeof argv.honk, 'boolean');
+ t.end();
+});
diff --git a/node_modules/minimist/test/bool.js b/node_modules/minimist/test/bool.js
new file mode 100644
index 0000000..14b0717
--- /dev/null
+++ b/node_modules/minimist/test/bool.js
@@ -0,0 +1,166 @@
+var parse = require('../');
+var test = require('tape');
+
+test('flag boolean default false', function (t) {
+ var argv = parse(['moo'], {
+ boolean: ['t', 'verbose'],
+ default: { verbose: false, t: false }
+ });
+
+ t.deepEqual(argv, {
+ verbose: false,
+ t: false,
+ _: ['moo']
+ });
+
+ t.deepEqual(typeof argv.verbose, 'boolean');
+ t.deepEqual(typeof argv.t, 'boolean');
+ t.end();
+
+});
+
+test('boolean groups', function (t) {
+ var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
+ boolean: ['x','y','z']
+ });
+
+ t.deepEqual(argv, {
+ x : true,
+ y : false,
+ z : true,
+ _ : [ 'one', 'two', 'three' ]
+ });
+
+ t.deepEqual(typeof argv.x, 'boolean');
+ t.deepEqual(typeof argv.y, 'boolean');
+ t.deepEqual(typeof argv.z, 'boolean');
+ t.end();
+});
+test('boolean and alias with chainable api', function (t) {
+ var aliased = [ '-h', 'derp' ];
+ var regular = [ '--herp', 'derp' ];
+ var opts = {
+ herp: { alias: 'h', boolean: true }
+ };
+ var aliasedArgv = parse(aliased, {
+ boolean: 'herp',
+ alias: { h: 'herp' }
+ });
+ var propertyArgv = parse(regular, {
+ boolean: 'herp',
+ alias: { h: 'herp' }
+ });
+ var expected = {
+ herp: true,
+ h: true,
+ '_': [ 'derp' ]
+ };
+
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+ t.end();
+});
+
+test('boolean and alias with options hash', function (t) {
+ var aliased = [ '-h', 'derp' ];
+ var regular = [ '--herp', 'derp' ];
+ var opts = {
+ alias: { 'h': 'herp' },
+ boolean: 'herp'
+ };
+ var aliasedArgv = parse(aliased, opts);
+ var propertyArgv = parse(regular, opts);
+ var expected = {
+ herp: true,
+ h: true,
+ '_': [ 'derp' ]
+ };
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+ t.end();
+});
+
+test('boolean and alias array with options hash', function (t) {
+ var aliased = [ '-h', 'derp' ];
+ var regular = [ '--herp', 'derp' ];
+ var alt = [ '--harp', 'derp' ];
+ var opts = {
+ alias: { 'h': ['herp', 'harp'] },
+ boolean: 'h'
+ };
+ var aliasedArgv = parse(aliased, opts);
+ var propertyArgv = parse(regular, opts);
+ var altPropertyArgv = parse(alt, opts);
+ var expected = {
+ harp: true,
+ herp: true,
+ h: true,
+ '_': [ 'derp' ]
+ };
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+ t.same(altPropertyArgv, expected);
+ t.end();
+});
+
+test('boolean and alias using explicit true', function (t) {
+ var aliased = [ '-h', 'true' ];
+ var regular = [ '--herp', 'true' ];
+ var opts = {
+ alias: { h: 'herp' },
+ boolean: 'h'
+ };
+ var aliasedArgv = parse(aliased, opts);
+ var propertyArgv = parse(regular, opts);
+ var expected = {
+ herp: true,
+ h: true,
+ '_': [ ]
+ };
+
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+ t.end();
+});
+
+// regression, see https://github.com/substack/node-optimist/issues/71
+test('boolean and --x=true', function(t) {
+ var parsed = parse(['--boool', '--other=true'], {
+ boolean: 'boool'
+ });
+
+ t.same(parsed.boool, true);
+ t.same(parsed.other, 'true');
+
+ parsed = parse(['--boool', '--other=false'], {
+ boolean: 'boool'
+ });
+
+ t.same(parsed.boool, true);
+ t.same(parsed.other, 'false');
+ t.end();
+});
+
+test('boolean --boool=true', function (t) {
+ var parsed = parse(['--boool=true'], {
+ default: {
+ boool: false
+ },
+ boolean: ['boool']
+ });
+
+ t.same(parsed.boool, true);
+ t.end();
+});
+
+test('boolean --boool=false', function (t) {
+ var parsed = parse(['--boool=false'], {
+ default: {
+ boool: true
+ },
+ boolean: ['boool']
+ });
+
+ t.same(parsed.boool, false);
+ t.end();
+});
diff --git a/node_modules/minimist/test/dash.js b/node_modules/minimist/test/dash.js
new file mode 100644
index 0000000..5a4fa5b
--- /dev/null
+++ b/node_modules/minimist/test/dash.js
@@ -0,0 +1,31 @@
+var parse = require('../');
+var test = require('tape');
+
+test('-', function (t) {
+ t.plan(5);
+ t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] });
+ t.deepEqual(parse([ '-' ]), { _: [ '-' ] });
+ t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] });
+ t.deepEqual(
+ parse([ '-b', '-' ], { boolean: 'b' }),
+ { b: true, _: [ '-' ] }
+ );
+ t.deepEqual(
+ parse([ '-s', '-' ], { string: 's' }),
+ { s: '-', _: [] }
+ );
+});
+
+test('-a -- b', function (t) {
+ t.plan(3);
+ t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+ t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+ t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+});
+
+test('move arguments after the -- into their own `--` array', function(t) {
+ t.plan(1);
+ t.deepEqual(
+ parse([ '--name', 'John', 'before', '--', 'after' ], { '--': true }),
+ { name: 'John', _: [ 'before' ], '--': [ 'after' ] });
+});
diff --git a/node_modules/minimist/test/default_bool.js b/node_modules/minimist/test/default_bool.js
new file mode 100644
index 0000000..780a311
--- /dev/null
+++ b/node_modules/minimist/test/default_bool.js
@@ -0,0 +1,35 @@
+var test = require('tape');
+var parse = require('../');
+
+test('boolean default true', function (t) {
+ var argv = parse([], {
+ boolean: 'sometrue',
+ default: { sometrue: true }
+ });
+ t.equal(argv.sometrue, true);
+ t.end();
+});
+
+test('boolean default false', function (t) {
+ var argv = parse([], {
+ boolean: 'somefalse',
+ default: { somefalse: false }
+ });
+ t.equal(argv.somefalse, false);
+ t.end();
+});
+
+test('boolean default to null', function (t) {
+ var argv = parse([], {
+ boolean: 'maybe',
+ default: { maybe: null }
+ });
+ t.equal(argv.maybe, null);
+ var argv = parse(['--maybe'], {
+ boolean: 'maybe',
+ default: { maybe: null }
+ });
+ t.equal(argv.maybe, true);
+ t.end();
+
+})
diff --git a/node_modules/minimist/test/dotted.js b/node_modules/minimist/test/dotted.js
new file mode 100644
index 0000000..d8b3e85
--- /dev/null
+++ b/node_modules/minimist/test/dotted.js
@@ -0,0 +1,22 @@
+var parse = require('../');
+var test = require('tape');
+
+test('dotted alias', function (t) {
+ var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+ t.equal(argv.a.b, 22);
+ t.equal(argv.aa.bb, 22);
+ t.end();
+});
+
+test('dotted default', function (t) {
+ var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+ t.equal(argv.a.b, 11);
+ t.equal(argv.aa.bb, 11);
+ t.end();
+});
+
+test('dotted default with no alias', function (t) {
+ var argv = parse('', {default: {'a.b': 11}});
+ t.equal(argv.a.b, 11);
+ t.end();
+});
diff --git a/node_modules/minimist/test/kv_short.js b/node_modules/minimist/test/kv_short.js
new file mode 100644
index 0000000..f813b30
--- /dev/null
+++ b/node_modules/minimist/test/kv_short.js
@@ -0,0 +1,16 @@
+var parse = require('../');
+var test = require('tape');
+
+test('short -k=v' , function (t) {
+ t.plan(1);
+
+ var argv = parse([ '-b=123' ]);
+ t.deepEqual(argv, { b: 123, _: [] });
+});
+
+test('multi short -k=v' , function (t) {
+ t.plan(1);
+
+ var argv = parse([ '-a=whatever', '-b=robots' ]);
+ t.deepEqual(argv, { a: 'whatever', b: 'robots', _: [] });
+});
diff --git a/node_modules/minimist/test/long.js b/node_modules/minimist/test/long.js
new file mode 100644
index 0000000..5d3a1e0
--- /dev/null
+++ b/node_modules/minimist/test/long.js
@@ -0,0 +1,31 @@
+var test = require('tape');
+var parse = require('../');
+
+test('long opts', function (t) {
+ t.deepEqual(
+ parse([ '--bool' ]),
+ { bool : true, _ : [] },
+ 'long boolean'
+ );
+ t.deepEqual(
+ parse([ '--pow', 'xixxle' ]),
+ { pow : 'xixxle', _ : [] },
+ 'long capture sp'
+ );
+ t.deepEqual(
+ parse([ '--pow=xixxle' ]),
+ { pow : 'xixxle', _ : [] },
+ 'long capture eq'
+ );
+ t.deepEqual(
+ parse([ '--host', 'localhost', '--port', '555' ]),
+ { host : 'localhost', port : 555, _ : [] },
+ 'long captures sp'
+ );
+ t.deepEqual(
+ parse([ '--host=localhost', '--port=555' ]),
+ { host : 'localhost', port : 555, _ : [] },
+ 'long captures eq'
+ );
+ t.end();
+});
diff --git a/node_modules/minimist/test/num.js b/node_modules/minimist/test/num.js
new file mode 100644
index 0000000..2cc77f4
--- /dev/null
+++ b/node_modules/minimist/test/num.js
@@ -0,0 +1,36 @@
+var parse = require('../');
+var test = require('tape');
+
+test('nums', function (t) {
+ var argv = parse([
+ '-x', '1234',
+ '-y', '5.67',
+ '-z', '1e7',
+ '-w', '10f',
+ '--hex', '0xdeadbeef',
+ '789'
+ ]);
+ t.deepEqual(argv, {
+ x : 1234,
+ y : 5.67,
+ z : 1e7,
+ w : '10f',
+ hex : 0xdeadbeef,
+ _ : [ 789 ]
+ });
+ t.deepEqual(typeof argv.x, 'number');
+ t.deepEqual(typeof argv.y, 'number');
+ t.deepEqual(typeof argv.z, 'number');
+ t.deepEqual(typeof argv.w, 'string');
+ t.deepEqual(typeof argv.hex, 'number');
+ t.deepEqual(typeof argv._[0], 'number');
+ t.end();
+});
+
+test('already a number', function (t) {
+ var argv = parse([ '-x', 1234, 789 ]);
+ t.deepEqual(argv, { x : 1234, _ : [ 789 ] });
+ t.deepEqual(typeof argv.x, 'number');
+ t.deepEqual(typeof argv._[0], 'number');
+ t.end();
+});
diff --git a/node_modules/minimist/test/parse.js b/node_modules/minimist/test/parse.js
new file mode 100644
index 0000000..7b4a2a1
--- /dev/null
+++ b/node_modules/minimist/test/parse.js
@@ -0,0 +1,197 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse args', function (t) {
+ t.deepEqual(
+ parse([ '--no-moo' ]),
+ { moo : false, _ : [] },
+ 'no'
+ );
+ t.deepEqual(
+ parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
+ { v : ['a','b','c'], _ : [] },
+ 'multi'
+ );
+ t.end();
+});
+
+test('comprehensive', function (t) {
+ t.deepEqual(
+ parse([
+ '--name=meowmers', 'bare', '-cats', 'woo',
+ '-h', 'awesome', '--multi=quux',
+ '--key', 'value',
+ '-b', '--bool', '--no-meep', '--multi=baz',
+ '--', '--not-a-flag', 'eek'
+ ]),
+ {
+ c : true,
+ a : true,
+ t : true,
+ s : 'woo',
+ h : 'awesome',
+ b : true,
+ bool : true,
+ key : 'value',
+ multi : [ 'quux', 'baz' ],
+ meep : false,
+ name : 'meowmers',
+ _ : [ 'bare', '--not-a-flag', 'eek' ]
+ }
+ );
+ t.end();
+});
+
+test('flag boolean', function (t) {
+ var argv = parse([ '-t', 'moo' ], { boolean: 't' });
+ t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
+ t.deepEqual(typeof argv.t, 'boolean');
+ t.end();
+});
+
+test('flag boolean value', function (t) {
+ var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
+ boolean: [ 't', 'verbose' ],
+ default: { verbose: true }
+ });
+
+ t.deepEqual(argv, {
+ verbose: false,
+ t: true,
+ _: ['moo']
+ });
+
+ t.deepEqual(typeof argv.verbose, 'boolean');
+ t.deepEqual(typeof argv.t, 'boolean');
+ t.end();
+});
+
+test('newlines in params' , function (t) {
+ var args = parse([ '-s', "X\nX" ])
+ t.deepEqual(args, { _ : [], s : "X\nX" });
+
+ // reproduce in bash:
+ // VALUE="new
+ // line"
+ // node program.js --s="$VALUE"
+ args = parse([ "--s=X\nX" ])
+ t.deepEqual(args, { _ : [], s : "X\nX" });
+ t.end();
+});
+
+test('strings' , function (t) {
+ var s = parse([ '-s', '0001234' ], { string: 's' }).s;
+ t.equal(s, '0001234');
+ t.equal(typeof s, 'string');
+
+ var x = parse([ '-x', '56' ], { string: 'x' }).x;
+ t.equal(x, '56');
+ t.equal(typeof x, 'string');
+ t.end();
+});
+
+test('stringArgs', function (t) {
+ var s = parse([ ' ', ' ' ], { string: '_' })._;
+ t.same(s.length, 2);
+ t.same(typeof s[0], 'string');
+ t.same(s[0], ' ');
+ t.same(typeof s[1], 'string');
+ t.same(s[1], ' ');
+ t.end();
+});
+
+test('empty strings', function(t) {
+ var s = parse([ '-s' ], { string: 's' }).s;
+ t.equal(s, '');
+ t.equal(typeof s, 'string');
+
+ var str = parse([ '--str' ], { string: 'str' }).str;
+ t.equal(str, '');
+ t.equal(typeof str, 'string');
+
+ var letters = parse([ '-art' ], {
+ string: [ 'a', 't' ]
+ });
+
+ t.equal(letters.a, '');
+ t.equal(letters.r, true);
+ t.equal(letters.t, '');
+
+ t.end();
+});
+
+
+test('string and alias', function(t) {
+ var x = parse([ '--str', '000123' ], {
+ string: 's',
+ alias: { s: 'str' }
+ });
+
+ t.equal(x.str, '000123');
+ t.equal(typeof x.str, 'string');
+ t.equal(x.s, '000123');
+ t.equal(typeof x.s, 'string');
+
+ var y = parse([ '-s', '000123' ], {
+ string: 'str',
+ alias: { str: 's' }
+ });
+
+ t.equal(y.str, '000123');
+ t.equal(typeof y.str, 'string');
+ t.equal(y.s, '000123');
+ t.equal(typeof y.s, 'string');
+ t.end();
+});
+
+test('slashBreak', function (t) {
+ t.same(
+ parse([ '-I/foo/bar/baz' ]),
+ { I : '/foo/bar/baz', _ : [] }
+ );
+ t.same(
+ parse([ '-xyz/foo/bar/baz' ]),
+ { x : true, y : true, z : '/foo/bar/baz', _ : [] }
+ );
+ t.end();
+});
+
+test('alias', function (t) {
+ var argv = parse([ '-f', '11', '--zoom', '55' ], {
+ alias: { z: 'zoom' }
+ });
+ t.equal(argv.zoom, 55);
+ t.equal(argv.z, argv.zoom);
+ t.equal(argv.f, 11);
+ t.end();
+});
+
+test('multiAlias', function (t) {
+ var argv = parse([ '-f', '11', '--zoom', '55' ], {
+ alias: { z: [ 'zm', 'zoom' ] }
+ });
+ t.equal(argv.zoom, 55);
+ t.equal(argv.z, argv.zoom);
+ t.equal(argv.z, argv.zm);
+ t.equal(argv.f, 11);
+ t.end();
+});
+
+test('nested dotted objects', function (t) {
+ var argv = parse([
+ '--foo.bar', '3', '--foo.baz', '4',
+ '--foo.quux.quibble', '5', '--foo.quux.o_O',
+ '--beep.boop'
+ ]);
+
+ t.same(argv.foo, {
+ bar : 3,
+ baz : 4,
+ quux : {
+ quibble : 5,
+ o_O : true
+ }
+ });
+ t.same(argv.beep, { boop : true });
+ t.end();
+});
diff --git a/node_modules/minimist/test/parse_modified.js b/node_modules/minimist/test/parse_modified.js
new file mode 100644
index 0000000..ab620dc
--- /dev/null
+++ b/node_modules/minimist/test/parse_modified.js
@@ -0,0 +1,9 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse with modifier functions' , function (t) {
+ t.plan(1);
+
+ var argv = parse([ '-b', '123' ], { boolean: 'b' });
+ t.deepEqual(argv, { b: true, _: [123] });
+});
diff --git a/node_modules/minimist/test/short.js b/node_modules/minimist/test/short.js
new file mode 100644
index 0000000..d513a1c
--- /dev/null
+++ b/node_modules/minimist/test/short.js
@@ -0,0 +1,67 @@
+var parse = require('../');
+var test = require('tape');
+
+test('numeric short args', function (t) {
+ t.plan(2);
+ t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] });
+ t.deepEqual(
+ parse([ '-123', '456' ]),
+ { 1: true, 2: true, 3: 456, _: [] }
+ );
+});
+
+test('short', function (t) {
+ t.deepEqual(
+ parse([ '-b' ]),
+ { b : true, _ : [] },
+ 'short boolean'
+ );
+ t.deepEqual(
+ parse([ 'foo', 'bar', 'baz' ]),
+ { _ : [ 'foo', 'bar', 'baz' ] },
+ 'bare'
+ );
+ t.deepEqual(
+ parse([ '-cats' ]),
+ { c : true, a : true, t : true, s : true, _ : [] },
+ 'group'
+ );
+ t.deepEqual(
+ parse([ '-cats', 'meow' ]),
+ { c : true, a : true, t : true, s : 'meow', _ : [] },
+ 'short group next'
+ );
+ t.deepEqual(
+ parse([ '-h', 'localhost' ]),
+ { h : 'localhost', _ : [] },
+ 'short capture'
+ );
+ t.deepEqual(
+ parse([ '-h', 'localhost', '-p', '555' ]),
+ { h : 'localhost', p : 555, _ : [] },
+ 'short captures'
+ );
+ t.end();
+});
+
+test('mixed short bool and capture', function (t) {
+ t.same(
+ parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+ {
+ f : true, p : 555, h : 'localhost',
+ _ : [ 'script.js' ]
+ }
+ );
+ t.end();
+});
+
+test('short and long', function (t) {
+ t.deepEqual(
+ parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+ {
+ f : true, p : 555, h : 'localhost',
+ _ : [ 'script.js' ]
+ }
+ );
+ t.end();
+});
diff --git a/node_modules/minimist/test/stop_early.js b/node_modules/minimist/test/stop_early.js
new file mode 100644
index 0000000..bdf9fbc
--- /dev/null
+++ b/node_modules/minimist/test/stop_early.js
@@ -0,0 +1,15 @@
+var parse = require('../');
+var test = require('tape');
+
+test('stops parsing on the first non-option when stopEarly is set', function (t) {
+ var argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], {
+ stopEarly: true
+ });
+
+ t.deepEqual(argv, {
+ aaa: 'bbb',
+ _: ['ccc', '--ddd']
+ });
+
+ t.end();
+});
diff --git a/node_modules/minimist/test/unknown.js b/node_modules/minimist/test/unknown.js
new file mode 100644
index 0000000..462a36b
--- /dev/null
+++ b/node_modules/minimist/test/unknown.js
@@ -0,0 +1,102 @@
+var parse = require('../');
+var test = require('tape');
+
+test('boolean and alias is not unknown', function (t) {
+ var unknown = [];
+ function unknownFn(arg) {
+ unknown.push(arg);
+ return false;
+ }
+ var aliased = [ '-h', 'true', '--derp', 'true' ];
+ var regular = [ '--herp', 'true', '-d', 'true' ];
+ var opts = {
+ alias: { h: 'herp' },
+ boolean: 'h',
+ unknown: unknownFn
+ };
+ var aliasedArgv = parse(aliased, opts);
+ var propertyArgv = parse(regular, opts);
+
+ t.same(unknown, ['--derp', '-d']);
+ t.end();
+});
+
+test('flag boolean true any double hyphen argument is not unknown', function (t) {
+ var unknown = [];
+ function unknownFn(arg) {
+ unknown.push(arg);
+ return false;
+ }
+ var argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], {
+ boolean: true,
+ unknown: unknownFn
+ });
+ t.same(unknown, ['--tacos=good', 'cow', '-p']);
+ t.same(argv, {
+ honk: true,
+ _: []
+ });
+ t.end();
+});
+
+test('string and alias is not unknown', function (t) {
+ var unknown = [];
+ function unknownFn(arg) {
+ unknown.push(arg);
+ return false;
+ }
+ var aliased = [ '-h', 'hello', '--derp', 'goodbye' ];
+ var regular = [ '--herp', 'hello', '-d', 'moon' ];
+ var opts = {
+ alias: { h: 'herp' },
+ string: 'h',
+ unknown: unknownFn
+ };
+ var aliasedArgv = parse(aliased, opts);
+ var propertyArgv = parse(regular, opts);
+
+ t.same(unknown, ['--derp', '-d']);
+ t.end();
+});
+
+test('default and alias is not unknown', function (t) {
+ var unknown = [];
+ function unknownFn(arg) {
+ unknown.push(arg);
+ return false;
+ }
+ var aliased = [ '-h', 'hello' ];
+ var regular = [ '--herp', 'hello' ];
+ var opts = {
+ default: { 'h': 'bar' },
+ alias: { 'h': 'herp' },
+ unknown: unknownFn
+ };
+ var aliasedArgv = parse(aliased, opts);
+ var propertyArgv = parse(regular, opts);
+
+ t.same(unknown, []);
+ t.end();
+ unknownFn(); // exercise fn for 100% coverage
+});
+
+test('value following -- is not unknown', function (t) {
+ var unknown = [];
+ function unknownFn(arg) {
+ unknown.push(arg);
+ return false;
+ }
+ var aliased = [ '--bad', '--', 'good', 'arg' ];
+ var opts = {
+ '--': true,
+ unknown: unknownFn
+ };
+ var argv = parse(aliased, opts);
+
+ t.same(unknown, ['--bad']);
+ t.same(argv, {
+ '--': ['good', 'arg'],
+ '_': []
+ })
+ t.end();
+});
diff --git a/node_modules/minimist/test/whitespace.js b/node_modules/minimist/test/whitespace.js
new file mode 100644
index 0000000..8a52a58
--- /dev/null
+++ b/node_modules/minimist/test/whitespace.js
@@ -0,0 +1,8 @@
+var parse = require('../');
+var test = require('tape');
+
+test('whitespace should be whitespace' , function (t) {
+ t.plan(1);
+ var x = parse([ '-x', '\t' ]).x;
+ t.equal(x, '\t');
+});
diff --git a/node_modules/object-inspect/.npmignore b/node_modules/object-inspect/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/object-inspect/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/object-inspect/.travis.yml b/node_modules/object-inspect/.travis.yml
new file mode 100644
index 0000000..b0273e1
--- /dev/null
+++ b/node_modules/object-inspect/.travis.yml
@@ -0,0 +1,52 @@
+language: node_js
+node_js:
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - '[ "${TRAVIS_NODE_VERSION}" = "0.6" ] || npm install -g npm@1.4.28 && npm install -g npm'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/object-inspect/LICENSE b/node_modules/object-inspect/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/object-inspect/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/object-inspect/example/all.js b/node_modules/object-inspect/example/all.js
new file mode 100644
index 0000000..6d2d4be
--- /dev/null
+++ b/node_modules/object-inspect/example/all.js
@@ -0,0 +1,17 @@
+var inspect = require('../');
+var holes = [ 'a', 'b' ];
+holes[4] = 'e', holes[6] = 'g';
+var obj = {
+ a: 1,
+ b: [ 3, 4, undefined, null ],
+ c: undefined,
+ d: null,
+ e: {
+ regex: /^x/i,
+ buf: new Buffer('abc'),
+ holes: holes
+ },
+ now: new Date
+};
+obj.self = obj;
+console.log(inspect(obj));
diff --git a/node_modules/object-inspect/example/circular.js b/node_modules/object-inspect/example/circular.js
new file mode 100644
index 0000000..1006d0c
--- /dev/null
+++ b/node_modules/object-inspect/example/circular.js
@@ -0,0 +1,4 @@
+var inspect = require('../');
+var obj = { a: 1, b: [3,4] };
+obj.c = obj;
+console.log(inspect(obj));
diff --git a/node_modules/object-inspect/example/fn.js b/node_modules/object-inspect/example/fn.js
new file mode 100644
index 0000000..4c00ba6
--- /dev/null
+++ b/node_modules/object-inspect/example/fn.js
@@ -0,0 +1,3 @@
+var inspect = require('../');
+var obj = [ 1, 2, function f (n) { return n + 5 }, 4 ];
+console.log(inspect(obj));
diff --git a/node_modules/object-inspect/example/inspect.js b/node_modules/object-inspect/example/inspect.js
new file mode 100644
index 0000000..b5ad4d1
--- /dev/null
+++ b/node_modules/object-inspect/example/inspect.js
@@ -0,0 +1,7 @@
+var inspect = require('../');
+
+var d = document.createElement('div');
+d.setAttribute('id', 'beep');
+d.innerHTML = 'woooiiiii';
+
+console.log(inspect([ d, { a: 3, b : 4, c: [5,6,[7,[8,[9]]]] } ]));
diff --git a/node_modules/object-inspect/index.js b/node_modules/object-inspect/index.js
new file mode 100644
index 0000000..817d66a
--- /dev/null
+++ b/node_modules/object-inspect/index.js
@@ -0,0 +1,207 @@
+var hasMap = typeof Map === 'function' && Map.prototype;
+var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
+var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
+var mapForEach = hasMap && Map.prototype.forEach;
+var hasSet = typeof Set === 'function' && Set.prototype;
+var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
+var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
+var setForEach = hasSet && Set.prototype.forEach;
+var booleanValueOf = Boolean.prototype.valueOf;
+
+module.exports = function inspect_ (obj, opts, depth, seen) {
+ if (!opts) opts = {};
+
+ var maxDepth = opts.depth === undefined ? 5 : opts.depth;
+ if (depth === undefined) depth = 0;
+ if (depth >= maxDepth && maxDepth > 0 && obj && typeof obj === 'object') {
+ return '[Object]';
+ }
+
+ if (seen === undefined) seen = [];
+ else if (indexOf(seen, obj) >= 0) {
+ return '[Circular]';
+ }
+
+ function inspect (value, from) {
+ if (from) {
+ seen = seen.slice();
+ seen.push(from);
+ }
+ return inspect_(value, opts, depth + 1, seen);
+ }
+
+ if (typeof obj === 'string') {
+ return inspectString(obj);
+ }
+ else if (typeof obj === 'function') {
+ var name = nameOf(obj);
+ return '[Function' + (name ? ': ' + name : '') + ']';
+ }
+ else if (obj === null) {
+ return 'null';
+ }
+ else if (isSymbol(obj)) {
+ var symString = Symbol.prototype.toString.call(obj);
+ return typeof obj === 'object' ? 'Object(' + symString + ')' : symString;
+ }
+ else if (isElement(obj)) {
+ var s = '<' + String(obj.nodeName).toLowerCase();
+ var attrs = obj.attributes || [];
+ for (var i = 0; i < attrs.length; i++) {
+ s += ' ' + attrs[i].name + '="' + quote(attrs[i].value) + '"';
+ }
+ s += '>';
+ if (obj.childNodes && obj.childNodes.length) s += '...';
+ s += '' + String(obj.nodeName).toLowerCase() + '>';
+ return s;
+ }
+ else if (isArray(obj)) {
+ if (obj.length === 0) return '[]';
+ var xs = Array(obj.length);
+ for (var i = 0; i < obj.length; i++) {
+ xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
+ }
+ return '[ ' + xs.join(', ') + ' ]';
+ }
+ else if (isError(obj)) {
+ var parts = [];
+ for (var key in obj) {
+ if (!has(obj, key)) continue;
+
+ if (/[^\w$]/.test(key)) {
+ parts.push(inspect(key) + ': ' + inspect(obj[key]));
+ }
+ else {
+ parts.push(key + ': ' + inspect(obj[key]));
+ }
+ }
+ if (parts.length === 0) return '[' + obj + ']';
+ return '{ [' + obj + '] ' + parts.join(', ') + ' }';
+ }
+ else if (typeof obj === 'object' && typeof obj.inspect === 'function') {
+ return obj.inspect();
+ }
+ else if (isMap(obj)) {
+ var parts = [];
+ mapForEach.call(obj, function (value, key) {
+ parts.push(inspect(key, obj) + ' => ' + inspect(value, obj));
+ });
+ return 'Map (' + mapSize.call(obj) + ') {' + parts.join(', ') + '}';
+ }
+ else if (isSet(obj)) {
+ var parts = [];
+ setForEach.call(obj, function (value ) {
+ parts.push(inspect(value, obj));
+ });
+ return 'Set (' + setSize.call(obj) + ') {' + parts.join(', ') + '}';
+ }
+ else if (typeof obj !== 'object') {
+ return String(obj);
+ }
+ else if (isNumber(obj)) {
+ return 'Object(' + Number(obj) + ')';
+ }
+ else if (isBoolean(obj)) {
+ return 'Object(' + booleanValueOf.call(obj) + ')';
+ }
+ else if (isString(obj)) {
+ return 'Object(' + inspect(String(obj)) + ')';
+ }
+ else if (!isDate(obj) && !isRegExp(obj)) {
+ var xs = [], keys = [];
+ for (var key in obj) {
+ if (has(obj, key)) keys.push(key);
+ }
+ keys.sort();
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (/[^\w$]/.test(key)) {
+ xs.push(inspect(key) + ': ' + inspect(obj[key], obj));
+ }
+ else xs.push(key + ': ' + inspect(obj[key], obj));
+ }
+ if (xs.length === 0) return '{}';
+ return '{ ' + xs.join(', ') + ' }';
+ }
+ else return String(obj);
+};
+
+function quote (s) {
+ return String(s).replace(/"/g, '"');
+}
+
+function isArray (obj) { return toStr(obj) === '[object Array]' }
+function isDate (obj) { return toStr(obj) === '[object Date]' }
+function isRegExp (obj) { return toStr(obj) === '[object RegExp]' }
+function isError (obj) { return toStr(obj) === '[object Error]' }
+function isSymbol (obj) { return toStr(obj) === '[object Symbol]' }
+function isString (obj) { return toStr(obj) === '[object String]' }
+function isNumber (obj) { return toStr(obj) === '[object Number]' }
+function isBoolean (obj) { return toStr(obj) === '[object Boolean]' }
+
+var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
+function has (obj, key) {
+ return hasOwn.call(obj, key);
+}
+
+function toStr (obj) {
+ return Object.prototype.toString.call(obj);
+}
+
+function nameOf (f) {
+ if (f.name) return f.name;
+ var m = f.toString().match(/^function\s*([\w$]+)/);
+ if (m) return m[1];
+}
+
+function indexOf (xs, x) {
+ if (xs.indexOf) return xs.indexOf(x);
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+}
+
+function isMap (x) {
+ if (!mapSize) {
+ return false;
+ }
+ try {
+ mapSize.call(x);
+ return true;
+ } catch (e) {}
+ return false;
+}
+
+function isSet (x) {
+ if (!setSize) {
+ return false;
+ }
+ try {
+ setSize.call(x);
+ return true;
+ } catch (e) {}
+ return false;
+}
+
+function isElement (x) {
+ if (!x || typeof x !== 'object') return false;
+ if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
+ return true;
+ }
+ return typeof x.nodeName === 'string'
+ && typeof x.getAttribute === 'function'
+ ;
+}
+
+function inspectString (str) {
+ var s = str.replace(/(['\\])/g, '\\$1').replace(/[\x00-\x1f]/g, lowbyte);
+ return "'" + s + "'";
+
+ function lowbyte (c) {
+ var n = c.charCodeAt(0);
+ var x = { 8: 'b', 9: 't', 10: 'n', 12: 'f', 13: 'r' }[n];
+ if (x) return '\\' + x;
+ return '\\x' + (n < 0x10 ? '0' : '') + n.toString(16);
+ }
+}
diff --git a/node_modules/object-inspect/package.json b/node_modules/object-inspect/package.json
new file mode 100644
index 0000000..db8e624
--- /dev/null
+++ b/node_modules/object-inspect/package.json
@@ -0,0 +1,114 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "object-inspect@~1.2.1",
+ "scope": null,
+ "escapedName": "object-inspect",
+ "name": "object-inspect",
+ "rawSpec": "~1.2.1",
+ "spec": ">=1.2.1 <1.3.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "object-inspect@>=1.2.1 <1.3.0",
+ "_id": "object-inspect@1.2.1",
+ "_inCache": true,
+ "_location": "/object-inspect",
+ "_nodeVersion": "5.10.0",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/object-inspect-1.2.1.tgz_1460217450014_0.6012979652732611"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.8.3",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "object-inspect@~1.2.1",
+ "scope": null,
+ "escapedName": "object-inspect",
+ "name": "object-inspect",
+ "rawSpec": "~1.2.1",
+ "spec": ">=1.2.1 <1.3.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.1.tgz",
+ "_shasum": "3b62226eb8f6d441751c7d8f22a20ff80ac9dc3f",
+ "_shrinkwrap": null,
+ "_spec": "object-inspect@~1.2.1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/object-inspect/issues"
+ },
+ "dependencies": {},
+ "description": "string representations of objects in node and the browser",
+ "devDependencies": {
+ "tape": "^4.5.1"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "3b62226eb8f6d441751c7d8f22a20ff80ac9dc3f",
+ "tarball": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.1.tgz"
+ },
+ "gitHead": "bd0329aaaf501de7bf2a6c5d714f533ced5e96f1",
+ "homepage": "https://github.com/substack/object-inspect",
+ "keywords": [
+ "inspect",
+ "util.inspect",
+ "object",
+ "stringify",
+ "pretty"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "substack@gmail.com"
+ },
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "object-inspect",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/object-inspect.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "testling": {
+ "files": [
+ "test/*.js",
+ "test/browser/*.js"
+ ],
+ "browsers": [
+ "ie/6..latest",
+ "chrome/latest",
+ "firefox/latest",
+ "safari/latest",
+ "opera/latest",
+ "iphone/latest",
+ "ipad/latest",
+ "android/latest"
+ ]
+ },
+ "version": "1.2.1"
+}
diff --git a/node_modules/object-inspect/readme.markdown b/node_modules/object-inspect/readme.markdown
new file mode 100644
index 0000000..41959a4
--- /dev/null
+++ b/node_modules/object-inspect/readme.markdown
@@ -0,0 +1,59 @@
+# object-inspect
+
+string representations of objects in node and the browser
+
+[](https://ci.testling.com/substack/object-inspect)
+
+[](http://travis-ci.org/substack/object-inspect)
+
+# example
+
+## circular
+
+``` js
+var inspect = require('object-inspect');
+var obj = { a: 1, b: [3,4] };
+obj.c = obj;
+console.log(inspect(obj));
+```
+
+## dom element
+
+``` js
+var inspect = require('object-inspect');
+
+var d = document.createElement('div');
+d.setAttribute('id', 'beep');
+d.innerHTML = 'woooiiiii';
+
+console.log(inspect([ d, { a: 3, b : 4, c: [5,6,[7,[8,[9]]]] } ]));
+```
+
+output:
+
+```
+[ ...
, { a: 3, b: 4, c: [ 5, 6, [ 7, [ 8, [ ... ] ] ] ] } ]
+```
+
+# methods
+
+``` js
+var inspect = require('object-inspect')
+```
+
+## var s = inspect(obj, opts={})
+
+Return a string `s` with the string representation of `obj` up to a depth of
+`opts.depth`.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install object-inspect
+```
+
+# license
+
+MIT
diff --git a/node_modules/object-inspect/test/browser/dom.js b/node_modules/object-inspect/test/browser/dom.js
new file mode 100644
index 0000000..18a3d70
--- /dev/null
+++ b/node_modules/object-inspect/test/browser/dom.js
@@ -0,0 +1,15 @@
+var inspect = require('../../');
+var test = require('tape');
+
+test('dom element', function (t) {
+ t.plan(1);
+
+ var d = document.createElement('div');
+ d.setAttribute('id', 'beep');
+ d.innerHTML = 'woooiiiii';
+
+ t.equal(
+ inspect([ d, { a: 3, b : 4, c: [5,6,[7,[8,[9]]]] } ]),
+ '[ ...
, { a: 3, b: 4, c: [ 5, 6, [ 7, [ 8, [Object] ] ] ] } ]'
+ );
+});
diff --git a/node_modules/object-inspect/test/circular.js b/node_modules/object-inspect/test/circular.js
new file mode 100644
index 0000000..28598a7
--- /dev/null
+++ b/node_modules/object-inspect/test/circular.js
@@ -0,0 +1,9 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('circular', function (t) {
+ t.plan(1);
+ var obj = { a: 1, b: [3,4] };
+ obj.c = obj;
+ t.equal(inspect(obj), '{ a: 1, b: [ 3, 4 ], c: [Circular] }');
+});
diff --git a/node_modules/object-inspect/test/deep.js b/node_modules/object-inspect/test/deep.js
new file mode 100644
index 0000000..a8dbb58
--- /dev/null
+++ b/node_modules/object-inspect/test/deep.js
@@ -0,0 +1,9 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('deep', function (t) {
+ t.plan(2);
+ var obj = [ [ [ [ [ [ 500 ] ] ] ] ] ];
+ t.equal(inspect(obj), '[ [ [ [ [ [Object] ] ] ] ] ]');
+ t.equal(inspect(obj, { depth: 2 }), '[ [ [Object] ] ]');
+});
diff --git a/node_modules/object-inspect/test/element.js b/node_modules/object-inspect/test/element.js
new file mode 100644
index 0000000..66df4b8
--- /dev/null
+++ b/node_modules/object-inspect/test/element.js
@@ -0,0 +1,51 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('element', function (t) {
+ t.plan(1);
+ var elem = {
+ nodeName: 'div',
+ attributes: [ { name: 'class', value: 'row' } ],
+ getAttribute: function (key) {},
+ childNodes: []
+ };
+ var obj = [ 1, elem, 3 ];
+ t.deepEqual(inspect(obj), '[ 1, , 3 ]');
+});
+
+test('element no attr', function (t) {
+ t.plan(1);
+ var elem = {
+ nodeName: 'div',
+ getAttribute: function (key) {},
+ childNodes: []
+ };
+ var obj = [ 1, elem, 3 ];
+ t.deepEqual(inspect(obj), '[ 1, , 3 ]');
+});
+
+test('element with contents', function (t) {
+ t.plan(1);
+ var elem = {
+ nodeName: 'div',
+ getAttribute: function (key) {},
+ childNodes: [ { nodeName: 'b' } ]
+ };
+ var obj = [ 1, elem, 3 ];
+ t.deepEqual(inspect(obj), '[ 1, ...
, 3 ]');
+});
+
+test('element instance', function (t) {
+ t.plan(1);
+ var h = global.HTMLElement;
+ global.HTMLElement = function (name, attr) {
+ this.nodeName = name;
+ this.attributes = attr;
+ };
+ global.HTMLElement.prototype.getAttribute = function () {};
+
+ var elem = new(global.HTMLElement)('div', []);
+ var obj = [ 1, elem, 3 ];
+ t.deepEqual(inspect(obj), '[ 1, , 3 ]');
+ global.HTMLElement = h;
+});
diff --git a/node_modules/object-inspect/test/err.js b/node_modules/object-inspect/test/err.js
new file mode 100644
index 0000000..0f31343
--- /dev/null
+++ b/node_modules/object-inspect/test/err.js
@@ -0,0 +1,29 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('type error', function (t) {
+ t.plan(1);
+ var aerr = new TypeError;
+ aerr.foo = 555;
+ aerr.bar = [1,2,3];
+
+ var berr = new TypeError('tuv');
+ berr.baz = 555;
+
+ var cerr = new SyntaxError;
+ cerr.message = 'whoa';
+ cerr['a-b'] = 5;
+
+ var obj = [
+ new TypeError,
+ new TypeError('xxx'),
+ aerr, berr, cerr
+ ];
+ t.equal(inspect(obj), '[ ' + [
+ '[TypeError]',
+ '[TypeError: xxx]',
+ '{ [TypeError] foo: 555, bar: [ 1, 2, 3 ] }',
+ '{ [TypeError: tuv] baz: 555 }',
+ '{ [SyntaxError: whoa] message: \'whoa\', \'a-b\': 5 }'
+ ].join(', ') + ' ]');
+});
diff --git a/node_modules/object-inspect/test/fn.js b/node_modules/object-inspect/test/fn.js
new file mode 100644
index 0000000..55357db
--- /dev/null
+++ b/node_modules/object-inspect/test/fn.js
@@ -0,0 +1,16 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('function', function (t) {
+ t.plan(1);
+ var obj = [ 1, 2, function f (n) {}, 4 ];
+ t.equal(inspect(obj), '[ 1, 2, [Function: f], 4 ]');
+});
+
+test('function name', function (t) {
+ t.plan(1);
+ var f = function () {};
+ f.toString = function () { return 'function xxx () {}' };
+ var obj = [ 1, 2, f, 4 ];
+ t.equal(inspect(obj), '[ 1, 2, [Function: xxx], 4 ]');
+});
diff --git a/node_modules/object-inspect/test/has.js b/node_modules/object-inspect/test/has.js
new file mode 100644
index 0000000..e1970b3
--- /dev/null
+++ b/node_modules/object-inspect/test/has.js
@@ -0,0 +1,31 @@
+var inspect = require('../');
+var test = require('tape');
+
+var withoutProperty = function (object, property, fn) {
+ var original;
+ if (Object.getOwnPropertyDescriptor) {
+ original = Object.getOwnPropertyDescriptor(object, property);
+ } else {
+ original = object[property];
+ }
+ delete object[property];
+ try {
+ fn();
+ } finally {
+ if (Object.getOwnPropertyDescriptor) {
+ Object.defineProperty(object, property, original);
+ } else {
+ object[property] = original;
+ }
+ }
+};
+
+test('when Object#hasOwnProperty is deleted', function (t) {
+ t.plan(1);
+ var arr = [1, , 3];
+ Array.prototype[1] = 2; // this is needed to account for "in" vs "hasOwnProperty"
+ withoutProperty(Object.prototype, 'hasOwnProperty', function () {
+ t.equal(inspect(arr), '[ 1, , 3 ]');
+ });
+ delete Array.prototype[1];
+});
diff --git a/node_modules/object-inspect/test/holes.js b/node_modules/object-inspect/test/holes.js
new file mode 100644
index 0000000..ae54de4
--- /dev/null
+++ b/node_modules/object-inspect/test/holes.js
@@ -0,0 +1,15 @@
+var test = require('tape');
+var inspect = require('../');
+
+var xs = [ 'a', 'b' ];
+xs[5] = 'f';
+xs[7] = 'j';
+xs[8] = 'k';
+
+test('holes', function (t) {
+ t.plan(1);
+ t.equal(
+ inspect(xs),
+ "[ 'a', 'b', , , , 'f', , 'j', 'k' ]"
+ );
+});
diff --git a/node_modules/object-inspect/test/inspect.js b/node_modules/object-inspect/test/inspect.js
new file mode 100644
index 0000000..12e231a
--- /dev/null
+++ b/node_modules/object-inspect/test/inspect.js
@@ -0,0 +1,8 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('inspect', function (t) {
+ t.plan(1);
+ var obj = [ { inspect: function () { return '!XYZ¡' } }, [] ];
+ t.equal(inspect(obj), '[ !XYZ¡, [] ]');
+});
diff --git a/node_modules/object-inspect/test/lowbyte.js b/node_modules/object-inspect/test/lowbyte.js
new file mode 100644
index 0000000..debd59c
--- /dev/null
+++ b/node_modules/object-inspect/test/lowbyte.js
@@ -0,0 +1,12 @@
+var test = require('tape');
+var inspect = require('../');
+
+var obj = { x: 'a\r\nb', y: '\5! \x1f \022' };
+
+test('interpolate low bytes', function (t) {
+ t.plan(1);
+ t.equal(
+ inspect(obj),
+ "{ x: 'a\\r\\nb', y: '\\x05! \\x1f \\x12' }"
+ );
+});
diff --git a/node_modules/object-inspect/test/undef.js b/node_modules/object-inspect/test/undef.js
new file mode 100644
index 0000000..833238f
--- /dev/null
+++ b/node_modules/object-inspect/test/undef.js
@@ -0,0 +1,12 @@
+var test = require('tape');
+var inspect = require('../');
+
+var obj = { a: 1, b: [ 3, 4, undefined, null ], c: undefined, d: null };
+
+test('undef and null', function (t) {
+ t.plan(1);
+ t.equal(
+ inspect(obj),
+ '{ a: 1, b: [ 3, 4, undefined, null ], c: undefined, d: null }'
+ );
+});
diff --git a/node_modules/object-inspect/test/values.js b/node_modules/object-inspect/test/values.js
new file mode 100644
index 0000000..a07d480
--- /dev/null
+++ b/node_modules/object-inspect/test/values.js
@@ -0,0 +1,122 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('values', function (t) {
+ t.plan(1);
+ var obj = [ {}, [], { 'a-b': 5 } ];
+ t.equal(inspect(obj), '[ {}, [], { \'a-b\': 5 } ]');
+});
+
+test('has', function (t) {
+ t.plan(1);
+ var has = Object.prototype.hasOwnProperty;
+ delete Object.prototype.hasOwnProperty;
+ t.equal(inspect({ a: 1, b: 2 }), '{ a: 1, b: 2 }');
+ Object.prototype.hasOwnProperty = has;
+});
+
+test('indexOf seen', function (t) {
+ t.plan(1);
+ var xs = [ 1, 2, 3, {} ];
+ xs.push(xs);
+
+ var seen = [];
+ seen.indexOf = undefined;
+
+ t.equal(
+ inspect(xs, {}, 0, seen),
+ '[ 1, 2, 3, {}, [Circular] ]'
+ );
+});
+
+test('seen seen', function (t) {
+ t.plan(1);
+ var xs = [ 1, 2, 3 ];
+
+ var seen = [ xs ];
+ seen.indexOf = undefined;
+
+ t.equal(
+ inspect(xs, {}, 0, seen),
+ '[Circular]'
+ );
+});
+
+test('seen seen seen', function (t) {
+ t.plan(1);
+ var xs = [ 1, 2, 3 ];
+
+ var seen = [ 5, xs ];
+ seen.indexOf = undefined;
+
+ t.equal(
+ inspect(xs, {}, 0, seen),
+ '[Circular]'
+ );
+});
+
+test('symbols', { skip: typeof Symbol !== 'function' }, function (t) {
+ var sym = Symbol('foo');
+ t.equal(inspect(sym), 'Symbol(foo)', 'Symbol("foo") should be "Symbol(foo)"');
+ t.equal(inspect(Object(sym)), 'Object(Symbol(foo))', 'Object(Symbol("foo")) should be "Object(Symbol(foo))"');
+ t.end();
+});
+
+test('Map', { skip: typeof Map !== 'function' }, function (t) {
+ var map = new Map();
+ map.set({ a: 1 }, ['b']);
+ map.set(3, NaN);
+ var expectedString = 'Map (2) {' + inspect({ a: 1 }) + ' => ' + inspect(['b']) + ', 3 => NaN}';
+ t.equal(inspect(map), expectedString, 'new Map([[{ a: 1 }, ["b"]], [3, NaN]]) should show size and contents');
+ t.equal(inspect(new Map()), 'Map (0) {}', 'empty Map should show as empty');
+
+ var nestedMap = new Map();
+ nestedMap.set(nestedMap, map);
+ t.equal(inspect(nestedMap), 'Map (1) {[Circular] => ' + expectedString + '}', 'Map containing a Map should work');
+
+ t.end();
+});
+
+test('Set', { skip: typeof Set !== 'function' }, function (t) {
+ var set = new Set();
+ set.add({ a: 1 });
+ set.add(['b']);
+ var expectedString = 'Set (2) {' + inspect({ a: 1 }) + ', ' + inspect(['b']) + '}';
+ t.equal(inspect(set), expectedString, 'new Set([{ a: 1 }, ["b"]]) should show size and contents');
+ t.equal(inspect(new Set()), 'Set (0) {}', 'empty Set should show as empty');
+
+ var nestedSet = new Set();
+ nestedSet.add(set);
+ nestedSet.add(nestedSet);
+ t.equal(inspect(nestedSet), 'Set (2) {' + expectedString + ', [Circular]}', 'Set containing a Set should work');
+
+ t.end();
+});
+
+test('Strings', function (t) {
+ var str = 'abc';
+
+ t.equal(inspect(str), "'" + str + "'", 'primitive string shows as such');
+ t.equal(inspect(Object(str)), 'Object(' + inspect(str) + ')', 'String object shows as such');
+
+ t.end();
+});
+
+test('Numbers', function (t) {
+ var num = 42;
+
+ t.equal(inspect(num), String(num), 'primitive number shows as such');
+ t.equal(inspect(Object(num)), 'Object(' + inspect(num) + ')', 'Number object shows as such');
+
+ t.end();
+});
+
+test('Booleans', function (t) {
+ t.equal(inspect(true), String(true), 'primitive true shows as such');
+ t.equal(inspect(Object(true)), 'Object(' + inspect(true) + ')', 'Boolean object true shows as such');
+
+ t.equal(inspect(false), String(false), 'primitive false shows as such');
+ t.equal(inspect(Object(false)), 'Object(' + inspect(false) + ')', 'Boolean false object shows as such');
+
+ t.end();
+});
diff --git a/node_modules/object-keys/.editorconfig b/node_modules/object-keys/.editorconfig
new file mode 100644
index 0000000..eaa2141
--- /dev/null
+++ b/node_modules/object-keys/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+indent_style = tab;
+insert_final_newline = true;
+quote_type = auto;
+space_after_anonymous_functions = true;
+space_after_control_statements = true;
+spaces_around_operators = true;
+trim_trailing_whitespace = true;
+spaces_in_brackets = false;
+end_of_line = lf;
+
diff --git a/node_modules/object-keys/.eslintrc b/node_modules/object-keys/.eslintrc
new file mode 100644
index 0000000..79bff7f
--- /dev/null
+++ b/node_modules/object-keys/.eslintrc
@@ -0,0 +1,17 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "complexity": [2, 11],
+ "id-length": [2, { "min": 1, "max": 40 }],
+ "max-params": [2, 3],
+ "max-statements": [2, 23],
+ "max-statements-per-line": [2, { "max": 2 }],
+ "no-extra-parens": [1],
+ "no-invalid-this": [1],
+ "no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "LabeledStatement", "WithStatement"],
+ "operator-linebreak": [2, "after"]
+ }
+}
diff --git a/node_modules/object-keys/.jscs.json b/node_modules/object-keys/.jscs.json
new file mode 100644
index 0000000..7841223
--- /dev/null
+++ b/node_modules/object-keys/.jscs.json
@@ -0,0 +1,175 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 7
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": "asc-insensitive",
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false,
+
+ "requireCapitalizedConstructorsNew": {
+ "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
+ },
+
+ "requireImportAlphabetized": false,
+
+ "requireSpaceBeforeObjectValues": true,
+ "requireSpaceBeforeDestructuredValues": true,
+
+ "disallowSpacesInsideTemplateStringPlaceholders": true,
+
+ "disallowArrayDestructuringReturn": false,
+
+ "requireNewlineBeforeSingleStatementsInIf": false,
+
+ "disallowUnusedVariables": true,
+
+ "requireSpacesInsideImportedObjectBraces": true,
+
+ "requireUseStrict": true
+}
+
diff --git a/node_modules/object-keys/.npmignore b/node_modules/object-keys/.npmignore
new file mode 100644
index 0000000..a777a81
--- /dev/null
+++ b/node_modules/object-keys/.npmignore
@@ -0,0 +1,2 @@
+test/*
+
diff --git a/node_modules/object-keys/.travis.yml b/node_modules/object-keys/.travis.yml
new file mode 100644
index 0000000..e9f887b
--- /dev/null
+++ b/node_modules/object-keys/.travis.yml
@@ -0,0 +1,94 @@
+language: node_js
+node_js:
+ - "6.2"
+ - "6.1"
+ - "6.0"
+ - "5.11"
+ - "5.10"
+ - "5.9"
+ - "5.8"
+ - "5.7"
+ - "5.6"
+ - "5.5"
+ - "5.4"
+ - "5.3"
+ - "5.2"
+ - "5.1"
+ - "5.0"
+ - "4.4"
+ - "4.3"
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+script:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "4.4" ]; then npm run tests-only ; else npm test ; fi'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "6.1"
+ - node_js: "6.0"
+ - node_js: "5.10"
+ - node_js: "5.9"
+ - node_js: "5.8"
+ - node_js: "5.7"
+ - node_js: "5.6"
+ - node_js: "5.5"
+ - node_js: "5.4"
+ - node_js: "5.3"
+ - node_js: "5.2"
+ - node_js: "5.1"
+ - node_js: "5.0"
+ - node_js: "4.3"
+ - node_js: "4.2"
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/object-keys/CHANGELOG.md b/node_modules/object-keys/CHANGELOG.md
new file mode 100644
index 0000000..1647725
--- /dev/null
+++ b/node_modules/object-keys/CHANGELOG.md
@@ -0,0 +1,216 @@
+1.0.11 / 2016-07-05
+=================
+ * [Fix] exclude keys regarding the style (eg. `pageYOffset`) on `window` to avoid reflow (#32)
+
+1.0.10 / 2016-07-04
+=================
+ * [Fix] exclude `height` and `width` keys on `window` to avoid reflow (#31)
+ * [Fix] In IE 6, `window.external` makes `Object.keys` throw
+ * [Tests] up to `node` `v6.2`, `v5.10`, `v4.4`
+ * [Tests] use pretest/posttest for linting/security
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
+ * [Dev Deps] remove unused eccheck script + dep
+
+1.0.9 / 2015-10-19
+=================
+ * [Fix] Blacklist 'frame' property on window (#16, #17)
+ * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`
+
+1.0.8 / 2015-10-14
+=================
+ * [Fix] wrap automation equality bug checking in try/catch, per [es5-shim#327](https://github.com/es-shims/es5-shim/issues/327)
+ * [Fix] Blacklist 'window.frameElement' per [es5-shim#322](https://github.com/es-shims/es5-shim/issues/322)
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+ * [Tests] up to `io.js` `v3.3`, `node` `v4.2`
+ * [Dev Deps] update `eslint`, `tape`, `@ljharb/eslint-config`, `jscs`
+
+1.0.7 / 2015-07-18
+=================
+ * [Fix] A proper fix for 176f03335e90d5c8d0d8125a99f27819c9b9cdad / https://github.com/es-shims/es5-shim/issues/275 that doesn't break dontEnum/constructor fixes in IE 8.
+ * [Fix] Remove deprecation message in Chrome by touching deprecated window properties (#15)
+ * [Tests] Improve test output for automation equality bugfix
+ * [Tests] Test on `io.js` `v2.4`
+
+1.0.6 / 2015-07-09
+=================
+ * [Fix] Use an object lookup rather than ES5's `indexOf` (#14)
+ * [Tests] ES3 browsers don't have `Array.isArray`
+ * [Tests] Fix `no-shadow` rule, as well as an IE 8 bug caused by engine NFE shadowing bugs.
+
+1.0.5 / 2015-07-03
+=================
+ * [Fix] Fix a flabbergasting IE 8 bug where `localStorage.constructor.prototype === localStorage` throws
+ * [Tests] Test up to `io.js` `v2.3`
+ * [Dev Deps] Update `nsp`, `eslint`
+
+1.0.4 / 2015-05-23
+=================
+ * Fix a Safari 5.0 bug with `Object.keys` not working with `arguments`
+ * Test on latest `node` and `io.js`
+ * Update `jscs`, `tape`, `eslint`, `nsp`, `is`, `editorconfig-tools`, `covert`
+
+1.0.3 / 2015-01-06
+=================
+ * Revert "Make `object-keys` more robust against later environment tampering" to maintain ES3 compliance
+
+1.0.2 / 2014-12-28
+=================
+ * Update lots of dev dependencies
+ * Tweaks to README
+ * Make `object-keys` more robust against later environment tampering
+
+1.0.1 / 2014-09-03
+=================
+ * Update URLs and badges in README
+
+1.0.0 / 2014-08-26
+=================
+ * v1.0.0
+
+0.6.1 / 2014-08-25
+=================
+ * v0.6.1
+ * Updating dependencies (tape, covert, is)
+ * Update badges in readme
+ * Use separate var statements
+
+0.6.0 / 2014-04-23
+=================
+ * v0.6.0
+ * Updating dependencies (tape, covert)
+ * Make sure boxed primitives, and arguments objects, work properly in ES3 browsers
+ * Improve test matrix: test all node versions, but only latest two stables are a failure
+ * Remove internal foreach shim.
+
+0.5.1 / 2014-03-09
+=================
+ * 0.5.1
+ * Updating dependencies (tape, covert, is)
+ * Removing forEach from the module (but keeping it in tests)
+
+0.5.0 / 2014-01-30
+=================
+ * 0.5.0
+ * Explicitly returning the shim, instead of returning native Object.keys when present
+ * Adding a changelog.
+ * Cleaning up IIFE wrapping
+ * Testing on node 0.4 through 0.11
+
+0.4.0 / 2013-08-14
+==================
+
+ * v0.4.0
+ * In Chrome 4-10 and Safari 4, typeof (new RegExp) === 'function'
+ * If it's a string, make sure to use charAt instead of brackets.
+ * Only use Function#call if necessary.
+ * Making sure the context tests actually run.
+ * Better function detection
+ * Adding the android browser
+ * Fixing testling files
+ * Updating tape
+ * Removing the "is" dependency.
+ * Making an isArguments shim.
+ * Adding a local forEach shim and tests.
+ * Updating paths.
+ * Moving the shim test.
+ * v0.3.0
+
+0.3.0 / 2013-05-18
+==================
+
+ * README tweak.
+ * Fixing constructor enum issue. Fixes [#5](https://github.com/ljharb/object-keys/issues/5).
+ * Adding a test for [#5](https://github.com/ljharb/object-keys/issues/5)
+ * Updating readme.
+ * Updating dependencies.
+ * Giving credit to lodash.
+ * Make sure that a prototype's constructor property is not enumerable. Fixes [#3](https://github.com/ljharb/object-keys/issues/3).
+ * Adding additional tests to handle arguments objects, and to skip "prototype" in functions. Fixes [#2](https://github.com/ljharb/object-keys/issues/2).
+ * Fixing a typo on this test for [#3](https://github.com/ljharb/object-keys/issues/3).
+ * Adding node 0.10 to travis.
+ * Adding an IE < 9 test per [#3](https://github.com/ljharb/object-keys/issues/3)
+ * Adding an iOS 5 mobile Safari test per [#2](https://github.com/ljharb/object-keys/issues/2)
+ * Moving "indexof" and "is" to be dev dependencies.
+ * Making sure the shim works with functions.
+ * Flattening the tests.
+
+0.2.0 / 2013-05-10
+==================
+
+ * v0.2.0
+ * Object.keys should work with arrays.
+
+0.1.8 / 2013-05-10
+==================
+
+ * v0.1.8
+ * Upgrading dependencies.
+ * Using a simpler check.
+ * Fixing a bug in hasDontEnumBug browsers.
+ * Using the newest tape!
+ * Fixing this error test.
+ * "undefined" is probably a reserved word in ES3.
+ * Better test message.
+
+0.1.7 / 2013-04-17
+==================
+
+ * Upgrading "is" once more.
+ * The key "null" is breaking some browsers.
+
+0.1.6 / 2013-04-17
+==================
+
+ * v0.1.6
+ * Upgrading "is"
+
+0.1.5 / 2013-04-14
+==================
+
+ * Bumping version.
+ * Adding more testling browsers.
+ * Updating "is"
+
+0.1.4 / 2013-04-08
+==================
+
+ * Using "is" instead of "is-extended".
+
+0.1.3 / 2013-04-07
+==================
+
+ * Using "foreach" instead of my own shim.
+ * Removing "tap"; I'll just wait for "tape" to fix its node 0.10 bug.
+
+0.1.2 / 2013-04-03
+==================
+
+ * Adding dependency status; moving links to an index at the bottom.
+ * Upgrading is-extended; version 0.1.2
+ * Adding an npm version badge.
+
+0.1.1 / 2013-04-01
+==================
+
+ * Adding Travis CI.
+ * Bumping the version.
+ * Adding indexOf since IE sucks.
+ * Adding a forEach shim since older browsers don't have Array#forEach.
+ * Upgrading tape - 0.3.2 uses Array#map
+ * Using explicit end instead of plan.
+ * Can't test with Array.isArray in older browsers.
+ * Using is-extended.
+ * Fixing testling files.
+ * JSHint/JSLint-ing.
+ * Removing an unused object.
+ * Using strict mode.
+
+0.1.0 / 2013-03-30
+==================
+
+ * Changing the exports should have meant a higher version bump.
+ * Oops, fixing the repo URL.
+ * Adding more tests.
+ * 0.0.2
+ * Merge branch 'export_one_thing'; closes [#1](https://github.com/ljharb/object-keys/issues/1)
+ * Move shim export to a separate file.
diff --git a/node_modules/object-keys/LICENSE b/node_modules/object-keys/LICENSE
new file mode 100644
index 0000000..28553fd
--- /dev/null
+++ b/node_modules/object-keys/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (C) 2013 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/object-keys/README.md b/node_modules/object-keys/README.md
new file mode 100644
index 0000000..ed4c277
--- /dev/null
+++ b/node_modules/object-keys/README.md
@@ -0,0 +1,76 @@
+#object-keys [![Version Badge][npm-version-svg]][package-url]
+
+[![Build Status][travis-svg]][travis-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+[![browser support][testling-svg]][testling-url]
+
+An Object.keys shim. Invoke its "shim" method to shim Object.keys if it is unavailable.
+
+Most common usage:
+```js
+var keys = Object.keys || require('object-keys');
+```
+
+## Example
+
+```js
+var keys = require('object-keys');
+var assert = require('assert');
+var obj = {
+ a: true,
+ b: true,
+ c: true
+};
+
+assert.deepEqual(keys(obj), ['a', 'b', 'c']);
+```
+
+```js
+var keys = require('object-keys');
+var assert = require('assert');
+/* when Object.keys is not present */
+delete Object.keys;
+var shimmedKeys = keys.shim();
+assert.equal(shimmedKeys, keys);
+assert.deepEqual(Object.keys(obj), keys(obj));
+```
+
+```js
+var keys = require('object-keys');
+var assert = require('assert');
+/* when Object.keys is present */
+var shimmedKeys = keys.shim();
+assert.equal(shimmedKeys, Object.keys);
+assert.deepEqual(Object.keys(obj), keys(obj));
+```
+
+## Source
+Implementation taken directly from [es5-shim][es5-shim-url], with modifications, including from [lodash][lodash-url].
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/object-keys
+[npm-version-svg]: http://versionbadg.es/ljharb/object-keys.svg
+[travis-svg]: https://travis-ci.org/ljharb/object-keys.svg
+[travis-url]: https://travis-ci.org/ljharb/object-keys
+[deps-svg]: https://david-dm.org/ljharb/object-keys.svg
+[deps-url]: https://david-dm.org/ljharb/object-keys
+[dev-deps-svg]: https://david-dm.org/ljharb/object-keys/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/object-keys#info=devDependencies
+[testling-svg]: https://ci.testling.com/ljharb/object-keys.png
+[testling-url]: https://ci.testling.com/ljharb/object-keys
+[es5-shim-url]: https://github.com/es-shims/es5-shim/blob/master/es5-shim.js#L542-589
+[lodash-url]: https://github.com/lodash/lodash
+[npm-badge-png]: https://nodei.co/npm/object-keys.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/object-keys.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/object-keys.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=object-keys
+
diff --git a/node_modules/object-keys/index.js b/node_modules/object-keys/index.js
new file mode 100644
index 0000000..0c7ee81
--- /dev/null
+++ b/node_modules/object-keys/index.js
@@ -0,0 +1,140 @@
+'use strict';
+
+// modified from https://github.com/es-shims/es5-shim
+var has = Object.prototype.hasOwnProperty;
+var toStr = Object.prototype.toString;
+var slice = Array.prototype.slice;
+var isArgs = require('./isArguments');
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
+var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
+var dontEnums = [
+ 'toString',
+ 'toLocaleString',
+ 'valueOf',
+ 'hasOwnProperty',
+ 'isPrototypeOf',
+ 'propertyIsEnumerable',
+ 'constructor'
+];
+var equalsConstructorPrototype = function (o) {
+ var ctor = o.constructor;
+ return ctor && ctor.prototype === o;
+};
+var excludedKeys = {
+ $console: true,
+ $external: true,
+ $frame: true,
+ $frameElement: true,
+ $frames: true,
+ $innerHeight: true,
+ $innerWidth: true,
+ $outerHeight: true,
+ $outerWidth: true,
+ $pageXOffset: true,
+ $pageYOffset: true,
+ $parent: true,
+ $scrollLeft: true,
+ $scrollTop: true,
+ $scrollX: true,
+ $scrollY: true,
+ $self: true,
+ $webkitIndexedDB: true,
+ $webkitStorageInfo: true,
+ $window: true
+};
+var hasAutomationEqualityBug = (function () {
+ /* global window */
+ if (typeof window === 'undefined') { return false; }
+ for (var k in window) {
+ try {
+ if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
+ try {
+ equalsConstructorPrototype(window[k]);
+ } catch (e) {
+ return true;
+ }
+ }
+ } catch (e) {
+ return true;
+ }
+ }
+ return false;
+}());
+var equalsConstructorPrototypeIfNotBuggy = function (o) {
+ /* global window */
+ if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
+ return equalsConstructorPrototype(o);
+ }
+ try {
+ return equalsConstructorPrototype(o);
+ } catch (e) {
+ return false;
+ }
+};
+
+var keysShim = function keys(object) {
+ var isObject = object !== null && typeof object === 'object';
+ var isFunction = toStr.call(object) === '[object Function]';
+ var isArguments = isArgs(object);
+ var isString = isObject && toStr.call(object) === '[object String]';
+ var theKeys = [];
+
+ if (!isObject && !isFunction && !isArguments) {
+ throw new TypeError('Object.keys called on a non-object');
+ }
+
+ var skipProto = hasProtoEnumBug && isFunction;
+ if (isString && object.length > 0 && !has.call(object, 0)) {
+ for (var i = 0; i < object.length; ++i) {
+ theKeys.push(String(i));
+ }
+ }
+
+ if (isArguments && object.length > 0) {
+ for (var j = 0; j < object.length; ++j) {
+ theKeys.push(String(j));
+ }
+ } else {
+ for (var name in object) {
+ if (!(skipProto && name === 'prototype') && has.call(object, name)) {
+ theKeys.push(String(name));
+ }
+ }
+ }
+
+ if (hasDontEnumBug) {
+ var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
+
+ for (var k = 0; k < dontEnums.length; ++k) {
+ if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
+ theKeys.push(dontEnums[k]);
+ }
+ }
+ }
+ return theKeys;
+};
+
+keysShim.shim = function shimObjectKeys() {
+ if (Object.keys) {
+ var keysWorksWithArguments = (function () {
+ // Safari 5.0 bug
+ return (Object.keys(arguments) || '').length === 2;
+ }(1, 2));
+ if (!keysWorksWithArguments) {
+ var originalKeys = Object.keys;
+ Object.keys = function keys(object) {
+ if (isArgs(object)) {
+ return originalKeys(slice.call(object));
+ } else {
+ return originalKeys(object);
+ }
+ };
+ }
+ } else {
+ Object.keys = keysShim;
+ }
+ return Object.keys || keysShim;
+};
+
+module.exports = keysShim;
diff --git a/node_modules/object-keys/isArguments.js b/node_modules/object-keys/isArguments.js
new file mode 100644
index 0000000..f2a2a90
--- /dev/null
+++ b/node_modules/object-keys/isArguments.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var toStr = Object.prototype.toString;
+
+module.exports = function isArguments(value) {
+ var str = toStr.call(value);
+ var isArgs = str === '[object Arguments]';
+ if (!isArgs) {
+ isArgs = str !== '[object Array]' &&
+ value !== null &&
+ typeof value === 'object' &&
+ typeof value.length === 'number' &&
+ value.length >= 0 &&
+ toStr.call(value.callee) === '[object Function]';
+ }
+ return isArgs;
+};
diff --git a/node_modules/object-keys/package.json b/node_modules/object-keys/package.json
new file mode 100644
index 0000000..bfe5f48
--- /dev/null
+++ b/node_modules/object-keys/package.json
@@ -0,0 +1,154 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "object-keys@^1.0.8",
+ "scope": null,
+ "escapedName": "object-keys",
+ "name": "object-keys",
+ "rawSpec": "^1.0.8",
+ "spec": ">=1.0.8 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/define-properties"
+ ]
+ ],
+ "_from": "object-keys@>=1.0.8 <2.0.0",
+ "_id": "object-keys@1.0.11",
+ "_inCache": true,
+ "_location": "/object-keys",
+ "_nodeVersion": "6.2.2",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/object-keys-1.0.11.tgz_1467740975903_0.8028358130250126"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.9.5",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "object-keys@^1.0.8",
+ "scope": null,
+ "escapedName": "object-keys",
+ "name": "object-keys",
+ "rawSpec": "^1.0.8",
+ "spec": ">=1.0.8 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/define-properties"
+ ],
+ "_resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+ "_shasum": "c54601778ad560f1142ce0e01bcca8b56d13426d",
+ "_shrinkwrap": null,
+ "_spec": "object-keys@^1.0.8",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/define-properties",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "bugs": {
+ "url": "https://github.com/ljharb/object-keys/issues"
+ },
+ "contributors": [
+ {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ {
+ "name": "Raynos",
+ "email": "raynos2@gmail.com"
+ },
+ {
+ "name": "Nathan Rajlich",
+ "email": "nathan@tootallnate.net"
+ },
+ {
+ "name": "Ivan Starkov",
+ "email": "istarkov@gmail.com"
+ },
+ {
+ "name": "Gary Katsevman",
+ "email": "git@gkatsev.com"
+ }
+ ],
+ "dependencies": {},
+ "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^6.0.0",
+ "covert": "^1.1.0",
+ "eslint": "^3.0.0",
+ "foreach": "^2.0.5",
+ "indexof": "^0.0.1",
+ "is": "^3.1.0",
+ "jscs": "^3.0.6",
+ "nsp": "^2.5.0",
+ "tape": "^4.6.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "c54601778ad560f1142ce0e01bcca8b56d13426d",
+ "tarball": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "3f869cc4b9f0f0489b2af7e80964f90d6c4403a4",
+ "homepage": "https://github.com/ljharb/object-keys#readme",
+ "keywords": [
+ "Object.keys",
+ "keys",
+ "ES5",
+ "shim"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "object-keys",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/object-keys.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "eslint": "eslint test/*.js *.js",
+ "jscs": "jscs test/*.js *.js",
+ "lint": "npm run --silent jscs && npm run --silent eslint",
+ "posttest": "npm run --silent security",
+ "pretest": "npm run --silent lint",
+ "security": "nsp check",
+ "test": "npm run --silent tests-only",
+ "tests-only": "node test/index.js"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.0.11"
+}
diff --git a/node_modules/object-keys/test/index.js b/node_modules/object-keys/test/index.js
new file mode 100644
index 0000000..5402465
--- /dev/null
+++ b/node_modules/object-keys/test/index.js
@@ -0,0 +1,5 @@
+'use strict';
+
+require('./isArguments');
+
+require('./shim');
diff --git a/node_modules/once/LICENSE b/node_modules/once/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/once/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/once/README.md b/node_modules/once/README.md
new file mode 100644
index 0000000..1f1ffca
--- /dev/null
+++ b/node_modules/once/README.md
@@ -0,0 +1,79 @@
+# once
+
+Only call a function once.
+
+## usage
+
+```javascript
+var once = require('once')
+
+function load (file, cb) {
+ cb = once(cb)
+ loader.load('file')
+ loader.once('load', cb)
+ loader.once('error', cb)
+}
+```
+
+Or add to the Function.prototype in a responsible way:
+
+```javascript
+// only has to be done once
+require('once').proto()
+
+function load (file, cb) {
+ cb = cb.once()
+ loader.load('file')
+ loader.once('load', cb)
+ loader.once('error', cb)
+}
+```
+
+Ironically, the prototype feature makes this module twice as
+complicated as necessary.
+
+To check whether you function has been called, use `fn.called`. Once the
+function is called for the first time the return value of the original
+function is saved in `fn.value` and subsequent calls will continue to
+return this value.
+
+```javascript
+var once = require('once')
+
+function load (cb) {
+ cb = once(cb)
+ var stream = createStream()
+ stream.once('data', cb)
+ stream.once('end', function () {
+ if (!cb.called) cb(new Error('not found'))
+ })
+}
+```
+
+## `once.strict(func)`
+
+Throw an error if the function is called twice.
+
+Some functions are expected to be called only once. Using `once` for them would
+potentially hide logical errors.
+
+In the example below, the `greet` function has to call the callback only once:
+
+```javascript
+function greet (name, cb) {
+ // return is missing from the if statement
+ // when no name is passed, the callback is called twice
+ if (!name) cb('Hello anonymous')
+ cb('Hello ' + name)
+}
+
+function log (msg) {
+ console.log(msg)
+}
+
+// this will print 'Hello anonymous' but the logical error will be missed
+greet(null, once(msg))
+
+// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time
+greet(null, once.strict(msg))
+```
diff --git a/node_modules/once/once.js b/node_modules/once/once.js
new file mode 100644
index 0000000..2354067
--- /dev/null
+++ b/node_modules/once/once.js
@@ -0,0 +1,42 @@
+var wrappy = require('wrappy')
+module.exports = wrappy(once)
+module.exports.strict = wrappy(onceStrict)
+
+once.proto = once(function () {
+ Object.defineProperty(Function.prototype, 'once', {
+ value: function () {
+ return once(this)
+ },
+ configurable: true
+ })
+
+ Object.defineProperty(Function.prototype, 'onceStrict', {
+ value: function () {
+ return onceStrict(this)
+ },
+ configurable: true
+ })
+})
+
+function once (fn) {
+ var f = function () {
+ if (f.called) return f.value
+ f.called = true
+ return f.value = fn.apply(this, arguments)
+ }
+ f.called = false
+ return f
+}
+
+function onceStrict (fn) {
+ var f = function () {
+ if (f.called)
+ throw new Error(f.onceError)
+ f.called = true
+ return f.value = fn.apply(this, arguments)
+ }
+ var name = fn.name || 'Function wrapped with `once`'
+ f.onceError = name + " shouldn't be called more than once"
+ f.called = false
+ return f
+}
diff --git a/node_modules/once/package.json b/node_modules/once/package.json
new file mode 100644
index 0000000..923dae3
--- /dev/null
+++ b/node_modules/once/package.json
@@ -0,0 +1,101 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "once@^1.3.0",
+ "scope": null,
+ "escapedName": "once",
+ "name": "once",
+ "rawSpec": "^1.3.0",
+ "spec": ">=1.3.0 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob"
+ ]
+ ],
+ "_from": "once@>=1.3.0 <2.0.0",
+ "_id": "once@1.4.0",
+ "_inCache": true,
+ "_location": "/once",
+ "_nodeVersion": "6.5.0",
+ "_npmOperationalInternal": {
+ "host": "packages-12-west.internal.npmjs.com",
+ "tmp": "tmp/once-1.4.0.tgz_1473196269128_0.537820661207661"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_npmVersion": "3.10.7",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "once@^1.3.0",
+ "scope": null,
+ "escapedName": "once",
+ "name": "once",
+ "rawSpec": "^1.3.0",
+ "spec": ">=1.3.0 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/glob",
+ "/inflight"
+ ],
+ "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1",
+ "_shrinkwrap": null,
+ "_spec": "once@^1.3.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/once/issues"
+ },
+ "dependencies": {
+ "wrappy": "1"
+ },
+ "description": "Run a function exactly one time",
+ "devDependencies": {
+ "tap": "^7.0.1"
+ },
+ "directories": {
+ "test": "test"
+ },
+ "dist": {
+ "shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1",
+ "tarball": "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ },
+ "files": [
+ "once.js"
+ ],
+ "gitHead": "0e614d9f5a7e6f0305c625f6b581f6d80b33b8a6",
+ "homepage": "https://github.com/isaacs/once#readme",
+ "keywords": [
+ "once",
+ "function",
+ "one",
+ "single"
+ ],
+ "license": "ISC",
+ "main": "once.js",
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "name": "once",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/once.git"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "version": "1.4.0"
+}
diff --git a/node_modules/path-is-absolute/index.js b/node_modules/path-is-absolute/index.js
new file mode 100644
index 0000000..22aa6c3
--- /dev/null
+++ b/node_modules/path-is-absolute/index.js
@@ -0,0 +1,20 @@
+'use strict';
+
+function posix(path) {
+ return path.charAt(0) === '/';
+}
+
+function win32(path) {
+ // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
+ var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
+ var result = splitDeviceRe.exec(path);
+ var device = result[1] || '';
+ var isUnc = Boolean(device && device.charAt(1) !== ':');
+
+ // UNC paths are always absolute
+ return Boolean(result[2] || isUnc);
+}
+
+module.exports = process.platform === 'win32' ? win32 : posix;
+module.exports.posix = posix;
+module.exports.win32 = win32;
diff --git a/node_modules/path-is-absolute/license b/node_modules/path-is-absolute/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/path-is-absolute/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/path-is-absolute/package.json b/node_modules/path-is-absolute/package.json
new file mode 100644
index 0000000..7db04d9
--- /dev/null
+++ b/node_modules/path-is-absolute/package.json
@@ -0,0 +1,111 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "path-is-absolute@^1.0.0",
+ "scope": null,
+ "escapedName": "path-is-absolute",
+ "name": "path-is-absolute",
+ "rawSpec": "^1.0.0",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob"
+ ]
+ ],
+ "_from": "path-is-absolute@>=1.0.0 <2.0.0",
+ "_id": "path-is-absolute@1.0.1",
+ "_inCache": true,
+ "_location": "/path-is-absolute",
+ "_nodeVersion": "6.6.0",
+ "_npmOperationalInternal": {
+ "host": "packages-12-west.internal.npmjs.com",
+ "tmp": "tmp/path-is-absolute-1.0.1.tgz_1475210523565_0.9876507974695414"
+ },
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "_npmVersion": "3.10.3",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "path-is-absolute@^1.0.0",
+ "scope": null,
+ "escapedName": "path-is-absolute",
+ "name": "path-is-absolute",
+ "rawSpec": "^1.0.0",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/glob"
+ ],
+ "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "_shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f",
+ "_shrinkwrap": null,
+ "_spec": "path-is-absolute@^1.0.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/glob",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "bugs": {
+ "url": "https://github.com/sindresorhus/path-is-absolute/issues"
+ },
+ "dependencies": {},
+ "description": "Node.js 0.12 path.isAbsolute() ponyfill",
+ "devDependencies": {
+ "xo": "^0.16.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f",
+ "tarball": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js"
+ ],
+ "gitHead": "edc91d348b21dac2ab65ea2fbec2868e2eff5eb6",
+ "homepage": "https://github.com/sindresorhus/path-is-absolute#readme",
+ "keywords": [
+ "path",
+ "paths",
+ "file",
+ "dir",
+ "absolute",
+ "isabsolute",
+ "is-absolute",
+ "built-in",
+ "util",
+ "utils",
+ "core",
+ "ponyfill",
+ "polyfill",
+ "shim",
+ "is",
+ "detect",
+ "check"
+ ],
+ "license": "MIT",
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ }
+ ],
+ "name": "path-is-absolute",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sindresorhus/path-is-absolute.git"
+ },
+ "scripts": {
+ "test": "xo && node test.js"
+ },
+ "version": "1.0.1"
+}
diff --git a/node_modules/path-is-absolute/readme.md b/node_modules/path-is-absolute/readme.md
new file mode 100644
index 0000000..8dbdf5f
--- /dev/null
+++ b/node_modules/path-is-absolute/readme.md
@@ -0,0 +1,59 @@
+# path-is-absolute [](https://travis-ci.org/sindresorhus/path-is-absolute)
+
+> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com)
+
+
+## Install
+
+```
+$ npm install --save path-is-absolute
+```
+
+
+## Usage
+
+```js
+const pathIsAbsolute = require('path-is-absolute');
+
+// Running on Linux
+pathIsAbsolute('/home/foo');
+//=> true
+pathIsAbsolute('C:/Users/foo');
+//=> false
+
+// Running on Windows
+pathIsAbsolute('C:/Users/foo');
+//=> true
+pathIsAbsolute('/home/foo');
+//=> false
+
+// Running on any OS
+pathIsAbsolute.posix('/home/foo');
+//=> true
+pathIsAbsolute.posix('C:/Users/foo');
+//=> false
+pathIsAbsolute.win32('C:/Users/foo');
+//=> true
+pathIsAbsolute.win32('/home/foo');
+//=> false
+```
+
+
+## API
+
+See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path).
+
+### pathIsAbsolute(path)
+
+### pathIsAbsolute.posix(path)
+
+POSIX specific version.
+
+### pathIsAbsolute.win32(path)
+
+Windows specific version.
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/resolve/.travis.yml b/node_modules/resolve/.travis.yml
new file mode 100644
index 0000000..895dbd3
--- /dev/null
+++ b/node_modules/resolve/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.6
+ - 0.8
diff --git a/node_modules/resolve/LICENSE b/node_modules/resolve/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/resolve/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/resolve/example/async.js b/node_modules/resolve/example/async.js
new file mode 100644
index 0000000..6624ff7
--- /dev/null
+++ b/node_modules/resolve/example/async.js
@@ -0,0 +1,5 @@
+var resolve = require('../');
+resolve('tap', { basedir: __dirname }, function (err, res) {
+ if (err) console.error(err)
+ else console.log(res)
+});
diff --git a/node_modules/resolve/example/sync.js b/node_modules/resolve/example/sync.js
new file mode 100644
index 0000000..54b2cc1
--- /dev/null
+++ b/node_modules/resolve/example/sync.js
@@ -0,0 +1,3 @@
+var resolve = require('../');
+var res = resolve.sync('tap', { basedir: __dirname });
+console.log(res);
diff --git a/node_modules/resolve/index.js b/node_modules/resolve/index.js
new file mode 100644
index 0000000..51f194b
--- /dev/null
+++ b/node_modules/resolve/index.js
@@ -0,0 +1,5 @@
+var core = require('./lib/core');
+exports = module.exports = require('./lib/async');
+exports.core = core;
+exports.isCore = function (x) { return core[x] };
+exports.sync = require('./lib/sync');
diff --git a/node_modules/resolve/lib/async.js b/node_modules/resolve/lib/async.js
new file mode 100644
index 0000000..0f0eeca
--- /dev/null
+++ b/node_modules/resolve/lib/async.js
@@ -0,0 +1,192 @@
+var core = require('./core');
+var fs = require('fs');
+var path = require('path');
+var caller = require('./caller.js');
+var nodeModulesPaths = require('./node-modules-paths.js');
+var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\//;
+
+module.exports = function resolve (x, opts, cb) {
+ if (typeof opts === 'function') {
+ cb = opts;
+ opts = {};
+ }
+ if (!opts) opts = {};
+ if (typeof x !== 'string') {
+ return process.nextTick(function () {
+ cb(new Error('path must be a string'));
+ });
+ }
+
+ var isFile = opts.isFile || function (file, cb) {
+ fs.stat(file, function (err, stat) {
+ if (err && err.code === 'ENOENT') cb(null, false)
+ else if (err) cb(err)
+ else cb(null, stat.isFile() || stat.isFIFO())
+ });
+ };
+ var readFile = opts.readFile || fs.readFile;
+
+ var extensions = opts.extensions || [ '.js' ];
+ var y = opts.basedir || path.dirname(caller());
+
+ opts.paths = opts.paths || [];
+
+ if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) {
+ var res = path.resolve(y, x);
+ if (x === '..') res += '/';
+ if (/\/$/.test(x) && res === y) {
+ loadAsDirectory(res, opts.package, onfile);
+ }
+ else loadAsFile(res, opts.package, onfile);
+ }
+ else loadNodeModules(x, y, function (err, n, pkg) {
+ if (err) cb(err)
+ else if (n) cb(null, n, pkg)
+ else if (core[x]) return cb(null, x);
+ else cb(new Error("Cannot find module '" + x + "' from '" + y + "'"))
+ });
+
+ function onfile (err, m, pkg) {
+ if (err) cb(err)
+ else if (m) cb(null, m, pkg)
+ else loadAsDirectory(res, function (err, d, pkg) {
+ if (err) cb(err)
+ else if (d) cb(null, d, pkg)
+ else cb(new Error("Cannot find module '" + x + "' from '" + y + "'"))
+ })
+ }
+
+ function loadAsFile (x, pkg, cb) {
+ if (typeof pkg === 'function') {
+ cb = pkg;
+ pkg = undefined;
+ }
+
+ var exts = [''].concat(extensions);
+ load(exts, x, pkg)
+
+ function load (exts, x, pkg) {
+ if (exts.length === 0) return cb(null, undefined, pkg);
+ var file = x + exts[0];
+
+ if (pkg) onpkg(null, pkg)
+ else loadpkg(path.dirname(file), onpkg);
+
+ function onpkg (err, pkg_, dir) {
+ pkg = pkg_;
+ if (err) return cb(err)
+ if (dir && pkg && opts.pathFilter) {
+ var rfile = path.relative(dir, file);
+ var rel = rfile.slice(0, rfile.length - exts[0].length);
+ var r = opts.pathFilter(pkg, x, rel);
+ if (r) return load(
+ [''].concat(extensions.slice()),
+ path.resolve(dir, r),
+ pkg
+ );
+ }
+ isFile(file, onex);
+ }
+ function onex (err, ex) {
+ if (err) cb(err)
+ else if (!ex) load(exts.slice(1), x, pkg)
+ else cb(null, file, pkg)
+ }
+ }
+ }
+
+ function loadpkg (dir, cb) {
+ if (dir === '' || dir === '/') return cb(null);
+ if (process.platform === 'win32' && /^\w:[\\\/]*$/.test(dir)) {
+ return cb(null);
+ }
+ if (/[\\\/]node_modules[\\\/]*$/.test(dir)) return cb(null);
+
+ var pkgfile = path.join(dir, 'package.json');
+ isFile(pkgfile, function (err, ex) {
+ // on err, ex is false
+ if (!ex) return loadpkg(
+ path.dirname(dir), cb
+ );
+
+ readFile(pkgfile, function (err, body) {
+ if (err) cb(err);
+ try { var pkg = JSON.parse(body) }
+ catch (err) {}
+
+ if (pkg && opts.packageFilter) {
+ pkg = opts.packageFilter(pkg, pkgfile);
+ }
+ cb(null, pkg, dir);
+ });
+ });
+ }
+
+ function loadAsDirectory (x, fpkg, cb) {
+ if (typeof fpkg === 'function') {
+ cb = fpkg;
+ fpkg = opts.package;
+ }
+
+ var pkgfile = path.join(x, '/package.json');
+ isFile(pkgfile, function (err, ex) {
+ if (err) return cb(err);
+ if (!ex) return loadAsFile(path.join(x, '/index'), fpkg, cb);
+
+ readFile(pkgfile, function (err, body) {
+ if (err) return cb(err);
+ try {
+ var pkg = JSON.parse(body);
+ }
+ catch (err) {}
+
+ if (opts.packageFilter) {
+ pkg = opts.packageFilter(pkg, pkgfile);
+ }
+
+ if (pkg.main) {
+ if (pkg.main === '.' || pkg.main === './'){
+ pkg.main = 'index'
+ }
+ loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {
+ if (err) return cb(err);
+ if (m) return cb(null, m, pkg);
+ if (!pkg) return loadAsFile(path.join(x, '/index'), pkg, cb);
+
+ var dir = path.resolve(x, pkg.main);
+ loadAsDirectory(dir, pkg, function (err, n, pkg) {
+ if (err) return cb(err);
+ if (n) return cb(null, n, pkg);
+ loadAsFile(path.join(x, '/index'), pkg, cb);
+ });
+ });
+ return;
+ }
+
+ loadAsFile(path.join(x, '/index'), pkg, cb);
+ });
+ });
+ }
+
+ function loadNodeModules (x, start, cb) {
+ (function process (dirs) {
+ if (dirs.length === 0) return cb(null, undefined);
+ var dir = dirs[0];
+
+ var file = path.join(dir, '/', x);
+ loadAsFile(file, undefined, onfile);
+
+ function onfile (err, m, pkg) {
+ if (err) return cb(err);
+ if (m) return cb(null, m, pkg);
+ loadAsDirectory(path.join(dir, '/', x), undefined, ondir);
+ }
+
+ function ondir (err, n, pkg) {
+ if (err) return cb(err);
+ if (n) return cb(null, n, pkg);
+ process(dirs.slice(1));
+ }
+ })(nodeModulesPaths(start, opts));
+ }
+};
diff --git a/node_modules/resolve/lib/caller.js b/node_modules/resolve/lib/caller.js
new file mode 100644
index 0000000..5536549
--- /dev/null
+++ b/node_modules/resolve/lib/caller.js
@@ -0,0 +1,8 @@
+module.exports = function () {
+ // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
+ var origPrepareStackTrace = Error.prepareStackTrace;
+ Error.prepareStackTrace = function (_, stack) { return stack };
+ var stack = (new Error()).stack;
+ Error.prepareStackTrace = origPrepareStackTrace;
+ return stack[2].getFileName();
+};
diff --git a/node_modules/resolve/lib/core.js b/node_modules/resolve/lib/core.js
new file mode 100644
index 0000000..ea4a6c8
--- /dev/null
+++ b/node_modules/resolve/lib/core.js
@@ -0,0 +1,4 @@
+module.exports = require('./core.json').reduce(function (acc, x) {
+ acc[x] = true;
+ return acc;
+}, {});
diff --git a/node_modules/resolve/lib/core.json b/node_modules/resolve/lib/core.json
new file mode 100644
index 0000000..28560f7
--- /dev/null
+++ b/node_modules/resolve/lib/core.json
@@ -0,0 +1,38 @@
+[
+ "assert",
+ "buffer_ieee754",
+ "buffer",
+ "child_process",
+ "cluster",
+ "console",
+ "constants",
+ "crypto",
+ "_debugger",
+ "dgram",
+ "dns",
+ "domain",
+ "events",
+ "freelist",
+ "fs",
+ "http",
+ "https",
+ "_linklist",
+ "module",
+ "net",
+ "os",
+ "path",
+ "punycode",
+ "querystring",
+ "readline",
+ "repl",
+ "stream",
+ "string_decoder",
+ "sys",
+ "timers",
+ "tls",
+ "tty",
+ "url",
+ "util",
+ "vm",
+ "zlib"
+]
diff --git a/node_modules/resolve/lib/node-modules-paths.js b/node_modules/resolve/lib/node-modules-paths.js
new file mode 100644
index 0000000..ce0a0d9
--- /dev/null
+++ b/node_modules/resolve/lib/node-modules-paths.js
@@ -0,0 +1,38 @@
+var path = require('path');
+
+module.exports = function (start, opts) {
+ var modules = opts.moduleDirectory
+ ? [].concat(opts.moduleDirectory)
+ : ['node_modules']
+ ;
+
+ // ensure that `start` is an absolute path at this point,
+ // resolving against the process' current working directory
+ start = path.resolve(start);
+
+ var prefix = '/';
+ if (/^([A-Za-z]:)/.test(start)) {
+ prefix = '';
+ } else if (/^\\\\/.test(start)) {
+ prefix = '\\\\';
+ }
+
+ var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\/+/;
+
+ var parts = start.split(splitRe);
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (modules.indexOf(parts[i]) !== -1) continue;
+ dirs = dirs.concat(modules.map(function(module_dir) {
+ return prefix + path.join(
+ path.join.apply(path, parts.slice(0, i + 1)),
+ module_dir
+ );
+ }));
+ }
+ if (process.platform === 'win32'){
+ dirs[dirs.length-1] = dirs[dirs.length-1].replace(":", ":\\");
+ }
+ return dirs.concat(opts.paths);
+}
diff --git a/node_modules/resolve/lib/sync.js b/node_modules/resolve/lib/sync.js
new file mode 100644
index 0000000..ef91edd
--- /dev/null
+++ b/node_modules/resolve/lib/sync.js
@@ -0,0 +1,81 @@
+var core = require('./core');
+var fs = require('fs');
+var path = require('path');
+var caller = require('./caller.js');
+var nodeModulesPaths = require('./node-modules-paths.js');
+
+module.exports = function (x, opts) {
+ if (!opts) opts = {};
+ var isFile = opts.isFile || function (file) {
+ try { var stat = fs.statSync(file) }
+ catch (err) { if (err && err.code === 'ENOENT') return false }
+ return stat.isFile() || stat.isFIFO();
+ };
+ var readFileSync = opts.readFileSync || fs.readFileSync;
+
+ var extensions = opts.extensions || [ '.js' ];
+ var y = opts.basedir || path.dirname(caller());
+
+ opts.paths = opts.paths || [];
+
+ if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) {
+ var res = path.resolve(y, x);
+ if (x === '..') res += '/';
+ var m = loadAsFileSync(res) || loadAsDirectorySync(res);
+ if (m) return m;
+ } else {
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+ }
+
+ if (core[x]) return x;
+
+ throw new Error("Cannot find module '" + x + "' from '" + y + "'");
+
+ function loadAsFileSync (x) {
+ if (isFile(x)) {
+ return x;
+ }
+
+ for (var i = 0; i < extensions.length; i++) {
+ var file = x + extensions[i];
+ if (isFile(file)) {
+ return file;
+ }
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ var pkgfile = path.join(x, '/package.json');
+ if (isFile(pkgfile)) {
+ var body = readFileSync(pkgfile, 'utf8');
+ try {
+ var pkg = JSON.parse(body);
+ if (opts.packageFilter) {
+ pkg = opts.packageFilter(pkg, x);
+ }
+
+ if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ var n = loadAsDirectorySync(path.resolve(x, pkg.main));
+ if (n) return n;
+ }
+ }
+ catch (err) {}
+ }
+
+ return loadAsFileSync(path.join( x, '/index'));
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPaths(start, opts);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(path.join( dir, '/', x));
+ if (m) return m;
+ var n = loadAsDirectorySync(path.join( dir, '/', x ));
+ if (n) return n;
+ }
+ }
+};
diff --git a/node_modules/resolve/package.json b/node_modules/resolve/package.json
new file mode 100644
index 0000000..83b20ea
--- /dev/null
+++ b/node_modules/resolve/package.json
@@ -0,0 +1,90 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "resolve@~1.1.7",
+ "scope": null,
+ "escapedName": "resolve",
+ "name": "resolve",
+ "rawSpec": "~1.1.7",
+ "spec": ">=1.1.7 <1.2.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "resolve@>=1.1.7 <1.2.0",
+ "_id": "resolve@1.1.7",
+ "_inCache": true,
+ "_location": "/resolve",
+ "_nodeVersion": "4.2.1",
+ "_npmUser": {
+ "name": "substack",
+ "email": "substack@gmail.com"
+ },
+ "_npmVersion": "3.4.1",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "resolve@~1.1.7",
+ "scope": null,
+ "escapedName": "resolve",
+ "name": "resolve",
+ "rawSpec": "~1.1.7",
+ "spec": ">=1.1.7 <1.2.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "_shasum": "203114d82ad2c5ed9e8e0411b3932875e889e97b",
+ "_shrinkwrap": null,
+ "_spec": "resolve@~1.1.7",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/node-resolve/issues"
+ },
+ "dependencies": {},
+ "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously",
+ "devDependencies": {
+ "tap": "0.4.13",
+ "tape": "^3.5.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "203114d82ad2c5ed9e8e0411b3932875e889e97b",
+ "tarball": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz"
+ },
+ "gitHead": "bb37f0d4400e4d7835375be4bd3ad1264bac3689",
+ "homepage": "https://github.com/substack/node-resolve#readme",
+ "keywords": [
+ "resolve",
+ "require",
+ "node",
+ "module"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "name": "resolve",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/node-resolve.git"
+ },
+ "scripts": {
+ "test": "tape test/*.js"
+ },
+ "version": "1.1.7"
+}
diff --git a/node_modules/resolve/readme.markdown b/node_modules/resolve/readme.markdown
new file mode 100644
index 0000000..4fab9b0
--- /dev/null
+++ b/node_modules/resolve/readme.markdown
@@ -0,0 +1,148 @@
+# resolve
+
+implements the [node `require.resolve()`
+algorithm](http://nodejs.org/docs/v0.4.8/api/all.html#all_Together...)
+such that you can `require.resolve()` on behalf of a file asynchronously and
+synchronously
+
+[](http://travis-ci.org/substack/node-resolve)
+
+# example
+
+asynchronously resolve:
+
+``` js
+var resolve = require('resolve');
+resolve('tap', { basedir: __dirname }, function (err, res) {
+ if (err) console.error(err)
+ else console.log(res)
+});
+```
+
+```
+$ node example/async.js
+/home/substack/projects/node-resolve/node_modules/tap/lib/main.js
+```
+
+synchronously resolve:
+
+``` js
+var resolve = require('resolve');
+var res = resolve.sync('tap', { basedir: __dirname });
+console.log(res);
+```
+
+```
+$ node example/sync.js
+/home/substack/projects/node-resolve/node_modules/tap/lib/main.js
+```
+
+# methods
+
+``` js
+var resolve = require('resolve')
+```
+
+## resolve(id, opts={}, cb)
+
+Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`.
+
+options are:
+
+* opts.basedir - directory to begin resolving from
+
+* opts.package - `package.json` data applicable to the module being loaded
+
+* opts.extensions - array of file extensions to search in order
+
+* opts.readFile - how to read files asynchronously
+
+* opts.isFile - function to asynchronously test whether a file exists
+
+* opts.packageFilter - transform the parsed package.json contents before looking
+at the "main" field
+
+* opts.pathFilter(pkg, path, relativePath) - transform a path within a package
+ * pkg - package data
+ * path - the path being resolved
+ * relativePath - the path relative from the package.json location
+ * returns - a relative path that will be joined from the package.json location
+
+* opts.paths - require.paths array to use if nothing is found on the normal
+node_modules recursive walk (probably don't use this)
+
+* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"`
+
+default `opts` values:
+
+``` javascript
+{
+ paths: [],
+ basedir: __dirname,
+ extensions: [ '.js' ],
+ readFile: fs.readFile,
+ isFile: function (file, cb) {
+ fs.stat(file, function (err, stat) {
+ if (err && err.code === 'ENOENT') cb(null, false)
+ else if (err) cb(err)
+ else cb(null, stat.isFile())
+ });
+ },
+ moduleDirectory: 'node_modules'
+}
+```
+
+## resolve.sync(id, opts)
+
+Synchronously resolve the module path string `id`, returning the result and
+throwing an error when `id` can't be resolved.
+
+options are:
+
+* opts.basedir - directory to begin resolving from
+
+* opts.extensions - array of file extensions to search in order
+
+* opts.readFile - how to read files synchronously
+
+* opts.isFile - function to synchronously test whether a file exists
+
+* `opts.packageFilter(pkg, pkgfile)` - transform the parsed package.json
+* contents before looking at the "main" field
+
+* opts.paths - require.paths array to use if nothing is found on the normal
+node_modules recursive walk (probably don't use this)
+
+* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"`
+
+default `opts` values:
+
+``` javascript
+{
+ paths: [],
+ basedir: __dirname,
+ extensions: [ '.js' ],
+ readFileSync: fs.readFileSync,
+ isFile: function (file) {
+ try { return fs.statSync(file).isFile() }
+ catch (e) { return false }
+ },
+ moduleDirectory: 'node_modules'
+}
+````
+
+## resolve.isCore(pkg)
+
+Return whether a package is in core.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install resolve
+```
+
+# license
+
+MIT
diff --git a/node_modules/resolve/test/core.js b/node_modules/resolve/test/core.js
new file mode 100644
index 0000000..4a56682
--- /dev/null
+++ b/node_modules/resolve/test/core.js
@@ -0,0 +1,12 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('core modules', function (t) {
+ t.ok(resolve.isCore('fs'));
+ t.ok(resolve.isCore('net'));
+ t.ok(resolve.isCore('http'));
+
+ t.ok(!resolve.isCore('seq'));
+ t.ok(!resolve.isCore('../'));
+ t.end();
+});
diff --git a/node_modules/resolve/test/dotdot.js b/node_modules/resolve/test/dotdot.js
new file mode 100644
index 0000000..b876772
--- /dev/null
+++ b/node_modules/resolve/test/dotdot.js
@@ -0,0 +1,29 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('dotdot', function (t) {
+ t.plan(4);
+ var dir = __dirname + '/dotdot/abc';
+
+ resolve('..', { basedir : dir }, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, __dirname + '/dotdot/index.js');
+ });
+
+ resolve('.', { basedir : dir }, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, dir + '/index.js');
+ });
+});
+
+test('dotdot sync', function (t) {
+ t.plan(2);
+ var dir = __dirname + '/dotdot/abc';
+
+ var a = resolve.sync('..', { basedir : dir });
+ t.equal(a, __dirname + '/dotdot/index.js');
+
+ var b = resolve.sync('.', { basedir : dir });
+ t.equal(b, dir + '/index.js');
+});
diff --git a/node_modules/resolve/test/dotdot/abc/index.js b/node_modules/resolve/test/dotdot/abc/index.js
new file mode 100644
index 0000000..67f2534
--- /dev/null
+++ b/node_modules/resolve/test/dotdot/abc/index.js
@@ -0,0 +1,2 @@
+var x = require('..');
+console.log(x);
diff --git a/node_modules/resolve/test/dotdot/index.js b/node_modules/resolve/test/dotdot/index.js
new file mode 100644
index 0000000..afec736
--- /dev/null
+++ b/node_modules/resolve/test/dotdot/index.js
@@ -0,0 +1 @@
+module.exports = 'whatever'
diff --git a/node_modules/resolve/test/faulty_basedir.js b/node_modules/resolve/test/faulty_basedir.js
new file mode 100644
index 0000000..2440818
--- /dev/null
+++ b/node_modules/resolve/test/faulty_basedir.js
@@ -0,0 +1,17 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+// not sure what's up with this test anymore
+if (process.platform !== 'win32') return;
+
+test('faulty basedir must produce error in windows', function (t) {
+ t.plan(1);
+
+ var resolverDir = 'C:\\a\\b\\c\\d';
+
+ resolve('tape/lib/test.js', { basedir : resolverDir }, function (err, res, pkg) {
+ t.equal(true, !!err);
+ });
+
+});
diff --git a/node_modules/resolve/test/filter.js b/node_modules/resolve/test/filter.js
new file mode 100644
index 0000000..07c38f3
--- /dev/null
+++ b/node_modules/resolve/test/filter.js
@@ -0,0 +1,18 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('filter', function (t) {
+ t.plan(2);
+ var dir = __dirname + '/resolver';
+ resolve('./baz', {
+ basedir : dir,
+ packageFilter : function (pkg) {
+ pkg.main = 'doom';
+ return pkg;
+ }
+ }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/baz/doom.js');
+ t.equal(pkg.main, 'doom');
+ });
+});
diff --git a/node_modules/resolve/test/filter_sync.js b/node_modules/resolve/test/filter_sync.js
new file mode 100644
index 0000000..3f89b79
--- /dev/null
+++ b/node_modules/resolve/test/filter_sync.js
@@ -0,0 +1,15 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('filter', function (t) {
+ var dir = __dirname + '/resolver';
+ var res = resolve.sync('./baz', {
+ basedir : dir,
+ packageFilter : function (pkg) {
+ pkg.main = 'doom'
+ return pkg;
+ }
+ });
+ t.equal(res, dir + '/baz/doom.js');
+ t.end();
+});
diff --git a/node_modules/resolve/test/mock.js b/node_modules/resolve/test/mock.js
new file mode 100644
index 0000000..1cf3b12
--- /dev/null
+++ b/node_modules/resolve/test/mock.js
@@ -0,0 +1,142 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('mock', function (t) {
+ t.plan(6);
+
+ var files = {
+ '/foo/bar/baz.js' : 'beep'
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ isFile : function (file, cb) {
+ cb(null, files.hasOwnProperty(file));
+ },
+ readFile : function (file, cb) {
+ cb(null, files[file]);
+ }
+ }
+ }
+
+ resolve('./baz', opts('/foo/bar'), function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, '/foo/bar/baz.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, '/foo/bar/baz.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('baz', opts('/foo/bar'), function (err, res) {
+ t.equal(err.message, "Cannot find module 'baz' from '/foo/bar'");
+ });
+
+ resolve('../baz', opts('/foo/bar'), function (err, res) {
+ t.equal(err.message, "Cannot find module '../baz' from '/foo/bar'");
+ });
+});
+
+test('mock from package', function (t) {
+ t.plan(6);
+
+ var files = {
+ '/foo/bar/baz.js' : 'beep'
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ package : { main: 'bar' },
+ isFile : function (file, cb) {
+ cb(null, files.hasOwnProperty(file));
+ },
+ readFile : function (file, cb) {
+ cb(null, files[file]);
+ }
+ }
+ }
+
+ resolve('./baz', opts('/foo/bar'), function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, '/foo/bar/baz.js');
+ t.equal(pkg.main, 'bar');
+ });
+
+ resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, '/foo/bar/baz.js');
+ t.equal(pkg.main, 'bar');
+ });
+
+ resolve('baz', opts('/foo/bar'), function (err, res) {
+ t.equal(err.message, "Cannot find module 'baz' from '/foo/bar'");
+ });
+
+ resolve('../baz', opts('/foo/bar'), function (err, res) {
+ t.equal(err.message, "Cannot find module '../baz' from '/foo/bar'");
+ });
+});
+
+test('mock package', function (t) {
+ t.plan(2);
+
+ var files = {
+ '/foo/node_modules/bar/baz.js' : 'beep',
+ '/foo/node_modules/bar/package.json' : JSON.stringify({
+ main : './baz.js'
+ })
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ isFile : function (file, cb) {
+ cb(null, files.hasOwnProperty(file));
+ },
+ readFile : function (file, cb) {
+ cb(null, files[file]);
+ }
+ }
+ }
+
+ resolve('bar', opts('/foo'), function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, '/foo/node_modules/bar/baz.js');
+ t.equal(pkg.main, './baz.js');
+ });
+});
+
+test('mock package from package', function (t) {
+ t.plan(2);
+
+ var files = {
+ '/foo/node_modules/bar/baz.js' : 'beep',
+ '/foo/node_modules/bar/package.json' : JSON.stringify({
+ main : './baz.js'
+ })
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ package : { main: 'bar' },
+ isFile : function (file, cb) {
+ cb(null, files.hasOwnProperty(file));
+ },
+ readFile : function (file, cb) {
+ cb(null, files[file]);
+ }
+ }
+ }
+
+ resolve('bar', opts('/foo'), function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, '/foo/node_modules/bar/baz.js');
+ t.equal(pkg.main, './baz.js');
+ });
+});
diff --git a/node_modules/resolve/test/mock_sync.js b/node_modules/resolve/test/mock_sync.js
new file mode 100644
index 0000000..abfd289
--- /dev/null
+++ b/node_modules/resolve/test/mock_sync.js
@@ -0,0 +1,68 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('mock', function (t) {
+ t.plan(4);
+
+ var files = {
+ '/foo/bar/baz.js' : 'beep'
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ isFile : function (file) {
+ return files.hasOwnProperty(file)
+ },
+ readFileSync : function (file) {
+ return files[file]
+ }
+ }
+ }
+
+ t.equal(
+ resolve.sync('./baz', opts('/foo/bar')),
+ '/foo/bar/baz.js'
+ );
+
+ t.equal(
+ resolve.sync('./baz.js', opts('/foo/bar')),
+ '/foo/bar/baz.js'
+ );
+
+ t.throws(function () {
+ resolve.sync('baz', opts('/foo/bar'));
+ });
+
+ t.throws(function () {
+ resolve.sync('../baz', opts('/foo/bar'));
+ });
+});
+
+test('mock package', function (t) {
+ t.plan(1);
+
+ var files = {
+ '/foo/node_modules/bar/baz.js' : 'beep',
+ '/foo/node_modules/bar/package.json' : JSON.stringify({
+ main : './baz.js'
+ })
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ isFile : function (file) {
+ return files.hasOwnProperty(file)
+ },
+ readFileSync : function (file) {
+ return files[file]
+ }
+ }
+ }
+
+ t.equal(
+ resolve.sync('bar', opts('/foo')),
+ '/foo/node_modules/bar/baz.js'
+ );
+});
diff --git a/node_modules/resolve/test/module_dir.js b/node_modules/resolve/test/module_dir.js
new file mode 100644
index 0000000..06395d8
--- /dev/null
+++ b/node_modules/resolve/test/module_dir.js
@@ -0,0 +1,56 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('moduleDirectory strings', function (t) {
+ t.plan(4);
+ var dir = __dirname + '/module_dir';
+ var xopts = {
+ basedir : dir,
+ moduleDirectory: 'xmodules'
+ };
+ resolve('aaa', xopts, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, dir + '/xmodules/aaa/index.js');
+ });
+
+ var yopts = {
+ basedir : dir,
+ moduleDirectory: 'ymodules'
+ };
+ resolve('aaa', yopts, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, dir + '/ymodules/aaa/index.js');
+ });
+});
+
+test('moduleDirectory array', function (t) {
+ t.plan(6);
+ var dir = __dirname + '/module_dir';
+ var aopts = {
+ basedir : dir,
+ moduleDirectory: [ 'xmodules', 'ymodules', 'zmodules' ]
+ };
+ resolve('aaa', aopts, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, dir + '/xmodules/aaa/index.js');
+ });
+
+ var bopts = {
+ basedir : dir,
+ moduleDirectory: [ 'zmodules', 'ymodules', 'xmodules' ]
+ };
+ resolve('aaa', bopts, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, dir + '/ymodules/aaa/index.js');
+ });
+
+ var copts = {
+ basedir : dir,
+ moduleDirectory: [ 'xmodules', 'ymodules', 'zmodules' ]
+ };
+ resolve('bbb', copts, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, dir + '/zmodules/bbb/main.js');
+ });
+});
diff --git a/node_modules/resolve/test/module_dir/xmodules/aaa/index.js b/node_modules/resolve/test/module_dir/xmodules/aaa/index.js
new file mode 100644
index 0000000..55cd18c
--- /dev/null
+++ b/node_modules/resolve/test/module_dir/xmodules/aaa/index.js
@@ -0,0 +1 @@
+module.exports = function (x) { return x * 100 }
diff --git a/node_modules/resolve/test/module_dir/ymodules/aaa/index.js b/node_modules/resolve/test/module_dir/ymodules/aaa/index.js
new file mode 100644
index 0000000..651aca8
--- /dev/null
+++ b/node_modules/resolve/test/module_dir/ymodules/aaa/index.js
@@ -0,0 +1 @@
+module.exports = function (x) { return x + 100 }
diff --git a/node_modules/resolve/test/module_dir/zmodules/bbb/main.js b/node_modules/resolve/test/module_dir/zmodules/bbb/main.js
new file mode 100644
index 0000000..4325a0b
--- /dev/null
+++ b/node_modules/resolve/test/module_dir/zmodules/bbb/main.js
@@ -0,0 +1 @@
+module.exports = function (n) { return n * 111 }
diff --git a/node_modules/resolve/test/module_dir/zmodules/bbb/package.json b/node_modules/resolve/test/module_dir/zmodules/bbb/package.json
new file mode 100644
index 0000000..c13b8cf
--- /dev/null
+++ b/node_modules/resolve/test/module_dir/zmodules/bbb/package.json
@@ -0,0 +1,3 @@
+{
+ "main": "main.js"
+}
diff --git a/node_modules/resolve/test/node_path.js b/node_modules/resolve/test/node_path.js
new file mode 100644
index 0000000..2407189
--- /dev/null
+++ b/node_modules/resolve/test/node_path.js
@@ -0,0 +1,48 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('$NODE_PATH', function (t) {
+ t.plan(4);
+
+ resolve('aaa', {
+ paths: [
+ __dirname + '/node_path/x',
+ __dirname + '/node_path/y'
+ ],
+ basedir: __dirname,
+ }, function (err, res) {
+ t.equal(res, __dirname + '/node_path/x/aaa/index.js');
+ });
+
+ resolve('bbb', {
+ paths: [
+ __dirname + '/node_path/x',
+ __dirname + '/node_path/y'
+ ],
+ basedir: __dirname,
+ }, function (err, res) {
+ t.equal(res, __dirname + '/node_path/y/bbb/index.js');
+ });
+
+ resolve('ccc', {
+ paths: [
+ __dirname + '/node_path/x',
+ __dirname + '/node_path/y'
+ ],
+ basedir: __dirname,
+ }, function (err, res) {
+ t.equal(res, __dirname + '/node_path/x/ccc/index.js');
+ });
+
+ // ensure that relative paths still resolve against the
+ // regular `node_modules` correctly
+ resolve('tap', {
+ paths: [
+ 'node_path',
+ ],
+ basedir: 'node_path/x',
+ }, function (err, res) {
+ t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap/lib/main.js'));
+ });
+});
diff --git a/node_modules/resolve/test/node_path/x/aaa/index.js b/node_modules/resolve/test/node_path/x/aaa/index.js
new file mode 100644
index 0000000..1ea5913
--- /dev/null
+++ b/node_modules/resolve/test/node_path/x/aaa/index.js
@@ -0,0 +1 @@
+module.exports = 'A'
diff --git a/node_modules/resolve/test/node_path/x/ccc/index.js b/node_modules/resolve/test/node_path/x/ccc/index.js
new file mode 100644
index 0000000..f186fa7
--- /dev/null
+++ b/node_modules/resolve/test/node_path/x/ccc/index.js
@@ -0,0 +1 @@
+module.exports = 'C'
diff --git a/node_modules/resolve/test/node_path/y/bbb/index.js b/node_modules/resolve/test/node_path/y/bbb/index.js
new file mode 100644
index 0000000..e22dd83
--- /dev/null
+++ b/node_modules/resolve/test/node_path/y/bbb/index.js
@@ -0,0 +1 @@
+module.exports = 'B'
diff --git a/node_modules/resolve/test/node_path/y/ccc/index.js b/node_modules/resolve/test/node_path/y/ccc/index.js
new file mode 100644
index 0000000..d0043d1
--- /dev/null
+++ b/node_modules/resolve/test/node_path/y/ccc/index.js
@@ -0,0 +1 @@
+module.exports = 'CY'
diff --git a/node_modules/resolve/test/nonstring.js b/node_modules/resolve/test/nonstring.js
new file mode 100644
index 0000000..ef63c40
--- /dev/null
+++ b/node_modules/resolve/test/nonstring.js
@@ -0,0 +1,9 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('nonstring', function (t) {
+ t.plan(1);
+ resolve(555, function (err, res, pkg) {
+ t.ok(err);
+ });
+});
diff --git a/node_modules/resolve/test/pathfilter.js b/node_modules/resolve/test/pathfilter.js
new file mode 100644
index 0000000..142f94d
--- /dev/null
+++ b/node_modules/resolve/test/pathfilter.js
@@ -0,0 +1,35 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('#62: deep module references and the pathFilter', function(t){
+ t.plan(9);
+
+ var resolverDir = __dirname + '/pathfilter/deep_ref';
+ var pathFilter = function(pkg, x, remainder){
+ t.equal(pkg.version, "1.2.3");
+ t.equal(x, resolverDir + '/node_modules/deep/ref');
+ t.equal(remainder, "ref");
+ return "alt";
+ };
+
+ resolve('deep/ref', { basedir : resolverDir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+
+ t.equal(pkg.version, "1.2.3");
+ t.equal(res, resolverDir + '/node_modules/deep/ref.js');
+ });
+
+ resolve('deep/deeper/ref', { basedir: resolverDir },
+ function(err, res, pkg) {
+ if(err) t.fail(err);
+ t.notEqual(pkg, undefined);
+ t.equal(pkg.version, "1.2.3");
+ t.equal(res, resolverDir + '/node_modules/deep/deeper/ref.js');
+ });
+
+ resolve('deep/ref', { basedir : resolverDir, pathFilter : pathFilter },
+ function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, resolverDir + '/node_modules/deep/alt.js');
+ });
+});
diff --git a/node_modules/resolve/test/pathfilter/deep_ref/main.js b/node_modules/resolve/test/pathfilter/deep_ref/main.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/alt.js b/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/alt.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/deeper/ref.js b/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/deeper/ref.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/package.json b/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/package.json
new file mode 100644
index 0000000..fe4b408
--- /dev/null
+++ b/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "deep",
+ "version": "1.2.3"
+}
diff --git a/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/ref.js b/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/ref.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/precedence.js b/node_modules/resolve/test/precedence.js
new file mode 100644
index 0000000..c716f0e
--- /dev/null
+++ b/node_modules/resolve/test/precedence.js
@@ -0,0 +1,23 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('precedence', function (t) {
+ t.plan(3);
+ var dir = path.join(__dirname, 'precedence/aaa');
+
+ resolve('./', { basedir : dir }, function (err, res, pkg) {
+ t.ifError(err);
+ t.equal(res, path.join(dir, 'index.js'));
+ t.equal(pkg.name, 'resolve');
+ });
+});
+
+test('./ should not load ${dir}.js', function (t) {
+ t.plan(1);
+ var dir = path.join(__dirname, 'precedence/bbb');
+
+ resolve('./', { basedir : dir }, function (err, res, pkg) {
+ t.ok(err);
+ });
+});
diff --git a/node_modules/resolve/test/precedence/aaa.js b/node_modules/resolve/test/precedence/aaa.js
new file mode 100644
index 0000000..a182397
--- /dev/null
+++ b/node_modules/resolve/test/precedence/aaa.js
@@ -0,0 +1 @@
+module.exports = 'wtf'
diff --git a/node_modules/resolve/test/precedence/aaa/index.js b/node_modules/resolve/test/precedence/aaa/index.js
new file mode 100644
index 0000000..993b03c
--- /dev/null
+++ b/node_modules/resolve/test/precedence/aaa/index.js
@@ -0,0 +1 @@
+module.exports = 'okok'
diff --git a/node_modules/resolve/test/precedence/aaa/main.js b/node_modules/resolve/test/precedence/aaa/main.js
new file mode 100644
index 0000000..db38959
--- /dev/null
+++ b/node_modules/resolve/test/precedence/aaa/main.js
@@ -0,0 +1 @@
+console.log(require('./'))
diff --git a/node_modules/resolve/test/precedence/bbb.js b/node_modules/resolve/test/precedence/bbb.js
new file mode 100644
index 0000000..c8a9996
--- /dev/null
+++ b/node_modules/resolve/test/precedence/bbb.js
@@ -0,0 +1 @@
+module.exports '>_<'
diff --git a/node_modules/resolve/test/precedence/bbb/main.js b/node_modules/resolve/test/precedence/bbb/main.js
new file mode 100644
index 0000000..716b81d
--- /dev/null
+++ b/node_modules/resolve/test/precedence/bbb/main.js
@@ -0,0 +1 @@
+console.log(require('./')); // should throw
diff --git a/node_modules/resolve/test/resolver.js b/node_modules/resolve/test/resolver.js
new file mode 100644
index 0000000..5bbb05f
--- /dev/null
+++ b/node_modules/resolve/test/resolver.js
@@ -0,0 +1,281 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('async foo', function (t) {
+ t.plan(9);
+ var dir = __dirname + '/resolver';
+
+ resolve('./foo', { basedir : dir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/foo.js');
+ t.equal(pkg.name, 'resolve');
+ });
+
+ resolve('./foo.js', { basedir : dir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/foo.js');
+ t.equal(pkg.name, 'resolve');
+ });
+
+ resolve('./foo', { basedir : dir, package: { main: 'resolver' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/foo.js');
+ t.equal(pkg.main, 'resolver');
+ });
+
+ resolve('./foo.js', { basedir : dir, package: { main: 'resolver' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/foo.js');
+ t.equal(pkg.main, 'resolver');
+ });
+
+ resolve('foo', { basedir : dir }, function (err) {
+ t.equal(err.message, "Cannot find module 'foo' from '" + path.resolve(dir) + "'");
+ });
+});
+
+test('bar', function (t) {
+ t.plan(6);
+ var dir = __dirname + '/resolver';
+
+ resolve('foo', { basedir : dir + '/bar' }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/bar/node_modules/foo/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('foo', { basedir : dir + '/bar' }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/bar/node_modules/foo/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('foo', { basedir : dir + '/bar', package: { main: 'bar' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/bar/node_modules/foo/index.js');
+ t.equal(pkg, undefined);
+ });
+});
+
+test('baz', function (t) {
+ t.plan(4);
+ var dir = __dirname + '/resolver';
+
+ resolve('./baz', { basedir : dir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/baz/quux.js');
+ t.equal(pkg.main, 'quux.js');
+ });
+
+ resolve('./baz', { basedir : dir, package: { main: 'resolver' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/baz/quux.js');
+ t.equal(pkg.main, 'quux.js');
+ });
+});
+
+test('biz', function (t) {
+ t.plan(24);
+ var dir = __dirname + '/resolver/biz/node_modules';
+
+ resolve('./grux', { basedir : dir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/grux/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('./grux', { basedir : dir, package: { main: 'biz' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/grux/index.js');
+ t.equal(pkg.main, 'biz');
+ });
+
+ resolve('./garply', { basedir : dir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/garply/lib/index.js');
+ t.equal(pkg.main, './lib');
+ });
+
+ resolve('./garply', { basedir : dir, package: { main: 'biz' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/garply/lib/index.js');
+ t.equal(pkg.main, './lib');
+ });
+
+ resolve('tiv', { basedir : dir + '/grux' }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/tiv/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('tiv', { basedir : dir + '/grux', package: { main: 'grux' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/tiv/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('tiv', { basedir : dir + '/garply' }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/tiv/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('tiv', { basedir : dir + '/garply', package: { main: './lib' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/tiv/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('grux', { basedir : dir + '/tiv' }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/grux/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('grux', { basedir : dir + '/tiv', package: { main: 'tiv' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/grux/index.js');
+ t.equal(pkg, undefined);
+ });
+
+ resolve('garply', { basedir : dir + '/tiv' }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/garply/lib/index.js');
+ t.equal(pkg.main, './lib');
+ });
+
+ resolve('garply', { basedir : dir + '/tiv', package: { main: 'tiv' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/garply/lib/index.js');
+ t.equal(pkg.main, './lib');
+ });
+});
+
+test('quux', function (t) {
+ t.plan(2);
+ var dir = __dirname + '/resolver/quux';
+
+ resolve('./foo', { basedir : dir, package: { main: 'quux' } }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/foo/index.js');
+ t.equal(pkg.main, 'quux');
+ });
+});
+
+test('normalize', function (t) {
+ t.plan(2);
+ var dir = __dirname + '/resolver/biz/node_modules/grux';
+
+ resolve('../grux', { basedir : dir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/index.js');
+ t.equal(pkg, undefined);
+ });
+});
+
+test('cup', function (t) {
+ t.plan(3);
+ var dir = __dirname + '/resolver';
+
+ resolve('./cup', { basedir : dir, extensions : [ '.js', '.coffee' ] },
+ function (err, res) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/cup.coffee');
+ });
+
+ resolve('./cup.coffee', { basedir : dir }, function (err, res) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/cup.coffee');
+ });
+
+ resolve('./cup', { basedir : dir, extensions : [ '.js' ] },
+ function (err, res) {
+ t.equal(err.message, "Cannot find module './cup' from '" + path.resolve(dir) + "'");
+ });
+});
+
+test('mug', function (t) {
+ t.plan(3);
+ var dir = __dirname + '/resolver';
+
+ resolve('./mug', { basedir : dir }, function (err, res) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/mug.js');
+ });
+
+ resolve('./mug', { basedir : dir, extensions : [ '.coffee', '.js' ] },
+ function (err, res) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/mug.coffee');
+ });
+
+ resolve('./mug', { basedir : dir, extensions : [ '.js', '.coffee' ] },
+ function (err, res) {
+ t.equal(res, dir + '/mug.js');
+ });
+});
+
+test('other path', function (t) {
+ t.plan(4);
+ var resolverDir = __dirname + '/resolver';
+ var dir = resolverDir + '/bar';
+ var otherDir = resolverDir + '/other_path';
+
+ resolve('root', { basedir : dir, paths: [otherDir] }, function (err, res) {
+ if (err) t.fail(err);
+ t.equal(res, resolverDir + '/other_path/root.js');
+ });
+
+ resolve('lib/other-lib', { basedir : dir, paths: [otherDir] },
+ function (err, res) {
+ if (err) t.fail(err);
+ t.equal(res, resolverDir + '/other_path/lib/other-lib.js');
+ });
+
+ resolve('root', { basedir : dir, }, function (err, res) {
+ t.equal(err.message, "Cannot find module 'root' from '" + path.resolve(dir) + "'");
+ });
+
+ resolve('zzz', { basedir : dir, paths: [otherDir] }, function (err, res) {
+ t.equal(err.message, "Cannot find module 'zzz' from '" + path.resolve(dir) + "'");
+ });
+});
+
+test('incorrect main', function (t) {
+ t.plan(1)
+
+ var resolverDir = __dirname + '/resolver';
+ var dir = resolverDir + '/incorrect_main';
+
+ resolve('./incorrect_main', { basedir : resolverDir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, dir + '/index.js');
+ });
+});
+
+test('without basedir', function (t) {
+ t.plan(1);
+
+ var dir = __dirname + '/resolver/without_basedir';
+ var tester = require(dir + '/main.js');
+
+ tester(t, function (err, res, pkg){
+ if (err) {
+ t.fail(err);
+ } else {
+ t.equal(res, dir + '/node_modules/mymodule.js');
+ }
+ });
+});
+
+test('#25: node modules with the same name as node stdlib modules', function (t) {
+ t.plan(1);
+
+ var resolverDir = __dirname + '/resolver/punycode';
+
+ resolve('punycode', { basedir : resolverDir }, function (err, res, pkg) {
+ if (err) t.fail(err);
+ t.equal(res, resolverDir + '/node_modules/punycode/index.js');
+ });
+});
diff --git a/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js b/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/resolve/test/resolver/baz/doom.js b/node_modules/resolve/test/resolver/baz/doom.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/resolver/baz/package.json b/node_modules/resolve/test/resolver/baz/package.json
new file mode 100644
index 0000000..6b81dcd
--- /dev/null
+++ b/node_modules/resolve/test/resolver/baz/package.json
@@ -0,0 +1,3 @@
+{
+ "main" : "quux.js"
+}
diff --git a/node_modules/resolve/test/resolver/baz/quux.js b/node_modules/resolve/test/resolver/baz/quux.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/resolve/test/resolver/baz/quux.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js b/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js
new file mode 100644
index 0000000..0379e29
--- /dev/null
+++ b/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js
@@ -0,0 +1 @@
+module.exports = 'hello garply';
diff --git a/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json b/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json
new file mode 100644
index 0000000..babaac5
--- /dev/null
+++ b/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json
@@ -0,0 +1,3 @@
+{
+ "main" : "./lib"
+}
diff --git a/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js b/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js
new file mode 100644
index 0000000..4996055
--- /dev/null
+++ b/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js
@@ -0,0 +1 @@
+module.exports = require('tiv') * 100;
diff --git a/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js b/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js
new file mode 100644
index 0000000..690aad3
--- /dev/null
+++ b/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js
@@ -0,0 +1 @@
+module.exports = 3;
diff --git a/node_modules/resolve/test/resolver/cup.coffee b/node_modules/resolve/test/resolver/cup.coffee
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/node_modules/resolve/test/resolver/cup.coffee
@@ -0,0 +1 @@
+
diff --git a/node_modules/resolve/test/resolver/foo.js b/node_modules/resolve/test/resolver/foo.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/resolve/test/resolver/foo.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/resolve/test/resolver/incorrect_main/index.js b/node_modules/resolve/test/resolver/incorrect_main/index.js
new file mode 100644
index 0000000..bc1fb0a
--- /dev/null
+++ b/node_modules/resolve/test/resolver/incorrect_main/index.js
@@ -0,0 +1,2 @@
+// this is the actual main file 'index.js', not 'wrong.js' like the package.json would indicate
+module.exports = 1;
diff --git a/node_modules/resolve/test/resolver/incorrect_main/package.json b/node_modules/resolve/test/resolver/incorrect_main/package.json
new file mode 100644
index 0000000..1592ed3
--- /dev/null
+++ b/node_modules/resolve/test/resolver/incorrect_main/package.json
@@ -0,0 +1,3 @@
+{
+ "main" : "wrong.js"
+}
diff --git a/node_modules/resolve/test/resolver/mug.coffee b/node_modules/resolve/test/resolver/mug.coffee
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/resolver/mug.js b/node_modules/resolve/test/resolver/mug.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/resolver/other_path/lib/other-lib.js b/node_modules/resolve/test/resolver/other_path/lib/other-lib.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/resolver/other_path/root.js b/node_modules/resolve/test/resolver/other_path/root.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/resolver/punycode/node_modules/punycode/index.js b/node_modules/resolve/test/resolver/punycode/node_modules/punycode/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/resolve/test/resolver/quux/foo/index.js b/node_modules/resolve/test/resolver/quux/foo/index.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/resolve/test/resolver/quux/foo/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/resolve/test/resolver/without_basedir/main.js b/node_modules/resolve/test/resolver/without_basedir/main.js
new file mode 100644
index 0000000..5f211e9
--- /dev/null
+++ b/node_modules/resolve/test/resolver/without_basedir/main.js
@@ -0,0 +1,6 @@
+resolve = require('../../../');
+
+module.exports = function(t, cb) {
+ resolve('mymodule', null, cb);
+}
+
diff --git a/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js b/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js
new file mode 100644
index 0000000..2b58aa4
--- /dev/null
+++ b/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js
@@ -0,0 +1 @@
+module.exports = "The tools we use have a profound (and devious!) influence on our thinking habits, and, therefore, on our thinking abilities.- E. Dijkstra"
diff --git a/node_modules/resolve/test/resolver_sync.js b/node_modules/resolve/test/resolver_sync.js
new file mode 100644
index 0000000..5982531
--- /dev/null
+++ b/node_modules/resolve/test/resolver_sync.js
@@ -0,0 +1,180 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('foo', function (t) {
+ var dir = __dirname + '/resolver';
+
+ t.equal(
+ resolve.sync('./foo', { basedir : dir }),
+ dir + '/foo.js'
+ );
+
+ t.equal(
+ resolve.sync('./foo.js', { basedir : dir }),
+ dir + '/foo.js'
+ );
+
+ t.throws(function () {
+ resolve.sync('foo', { basedir : dir });
+ });
+
+ t.end();
+});
+
+test('bar', function (t) {
+ var dir = __dirname + '/resolver';
+
+ t.equal(
+ resolve.sync('foo', { basedir : dir + '/bar' }),
+ dir + '/bar/node_modules/foo/index.js'
+ );
+ t.end();
+});
+
+test('baz', function (t) {
+ var dir = __dirname + '/resolver';
+
+ t.equal(
+ resolve.sync('./baz', { basedir : dir }),
+ dir + '/baz/quux.js'
+ );
+ t.end();
+});
+
+test('biz', function (t) {
+ var dir = __dirname + '/resolver/biz/node_modules';
+ t.equal(
+ resolve.sync('./grux', { basedir : dir }),
+ dir + '/grux/index.js'
+ );
+
+ t.equal(
+ resolve.sync('tiv', { basedir : dir + '/grux' }),
+ dir + '/tiv/index.js'
+ );
+
+ t.equal(
+ resolve.sync('grux', { basedir : dir + '/tiv' }),
+ dir + '/grux/index.js'
+ );
+ t.end();
+});
+
+test('normalize', function (t) {
+ var dir = __dirname + '/resolver/biz/node_modules/grux';
+ t.equal(
+ resolve.sync('../grux', { basedir : dir }),
+ dir + '/index.js'
+ );
+ t.end();
+});
+
+test('cup', function (t) {
+ var dir = __dirname + '/resolver';
+ t.equal(
+ resolve.sync('./cup', {
+ basedir : dir,
+ extensions : [ '.js', '.coffee' ]
+ }),
+ dir + '/cup.coffee'
+ );
+
+ t.equal(
+ resolve.sync('./cup.coffee', {
+ basedir : dir
+ }),
+ dir + '/cup.coffee'
+ );
+
+ t.throws(function () {
+ resolve.sync('./cup', {
+ basedir : dir,
+ extensions : [ '.js' ]
+ })
+ });
+
+ t.end();
+});
+
+test('mug', function (t) {
+ var dir = __dirname + '/resolver';
+ t.equal(
+ resolve.sync('./mug', { basedir : dir }),
+ dir + '/mug.js'
+ );
+
+ t.equal(
+ resolve.sync('./mug', {
+ basedir : dir,
+ extensions : [ '.coffee', '.js' ]
+ }),
+ dir + '/mug.coffee'
+ );
+
+ t.equal(
+ resolve.sync('./mug', {
+ basedir : dir,
+ extensions : [ '.js', '.coffee' ]
+ }),
+ dir + '/mug.js'
+ );
+
+ t.end();
+});
+
+test('other path', function (t) {
+ var resolverDir = __dirname + '/resolver';
+ var dir = resolverDir + '/bar';
+ var otherDir = resolverDir + '/other_path';
+
+ var path = require('path');
+
+ t.equal(
+ resolve.sync('root', {
+ basedir : dir,
+ paths: [otherDir] }),
+ resolverDir + '/other_path/root.js'
+ );
+
+ t.equal(
+ resolve.sync('lib/other-lib', {
+ basedir : dir,
+ paths: [otherDir] }),
+ resolverDir + '/other_path/lib/other-lib.js'
+ );
+
+ t.throws(function () {
+ resolve.sync('root', { basedir : dir, });
+ });
+
+ t.throws(function () {
+ resolve.sync('zzz', {
+ basedir : dir,
+ paths: [otherDir] });
+ });
+
+ t.end();
+});
+
+test('incorrect main', function (t) {
+ var resolverDir = __dirname + '/resolver';
+ var dir = resolverDir + '/incorrect_main';
+
+ t.equal(
+ resolve.sync('./incorrect_main', { basedir : resolverDir }),
+ dir + '/index.js'
+ )
+
+ t.end()
+});
+
+test('#25: node modules with the same name as node stdlib modules', function (t) {
+ var resolverDir = __dirname + '/resolver/punycode';
+
+ t.equal(
+ resolve.sync('punycode', { basedir : resolverDir }),
+ resolverDir + '/node_modules/punycode/index.js'
+ )
+
+ t.end()
+});
diff --git a/node_modules/resolve/test/subdirs.js b/node_modules/resolve/test/subdirs.js
new file mode 100644
index 0000000..957abfe
--- /dev/null
+++ b/node_modules/resolve/test/subdirs.js
@@ -0,0 +1,13 @@
+var test = require('tape');
+var resolve = require('../');
+var path = require('path');
+
+test('subdirs', function (t) {
+ t.plan(2);
+
+ var dir = path.join(__dirname, '/subdirs');
+ resolve('a/b/c/x.json', { basedir: dir }, function (err, res) {
+ t.ifError(err);
+ t.equal(res, path.join(dir, 'node_modules/a/b/c/x.json'));
+ });
+});
diff --git a/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json b/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json
new file mode 100644
index 0000000..3cc0ecb
--- /dev/null
+++ b/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json
@@ -0,0 +1 @@
+[1,2,3]
diff --git a/node_modules/resolve/test/subdirs/node_modules/a/package.json b/node_modules/resolve/test/subdirs/node_modules/a/package.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/node_modules/resolve/test/subdirs/node_modules/a/package.json
@@ -0,0 +1 @@
+{}
diff --git a/node_modules/resumer/.travis.yml b/node_modules/resumer/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/resumer/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
diff --git a/node_modules/resumer/LICENSE b/node_modules/resumer/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/resumer/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/resumer/example/resume.js b/node_modules/resumer/example/resume.js
new file mode 100644
index 0000000..d04e61a
--- /dev/null
+++ b/node_modules/resumer/example/resume.js
@@ -0,0 +1,8 @@
+var resumer = require('../');
+createStream().pipe(process.stdout);
+
+function createStream () {
+ var stream = resumer();
+ stream.queue('beep boop\n');
+ return stream;
+}
diff --git a/node_modules/resumer/index.js b/node_modules/resumer/index.js
new file mode 100644
index 0000000..14de798
--- /dev/null
+++ b/node_modules/resumer/index.js
@@ -0,0 +1,29 @@
+var through = require('through');
+var nextTick = typeof setImmediate !== 'undefined'
+ ? setImmediate
+ : process.nextTick
+;
+
+module.exports = function (write, end) {
+ var tr = through(write, end);
+ tr.pause();
+ var resume = tr.resume;
+ var pause = tr.pause;
+ var paused = false;
+
+ tr.pause = function () {
+ paused = true;
+ return pause.apply(this, arguments);
+ };
+
+ tr.resume = function () {
+ paused = false;
+ return resume.apply(this, arguments);
+ };
+
+ nextTick(function () {
+ if (!paused) tr.resume();
+ });
+
+ return tr;
+};
diff --git a/node_modules/resumer/package.json b/node_modules/resumer/package.json
new file mode 100644
index 0000000..6e7597a
--- /dev/null
+++ b/node_modules/resumer/package.json
@@ -0,0 +1,104 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "resumer@~0.0.0",
+ "scope": null,
+ "escapedName": "resumer",
+ "name": "resumer",
+ "rawSpec": "~0.0.0",
+ "spec": ">=0.0.0 <0.1.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "resumer@>=0.0.0 <0.1.0",
+ "_id": "resumer@0.0.0",
+ "_inCache": true,
+ "_location": "/resumer",
+ "_npmUser": {
+ "name": "substack",
+ "email": "mail@substack.net"
+ },
+ "_npmVersion": "1.2.2",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "resumer@~0.0.0",
+ "scope": null,
+ "escapedName": "resumer",
+ "name": "resumer",
+ "rawSpec": "~0.0.0",
+ "spec": ">=0.0.0 <0.1.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
+ "_shasum": "f1e8f461e4064ba39e82af3cdc2a8c893d076759",
+ "_shrinkwrap": null,
+ "_spec": "resumer@~0.0.0",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/resumer/issues"
+ },
+ "dependencies": {
+ "through": "~2.3.4"
+ },
+ "description": "a through stream that starts paused and resumes on the next tick",
+ "devDependencies": {
+ "concat-stream": "~0.1.1",
+ "tap": "~0.4.0",
+ "tape": "~1.0.2"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "f1e8f461e4064ba39e82af3cdc2a8c893d076759",
+ "tarball": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz"
+ },
+ "homepage": "https://github.com/substack/resumer",
+ "keywords": [
+ "through",
+ "stream",
+ "pause",
+ "resume"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "name": "resumer",
+ "optionalDependencies": {},
+ "readme": "# resumer\n\nReturn a through stream that starts out paused and resumes on the next tick,\nunless somebody called `.pause()`.\n\nThis module has the same signature as\n[through](https://npmjs.com/package/through).\n\n[](http://ci.testling.com/substack/resumer)\n\n[](http://travis-ci.org/substack/resumer)\n\n# example\n\n``` js\nvar resumer = require('resumer');\nvar s = createStream();\ns.pipe(process.stdout);\n\nfunction createStream () {\n var stream = resumer();\n stream.queue('beep boop\\n');\n return stream;\n}\n```\n\n```\n$ node example/resume.js\nbeep boop\n```\n\n# methods\n\n``` js\nvar resumer = require('resumer')\n```\n\n## resumer(write, end)\n\nReturn a new through stream from `write` and `end`, which default to\npass-through `.queue()` functions if not specified.\n\nThe stream starts out paused and will be resumed on the next tick unless you\ncall `.pause()` first.\n\n`write` and `end` get passed directly through to\n[through](https://npmjs.com/package/through).\n\n# install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install resumer\n```\n\n# license\n\nMIT\n",
+ "readmeFilename": "readme.markdown",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/resumer.git"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": [
+ "ie/6..latest",
+ "chrome/20..latest",
+ "firefox/10..latest",
+ "safari/latest",
+ "opera/11.0..latest",
+ "iphone/6",
+ "ipad/6"
+ ]
+ },
+ "version": "0.0.0"
+}
diff --git a/node_modules/resumer/readme.markdown b/node_modules/resumer/readme.markdown
new file mode 100644
index 0000000..5d9df66
--- /dev/null
+++ b/node_modules/resumer/readme.markdown
@@ -0,0 +1,59 @@
+# resumer
+
+Return a through stream that starts out paused and resumes on the next tick,
+unless somebody called `.pause()`.
+
+This module has the same signature as
+[through](https://npmjs.com/package/through).
+
+[](http://ci.testling.com/substack/resumer)
+
+[](http://travis-ci.org/substack/resumer)
+
+# example
+
+``` js
+var resumer = require('resumer');
+var s = createStream();
+s.pipe(process.stdout);
+
+function createStream () {
+ var stream = resumer();
+ stream.queue('beep boop\n');
+ return stream;
+}
+```
+
+```
+$ node example/resume.js
+beep boop
+```
+
+# methods
+
+``` js
+var resumer = require('resumer')
+```
+
+## resumer(write, end)
+
+Return a new through stream from `write` and `end`, which default to
+pass-through `.queue()` functions if not specified.
+
+The stream starts out paused and will be resumed on the next tick unless you
+call `.pause()` first.
+
+`write` and `end` get passed directly through to
+[through](https://npmjs.com/package/through).
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install resumer
+```
+
+# license
+
+MIT
diff --git a/node_modules/resumer/test/resume.js b/node_modules/resumer/test/resume.js
new file mode 100644
index 0000000..1eaecac
--- /dev/null
+++ b/node_modules/resumer/test/resume.js
@@ -0,0 +1,37 @@
+var test = require('tape');
+var resumer = require('../');
+var concat = require('concat-stream');
+
+test('implicit resume', function (t) {
+ t.plan(1);
+
+ var s = createStream();
+ s.pipe(concat(function (err, body) {
+ t.equal(body, 'beep boop\n');
+ }));
+});
+
+test('pause/resume', function (t) {
+ t.plan(2);
+
+ var s = createStream();
+ s.pause();
+
+ var paused = true;
+ setTimeout(function () {
+ paused = false;
+ s.resume();
+ }, 100);
+
+ s.pipe(concat(function (err, body) {
+ t.equal(paused, false);
+ t.equal(body, 'beep boop\n');
+ }));
+});
+
+function createStream () {
+ var stream = resumer();
+ stream.queue('beep boop\n');
+ stream.queue(null);
+ return stream;
+}
diff --git a/node_modules/resumer/test/through.js b/node_modules/resumer/test/through.js
new file mode 100644
index 0000000..ddcaf48
--- /dev/null
+++ b/node_modules/resumer/test/through.js
@@ -0,0 +1,36 @@
+var test = require('tape');
+var resumer = require('../');
+var concat = require('concat-stream');
+
+test('through write/end', function (t) {
+ t.plan(2);
+
+ var s = createStream();
+
+ s.on('okok', function () {
+ t.ok(true);
+ });
+
+ s.pipe(concat(function (err, body) {
+ t.equal(body, 'BEGIN\nRAWR\nEND\n');
+ }));
+
+ setTimeout(function () {
+ s.end('rawr\n');
+ }, 50);
+});
+
+function createStream () {
+ var stream = resumer(write, end);
+ stream.queue('BEGIN\n');
+ return stream;
+
+ function write (x) {
+ this.queue(String(x).toUpperCase());
+ }
+ function end () {
+ this.emit('okok');
+ this.queue('END\n');
+ this.queue(null);
+ }
+}
diff --git a/node_modules/string.prototype.trim/.eslintrc b/node_modules/string.prototype.trim/.eslintrc
new file mode 100644
index 0000000..b80719c
--- /dev/null
+++ b/node_modules/string.prototype.trim/.eslintrc
@@ -0,0 +1,11 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "max-nested-callbacks": [2, 3],
+ "new-cap": [2, { "capIsNewExceptions": ["CheckObjectCoercible", "ToString"] }],
+ "no-invalid-this": [1]
+ }
+}
diff --git a/node_modules/string.prototype.trim/.jscs.json b/node_modules/string.prototype.trim/.jscs.json
new file mode 100644
index 0000000..d0d49f7
--- /dev/null
+++ b/node_modules/string.prototype.trim/.jscs.json
@@ -0,0 +1,159 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": "allButReserved",
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 1
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": true,
+
+ "validateOrderInObjectKeys": "asc-insensitive",
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false,
+
+ "requireCapitalizedConstructorsNew": {
+ "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
+ }
+}
+
diff --git a/node_modules/string.prototype.trim/.npmignore b/node_modules/string.prototype.trim/.npmignore
new file mode 100644
index 0000000..123ae94
--- /dev/null
+++ b/node_modules/string.prototype.trim/.npmignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
+node_modules
diff --git a/node_modules/string.prototype.trim/.travis.yml b/node_modules/string.prototype.trim/.travis.yml
new file mode 100644
index 0000000..9569baa
--- /dev/null
+++ b/node_modules/string.prototype.trim/.travis.yml
@@ -0,0 +1,73 @@
+language: node_js
+node_js:
+ - "5.5"
+ - "5.4"
+ - "5.3"
+ - "5.2"
+ - "5.1"
+ - "5.0"
+ - "4.2"
+ - "4.1"
+ - "4.0"
+ - "iojs-v3.3"
+ - "iojs-v3.2"
+ - "iojs-v3.1"
+ - "iojs-v3.0"
+ - "iojs-v2.5"
+ - "iojs-v2.4"
+ - "iojs-v2.3"
+ - "iojs-v2.2"
+ - "iojs-v2.1"
+ - "iojs-v2.0"
+ - "iojs-v1.8"
+ - "iojs-v1.7"
+ - "iojs-v1.6"
+ - "iojs-v1.5"
+ - "iojs-v1.4"
+ - "iojs-v1.3"
+ - "iojs-v1.2"
+ - "iojs-v1.1"
+ - "iojs-v1.0"
+ - "0.12"
+ - "0.11"
+ - "0.10"
+ - "0.9"
+ - "0.8"
+ - "0.6"
+ - "0.4"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
+script:
+ - 'if [ "${TRAVIS_NODE_VERSION}" != "4.2" ]; then npm run tests-only ; else npm test ; fi'
+sudo: false
+matrix:
+ fast_finish: true
+ allow_failures:
+ - node_js: "5.4"
+ - node_js: "5.3"
+ - node_js: "5.2"
+ - node_js: "5.1"
+ - node_js: "5.0"
+ - node_js: "4.1"
+ - node_js: "4.0"
+ - node_js: "iojs-v3.2"
+ - node_js: "iojs-v3.1"
+ - node_js: "iojs-v3.0"
+ - node_js: "iojs-v2.4"
+ - node_js: "iojs-v2.3"
+ - node_js: "iojs-v2.2"
+ - node_js: "iojs-v2.1"
+ - node_js: "iojs-v2.0"
+ - node_js: "iojs-v1.7"
+ - node_js: "iojs-v1.6"
+ - node_js: "iojs-v1.5"
+ - node_js: "iojs-v1.4"
+ - node_js: "iojs-v1.3"
+ - node_js: "iojs-v1.2"
+ - node_js: "iojs-v1.1"
+ - node_js: "iojs-v1.0"
+ - node_js: "0.11"
+ - node_js: "0.9"
+ - node_js: "0.6"
+ - node_js: "0.4"
diff --git a/node_modules/string.prototype.trim/CHANGELOG.md b/node_modules/string.prototype.trim/CHANGELOG.md
new file mode 100644
index 0000000..b4251b0
--- /dev/null
+++ b/node_modules/string.prototype.trim/CHANGELOG.md
@@ -0,0 +1,24 @@
+1.1.2 / 2016-02-06
+=================
+ * Use the polyfill, not the implementation, as the default export.
+ * package.json: use object form of "authors", add "contributors"
+ * [Deps] update `define-properties`, `es-abstract`
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `semver`, `@ljharb/eslint-config`
+ * [Tests] fix npm upgrades for older nodes
+ * [Tests] up to `node` `v5.5`, don’t allow `0.8` to fail
+
+1.1.1 / 2015-08-16
+=================
+ * [Docs] remove "if" around `.shim` call in example
+
+1.1.0 / 2015-08-16
+=================
+ * [New] Implement the [es-shim API](es-shims/api).
+ * [Refactor] Move implementation to `implementation.js`
+ * [Deps] update `es-abstract`
+ * [Dev Deps] update `jscs`, `tape`
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+
+1.0.0 / 2015-08-08
+=================
+ * Initial release
diff --git a/node_modules/string.prototype.trim/LICENSE b/node_modules/string.prototype.trim/LICENSE
new file mode 100644
index 0000000..fcf5754
--- /dev/null
+++ b/node_modules/string.prototype.trim/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/string.prototype.trim/Makefile b/node_modules/string.prototype.trim/Makefile
new file mode 100644
index 0000000..b9e4fe1
--- /dev/null
+++ b/node_modules/string.prototype.trim/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG= release`, where is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG= release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/string.prototype.trim/README.md b/node_modules/string.prototype.trim/README.md
new file mode 100644
index 0000000..256595e
--- /dev/null
+++ b/node_modules/string.prototype.trim/README.md
@@ -0,0 +1,50 @@
+String.prototype.trim [![Version Badge][npm-version-svg]][package-url]
+
+[![Build Status][travis-svg]][travis-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+[![browser support][testling-svg]][testling-url]
+
+An ES5 spec-compliant `String.prototype.trim` shim. Invoke its "shim" method to shim `String.prototype.trim` if it is unavailable.
+
+This package implements the [es-shim API](https://github.com/es-shims/api) interface. It works in an ES3-supported environment and complies with the [spec](http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.20).
+
+Most common usage:
+
+```js
+var assert = require('assert');
+var trim = require('string.prototype.trim');
+
+assert(trim(' \t\na \t\n') === 'a');
+
+trim.shim(); // will be a no-op if not needed
+
+assert(trim(' \t\na \t\n') === ' \t\na \t\n'.trim());
+```
+
+## Engine Bugs
+Some implementations of `String#trim` incorrectly trim zero-width spaces. This shim detects and corrects this behavior.
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.com/package/string.prototype.trim
+[npm-version-svg]: http://versionbadg.es/es-shims/String.prototype.trim.svg
+[travis-svg]: https://travis-ci.org/es-shims/String.prototype.trim.svg
+[travis-url]: https://travis-ci.org/es-shims/String.prototype.trim
+[deps-svg]: https://david-dm.org/es-shims/String.prototype.trim.svg
+[deps-url]: https://david-dm.org/es-shims/String.prototype.trim
+[dev-deps-svg]: https://david-dm.org/es-shims/String.prototype.trim/dev-status.svg
+[dev-deps-url]: https://david-dm.org/es-shims/String.prototype.trim#info=devDependencies
+[testling-svg]: https://ci.testling.com/es-shims/String.prototype.trim.png
+[testling-url]: https://ci.testling.com/es-shims/String.prototype.trim
+[npm-badge-png]: https://nodei.co/npm/string.prototype.trim.png?downloads=true&stars=true
+[license-image]: http://img.shields.io/npm/l/string.prototype.trim.svg
+[license-url]: LICENSE
+[downloads-image]: http://img.shields.io/npm/dm/string.prototype.trim.svg
+[downloads-url]: http://npm-stat.com/charts.html?package=string.prototype.trim
diff --git a/node_modules/string.prototype.trim/implementation.js b/node_modules/string.prototype.trim/implementation.js
new file mode 100644
index 0000000..304246c
--- /dev/null
+++ b/node_modules/string.prototype.trim/implementation.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var bind = require('function-bind');
+var ES = require('es-abstract/es5');
+var replace = bind.call(Function.call, String.prototype.replace);
+
+var leftWhitespace = /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/;
+var rightWhitespace = /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;
+
+module.exports = function trim() {
+ var S = ES.ToString(ES.CheckObjectCoercible(this));
+ return replace(replace(S, leftWhitespace, ''), rightWhitespace, '');
+};
diff --git a/node_modules/string.prototype.trim/index.js b/node_modules/string.prototype.trim/index.js
new file mode 100644
index 0000000..4040ba9
--- /dev/null
+++ b/node_modules/string.prototype.trim/index.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var bind = require('function-bind');
+var define = require('define-properties');
+
+var implementation = require('./implementation');
+var getPolyfill = require('./polyfill');
+var shim = require('./shim');
+
+var boundTrim = bind.call(Function.call, getPolyfill());
+
+define(boundTrim, {
+ getPolyfill: getPolyfill,
+ implementation: implementation,
+ shim: shim
+});
+
+module.exports = boundTrim;
diff --git a/node_modules/string.prototype.trim/package.json b/node_modules/string.prototype.trim/package.json
new file mode 100644
index 0000000..98997f5
--- /dev/null
+++ b/node_modules/string.prototype.trim/package.json
@@ -0,0 +1,145 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "string.prototype.trim@~1.1.2",
+ "scope": null,
+ "escapedName": "string.prototype.trim",
+ "name": "string.prototype.trim",
+ "rawSpec": "~1.1.2",
+ "spec": ">=1.1.2 <1.2.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "string.prototype.trim@>=1.1.2 <1.2.0",
+ "_id": "string.prototype.trim@1.1.2",
+ "_inCache": true,
+ "_location": "/string.prototype.trim",
+ "_nodeVersion": "5.5.0",
+ "_npmOperationalInternal": {
+ "host": "packages-9-west.internal.npmjs.com",
+ "tmp": "tmp/string.prototype.trim-1.1.2.tgz_1454751443709_0.9118233555927873"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.3.12",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "string.prototype.trim@~1.1.2",
+ "scope": null,
+ "escapedName": "string.prototype.trim",
+ "name": "string.prototype.trim",
+ "rawSpec": "~1.1.2",
+ "spec": ">=1.1.2 <1.2.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
+ "_shasum": "d04de2c89e137f4d7d206f086b5ed2fae6be8cea",
+ "_shrinkwrap": null,
+ "_spec": "string.prototype.trim@~1.1.2",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "bugs": {
+ "url": "https://github.com/es-shims/String.prototype.trim/issues"
+ },
+ "contributors": [
+ {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ }
+ ],
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.5.0",
+ "function-bind": "^1.0.2"
+ },
+ "description": "ES5 spec-compliant shim for String.prototype.trim",
+ "devDependencies": {
+ "@es-shims/api": "^1.0.0",
+ "@ljharb/eslint-config": "^1.6.1",
+ "covert": "^1.1.0",
+ "eslint": "^1.10.3",
+ "jscs": "^2.9.0",
+ "nsp": "^2.2.0",
+ "replace": "^0.3.0",
+ "semver": "^5.1.0",
+ "tape": "^4.4.0"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "d04de2c89e137f4d7d206f086b5ed2fae6be8cea",
+ "tarball": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "gitHead": "7894aca30500058496b701919121b895d13c62eb",
+ "homepage": "https://github.com/es-shims/String.prototype.trim#readme",
+ "keywords": [
+ "String.prototype.trim",
+ "string",
+ "ES5",
+ "shim",
+ "trim",
+ "polyfill",
+ "es-shim API"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "string.prototype.trim",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/es-shims/String.prototype.trim.git"
+ },
+ "scripts": {
+ "coverage": "covert test/*.js",
+ "coverage-quiet": "covert test/*.js --quiet",
+ "eslint": "eslint test/*.js *.js",
+ "jscs": "jscs test/*.js *.js",
+ "lint": "npm run jscs && npm run eslint",
+ "security": "nsp check",
+ "test": "npm run lint && es-shim-api --bound && npm run tests-only && npm run security",
+ "test:module": "node test/index.js",
+ "test:shimmed": "node test/shimmed.js",
+ "tests-only": "npm run test:shimmed && npm run test:module"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/9.0..latest",
+ "firefox/4.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/11.6..latest",
+ "opera/next",
+ "safari/5.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "version": "1.1.2"
+}
diff --git a/node_modules/string.prototype.trim/polyfill.js b/node_modules/string.prototype.trim/polyfill.js
new file mode 100644
index 0000000..afdb6f5
--- /dev/null
+++ b/node_modules/string.prototype.trim/polyfill.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+var zeroWidthSpace = '\u200b';
+
+module.exports = function getPolyfill() {
+ if (String.prototype.trim && zeroWidthSpace.trim() === zeroWidthSpace) {
+ return String.prototype.trim;
+ }
+ return implementation;
+};
diff --git a/node_modules/string.prototype.trim/shim.js b/node_modules/string.prototype.trim/shim.js
new file mode 100644
index 0000000..477025c
--- /dev/null
+++ b/node_modules/string.prototype.trim/shim.js
@@ -0,0 +1,10 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+module.exports = function shimStringTrim() {
+ var polyfill = getPolyfill();
+ define(String.prototype, { trim: polyfill }, { trim: function () { return String.prototype.trim !== polyfill; } });
+ return polyfill;
+};
diff --git a/node_modules/string.prototype.trim/test/index.js b/node_modules/string.prototype.trim/test/index.js
new file mode 100644
index 0000000..a735984
--- /dev/null
+++ b/node_modules/string.prototype.trim/test/index.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var trim = require('../');
+var test = require('tape');
+var runTests = require('./tests');
+
+test('as a function', function (t) {
+ t.test('bad array/this value', function (st) {
+ st.throws(function () { trim(undefined, 'a'); }, TypeError, 'undefined is not an object');
+ st.throws(function () { trim(null, 'a'); }, TypeError, 'null is not an object');
+ st.end();
+ });
+
+ runTests(trim, t);
+
+ t.end();
+});
diff --git a/node_modules/string.prototype.trim/test/shimmed.js b/node_modules/string.prototype.trim/test/shimmed.js
new file mode 100644
index 0000000..95d9b2d
--- /dev/null
+++ b/node_modules/string.prototype.trim/test/shimmed.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var trim = require('../');
+trim.shim();
+
+var test = require('tape');
+var defineProperties = require('define-properties');
+var bind = require('function-bind');
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+var functionsHaveNames = function f() {}.name === 'f';
+
+var runTests = require('./tests');
+
+test('shimmed', function (t) {
+ t.equal(String.prototype.trim.length, 0, 'String#trim has a length of 0');
+ t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+ st.equal(String.prototype.trim.name, 'trim', 'String#trim has name "trim"');
+ st.end();
+ });
+
+ t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+ et.equal(false, isEnumerable.call(String.prototype, 'trim'), 'String#trim is not enumerable');
+ et.end();
+ });
+
+ var supportsStrictMode = (function () { return typeof this === 'undefined'; }());
+
+ t.test('bad string/this value', { skip: !supportsStrictMode }, function (st) {
+ st.throws(function () { return trim(undefined, 'a'); }, TypeError, 'undefined is not an object');
+ st.throws(function () { return trim(null, 'a'); }, TypeError, 'null is not an object');
+ st.end();
+ });
+
+ runTests(bind.call(Function.call, String.prototype.trim), t);
+
+ t.end();
+});
diff --git a/node_modules/string.prototype.trim/test/tests.js b/node_modules/string.prototype.trim/test/tests.js
new file mode 100644
index 0000000..6e3889c
--- /dev/null
+++ b/node_modules/string.prototype.trim/test/tests.js
@@ -0,0 +1,19 @@
+'use strict';
+
+module.exports = function (trim, t) {
+ t.test('normal cases', function (st) {
+ st.equal(trim(' \t\na \t\n'), 'a', 'strips whitespace off left and right sides');
+ st.equal(trim('a'), 'a', 'noop when no whitespace');
+
+ var allWhitespaceChars = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+ st.equal(trim(allWhitespaceChars + 'a' + allWhitespaceChars), 'a', 'all expected whitespace chars are trimmed');
+
+ st.end();
+ });
+
+ t.test('zero-width spaces', function (st) {
+ var zeroWidth = '\u200b';
+ st.equal(trim(zeroWidth), zeroWidth, 'zero width space does not trim');
+ st.end();
+ });
+};
diff --git a/node_modules/tape/.npmignore b/node_modules/tape/.npmignore
new file mode 100644
index 0000000..07e6e47
--- /dev/null
+++ b/node_modules/tape/.npmignore
@@ -0,0 +1 @@
+/node_modules
diff --git a/node_modules/tape/.travis.yml b/node_modules/tape/.travis.yml
new file mode 100644
index 0000000..a699c63
--- /dev/null
+++ b/node_modules/tape/.travis.yml
@@ -0,0 +1,9 @@
+language: node_js
+sudo: true
+node_js:
+ - "0.10"
+ - "0.12"
+ - "iojs"
+ - "4"
+ - "5"
+ - "6"
diff --git a/node_modules/tape/LICENSE b/node_modules/tape/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/tape/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/tape/bin/tape b/node_modules/tape/bin/tape
new file mode 100755
index 0000000..498910c
--- /dev/null
+++ b/node_modules/tape/bin/tape
@@ -0,0 +1,36 @@
+#!/usr/bin/env node
+
+var resolveModule = require('resolve').sync;
+var resolvePath = require('path').resolve;
+var parseOpts = require('minimist');
+var glob = require('glob');
+
+var opts = parseOpts(process.argv.slice(2), {
+ alias: { r: 'require' },
+ string: 'require',
+ default: { r: [] }
+ });
+
+var cwd = process.cwd();
+
+if (typeof opts.require === 'string') {
+ opts.require = [opts.require];
+}
+
+opts.require.forEach(function(module) {
+ if (module) {
+ /* This check ensures we ignore `-r ""`, trailing `-r`, or
+ * other silly things the user might (inadvertently) be doing. */
+ require(resolveModule(module, { basedir: cwd }));
+ }
+});
+
+opts._.forEach(function (arg) {
+ glob(arg, function (err, files) {
+ files.forEach(function (file) {
+ require(resolvePath(cwd, file));
+ });
+ });
+});
+
+// vim: ft=javascript
diff --git a/node_modules/tape/example/array.js b/node_modules/tape/example/array.js
new file mode 100644
index 0000000..d36857d
--- /dev/null
+++ b/node_modules/tape/example/array.js
@@ -0,0 +1,35 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('array', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/example/fail.js b/node_modules/tape/example/fail.js
new file mode 100644
index 0000000..a7bf444
--- /dev/null
+++ b/node_modules/tape/example/fail.js
@@ -0,0 +1,35 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('array', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4444 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/example/nested.js b/node_modules/tape/example/nested.js
new file mode 100644
index 0000000..0e233d3
--- /dev/null
+++ b/node_modules/tape/example/nested.js
@@ -0,0 +1,51 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('nested array test', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ t.test('inside test', function (q) {
+ q.plan(2);
+ q.ok(true, 'inside ok');
+
+ setTimeout(function () {
+ q.ok(true, 'inside delayed');
+ }, 3000);
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
+
+test('another', function (t) {
+ t.plan(1);
+ setTimeout(function () {
+ t.ok(true);
+ }, 100);
+});
diff --git a/node_modules/tape/example/nested_fail.js b/node_modules/tape/example/nested_fail.js
new file mode 100644
index 0000000..3ab5cb3
--- /dev/null
+++ b/node_modules/tape/example/nested_fail.js
@@ -0,0 +1,51 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('nested array test', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ t.test('inside test', function (q) {
+ q.plan(2);
+ q.ok(true);
+
+ setTimeout(function () {
+ q.equal(3, 4);
+ }, 3000);
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
+
+test('another', function (t) {
+ t.plan(1);
+ setTimeout(function () {
+ t.ok(true);
+ }, 100);
+});
diff --git a/node_modules/tape/example/not_enough.js b/node_modules/tape/example/not_enough.js
new file mode 100644
index 0000000..13b682b
--- /dev/null
+++ b/node_modules/tape/example/not_enough.js
@@ -0,0 +1,35 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('array', function (t) {
+ t.plan(8);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/example/static/build.sh b/node_modules/tape/example/static/build.sh
new file mode 100755
index 0000000..c583640
--- /dev/null
+++ b/node_modules/tape/example/static/build.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+browserify ../timing.js -o bundle.js
diff --git a/node_modules/tape/example/static/index.html b/node_modules/tape/example/static/index.html
new file mode 100644
index 0000000..45ccf07
--- /dev/null
+++ b/node_modules/tape/example/static/index.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/tape/example/static/server.js b/node_modules/tape/example/static/server.js
new file mode 100644
index 0000000..80cea43
--- /dev/null
+++ b/node_modules/tape/example/static/server.js
@@ -0,0 +1,4 @@
+var http = require('http');
+var ecstatic = require('ecstatic')(__dirname);
+var server = http.createServer(ecstatic);
+server.listen(8000);
diff --git a/node_modules/tape/example/stream/object.js b/node_modules/tape/example/stream/object.js
new file mode 100644
index 0000000..8f77f0f
--- /dev/null
+++ b/node_modules/tape/example/stream/object.js
@@ -0,0 +1,10 @@
+var test = require('../../');
+var path = require('path');
+
+test.createStream({ objectMode: true }).on('data', function (row) {
+ console.log(JSON.stringify(row))
+});
+
+process.argv.slice(2).forEach(function (file) {
+ require(path.resolve(file));
+});
diff --git a/node_modules/tape/example/stream/tap.js b/node_modules/tape/example/stream/tap.js
new file mode 100644
index 0000000..9ea9ff7
--- /dev/null
+++ b/node_modules/tape/example/stream/tap.js
@@ -0,0 +1,8 @@
+var test = require('../../');
+var path = require('path');
+
+test.createStream().pipe(process.stdout);
+
+process.argv.slice(2).forEach(function (file) {
+ require(path.resolve(file));
+});
diff --git a/node_modules/tape/example/stream/test/x.js b/node_modules/tape/example/stream/test/x.js
new file mode 100644
index 0000000..7dbb98a
--- /dev/null
+++ b/node_modules/tape/example/stream/test/x.js
@@ -0,0 +1,5 @@
+var test = require('../../../');
+test(function (t) {
+ t.plan(1);
+ t.equal('beep', 'boop');
+});
diff --git a/node_modules/tape/example/stream/test/y.js b/node_modules/tape/example/stream/test/y.js
new file mode 100644
index 0000000..28606d5
--- /dev/null
+++ b/node_modules/tape/example/stream/test/y.js
@@ -0,0 +1,11 @@
+var test = require('../../../');
+test(function (t) {
+ t.plan(2);
+ t.equal(1+1, 2);
+ t.ok(true);
+});
+
+test('wheee', function (t) {
+ t.ok(true);
+ t.end();
+});
diff --git a/node_modules/tape/example/throw.js b/node_modules/tape/example/throw.js
new file mode 100644
index 0000000..9a69ec0
--- /dev/null
+++ b/node_modules/tape/example/throw.js
@@ -0,0 +1,10 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('throw', function (t) {
+ t.plan(2);
+
+ setTimeout(function () {
+ throw new Error('doom');
+ }, 100);
+});
diff --git a/node_modules/tape/example/timing.js b/node_modules/tape/example/timing.js
new file mode 100644
index 0000000..0268dc7
--- /dev/null
+++ b/node_modules/tape/example/timing.js
@@ -0,0 +1,12 @@
+var test = require('../');
+
+test('timing test', function (t) {
+ t.plan(2);
+
+ t.equal(typeof Date.now, 'function');
+ var start = new Date;
+
+ setTimeout(function () {
+ t.equal(new Date - start, 100);
+ }, 100);
+});
diff --git a/node_modules/tape/example/too_many.js b/node_modules/tape/example/too_many.js
new file mode 100644
index 0000000..ee285fb
--- /dev/null
+++ b/node_modules/tape/example/too_many.js
@@ -0,0 +1,35 @@
+var falafel = require('falafel');
+var test = require('../');
+
+test('array', function (t) {
+ t.plan(3);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/example/two.js b/node_modules/tape/example/two.js
new file mode 100644
index 0000000..78e49c3
--- /dev/null
+++ b/node_modules/tape/example/two.js
@@ -0,0 +1,18 @@
+var test = require('../');
+
+test('one', function (t) {
+ t.plan(2);
+ t.ok(true);
+ setTimeout(function () {
+ t.equal(1+3, 4);
+ }, 100);
+});
+
+test('two', function (t) {
+ t.plan(3);
+ t.equal(5, 2+3);
+ setTimeout(function () {
+ t.equal('a'.charCodeAt(0), 97);
+ t.ok(true);
+ }, 50);
+});
diff --git a/node_modules/tape/index.js b/node_modules/tape/index.js
new file mode 100644
index 0000000..f3ffcae
--- /dev/null
+++ b/node_modules/tape/index.js
@@ -0,0 +1,151 @@
+var defined = require('defined');
+var createDefaultStream = require('./lib/default_stream');
+var Test = require('./lib/test');
+var createResult = require('./lib/results');
+var through = require('through');
+
+var canEmitExit = typeof process !== 'undefined' && process
+ && typeof process.on === 'function' && process.browser !== true
+;
+var canExit = typeof process !== 'undefined' && process
+ && typeof process.exit === 'function'
+;
+
+var nextTick = typeof setImmediate !== 'undefined'
+ ? setImmediate
+ : process.nextTick
+;
+
+exports = module.exports = (function () {
+ var harness;
+ var lazyLoad = function () {
+ return getHarness().apply(this, arguments);
+ };
+
+ lazyLoad.only = function () {
+ return getHarness().only.apply(this, arguments);
+ };
+
+ lazyLoad.createStream = function (opts) {
+ if (!opts) opts = {};
+ if (!harness) {
+ var output = through();
+ getHarness({ stream: output, objectMode: opts.objectMode });
+ return output;
+ }
+ return harness.createStream(opts);
+ };
+
+ lazyLoad.onFinish = function () {
+ return getHarness().onFinish.apply(this, arguments);
+ };
+
+ lazyLoad.getHarness = getHarness
+
+ return lazyLoad
+
+ function getHarness (opts) {
+ if (!opts) opts = {};
+ opts.autoclose = !canEmitExit;
+ if (!harness) harness = createExitHarness(opts);
+ return harness;
+ }
+})();
+
+function createExitHarness (conf) {
+ if (!conf) conf = {};
+ var harness = createHarness({
+ autoclose: defined(conf.autoclose, false)
+ });
+
+ var stream = harness.createStream({ objectMode: conf.objectMode });
+ var es = stream.pipe(conf.stream || createDefaultStream());
+ if (canEmitExit) {
+ es.on('error', function (err) { harness._exitCode = 1 });
+ }
+
+ var ended = false;
+ stream.on('end', function () { ended = true });
+
+ if (conf.exit === false) return harness;
+ if (!canEmitExit || !canExit) return harness;
+
+ var inErrorState = false;
+
+ process.on('exit', function (code) {
+ // let the process exit cleanly.
+ if (code !== 0) {
+ return
+ }
+
+ if (!ended) {
+ var only = harness._results._only;
+ for (var i = 0; i < harness._tests.length; i++) {
+ var t = harness._tests[i];
+ if (only && t !== only) continue;
+ t._exit();
+ }
+ }
+ harness.close();
+ process.exit(code || harness._exitCode);
+ });
+
+ return harness;
+}
+
+exports.createHarness = createHarness;
+exports.Test = Test;
+exports.test = exports; // tap compat
+exports.test.skip = Test.skip;
+
+var exitInterval;
+
+function createHarness (conf_) {
+ if (!conf_) conf_ = {};
+ var results = createResult();
+ if (conf_.autoclose !== false) {
+ results.once('done', function () { results.close() });
+ }
+
+ var test = function (name, conf, cb) {
+ var t = new Test(name, conf, cb);
+ test._tests.push(t);
+
+ (function inspectCode (st) {
+ st.on('test', function sub (st_) {
+ inspectCode(st_);
+ });
+ st.on('result', function (r) {
+ if (!r.ok && typeof r !== 'string') test._exitCode = 1
+ });
+ })(t);
+
+ results.push(t);
+ return t;
+ };
+ test._results = results;
+
+ test._tests = [];
+
+ test.createStream = function (opts) {
+ return results.createStream(opts);
+ };
+
+ test.onFinish = function (cb) {
+ results.on('done', cb);
+ };
+
+ var only = false;
+ test.only = function () {
+ if (only) throw new Error('there can only be one only test');
+ only = true;
+ var t = test.apply(null, arguments);
+ results.only(t);
+ return t;
+ };
+ test._exitCode = 0;
+
+ test.close = function () { results.close() };
+
+ return test;
+}
diff --git a/node_modules/tape/lib/default_stream.js b/node_modules/tape/lib/default_stream.js
new file mode 100644
index 0000000..c8e9918
--- /dev/null
+++ b/node_modules/tape/lib/default_stream.js
@@ -0,0 +1,31 @@
+var through = require('through');
+var fs = require('fs');
+
+module.exports = function () {
+ var line = '';
+ var stream = through(write, flush);
+ return stream;
+
+ function write (buf) {
+ for (var i = 0; i < buf.length; i++) {
+ var c = typeof buf === 'string'
+ ? buf.charAt(i)
+ : String.fromCharCode(buf[i])
+ ;
+ if (c === '\n') flush();
+ else line += c;
+ }
+ }
+
+ function flush () {
+ if (fs.writeSync && /^win/.test(process.platform)) {
+ try { fs.writeSync(1, line + '\n'); }
+ catch (e) { stream.emit('error', e) }
+ }
+ else {
+ try { console.log(line) }
+ catch (e) { stream.emit('error', e) }
+ }
+ line = '';
+ }
+};
diff --git a/node_modules/tape/lib/results.js b/node_modules/tape/lib/results.js
new file mode 100644
index 0000000..efc60ce
--- /dev/null
+++ b/node_modules/tape/lib/results.js
@@ -0,0 +1,188 @@
+var EventEmitter = require('events').EventEmitter;
+var inherits = require('inherits');
+var through = require('through');
+var resumer = require('resumer');
+var inspect = require('object-inspect');
+var bind = require('function-bind');
+var has = require('has');
+var regexpTest = bind.call(Function.call, RegExp.prototype.test);
+var yamlIndicators = /\:|\-|\?/;
+var nextTick = typeof setImmediate !== 'undefined'
+ ? setImmediate
+ : process.nextTick
+;
+
+module.exports = Results;
+inherits(Results, EventEmitter);
+
+function Results () {
+ if (!(this instanceof Results)) return new Results;
+ this.count = 0;
+ this.fail = 0;
+ this.pass = 0;
+ this._stream = through();
+ this.tests = [];
+ this._only = null;
+}
+
+Results.prototype.createStream = function (opts) {
+ if (!opts) opts = {};
+ var self = this;
+ var output, testId = 0;
+ if (opts.objectMode) {
+ output = through();
+ self.on('_push', function ontest (t, extra) {
+ if (!extra) extra = {};
+ var id = testId++;
+ t.once('prerun', function () {
+ var row = {
+ type: 'test',
+ name: t.name,
+ id: id
+ };
+ if (has(extra, 'parent')) {
+ row.parent = extra.parent;
+ }
+ output.queue(row);
+ });
+ t.on('test', function (st) {
+ ontest(st, { parent: id });
+ });
+ t.on('result', function (res) {
+ res.test = id;
+ res.type = 'assert';
+ output.queue(res);
+ });
+ t.on('end', function () {
+ output.queue({ type: 'end', test: id });
+ });
+ });
+ self.on('done', function () { output.queue(null) });
+ }
+ else {
+ output = resumer();
+ output.queue('TAP version 13\n');
+ self._stream.pipe(output);
+ }
+
+ nextTick(function next() {
+ var t;
+ while (t = getNextTest(self)) {
+ t.run();
+ if (!t.ended) return t.once('end', function(){ nextTick(next); });
+ }
+ self.emit('done');
+ });
+
+ return output;
+};
+
+Results.prototype.push = function (t) {
+ var self = this;
+ self.tests.push(t);
+ self._watch(t);
+ self.emit('_push', t);
+};
+
+Results.prototype.only = function (t) {
+ this._only = t;
+};
+
+Results.prototype._watch = function (t) {
+ var self = this;
+ var write = function (s) { self._stream.queue(s) };
+ t.once('prerun', function () {
+ write('# ' + t.name + '\n');
+ });
+
+ t.on('result', function (res) {
+ if (typeof res === 'string') {
+ write('# ' + res + '\n');
+ return;
+ }
+ write(encodeResult(res, self.count + 1));
+ self.count ++;
+
+ if (res.ok) self.pass ++
+ else self.fail ++
+ });
+
+ t.on('test', function (st) { self._watch(st) });
+};
+
+Results.prototype.close = function () {
+ var self = this;
+ if (self.closed) self._stream.emit('error', new Error('ALREADY CLOSED'));
+ self.closed = true;
+ var write = function (s) { self._stream.queue(s) };
+
+ write('\n1..' + self.count + '\n');
+ write('# tests ' + self.count + '\n');
+ write('# pass ' + self.pass + '\n');
+ if (self.fail) write('# fail ' + self.fail + '\n')
+ else write('\n# ok\n')
+
+ self._stream.queue(null);
+};
+
+function encodeResult (res, count) {
+ var output = '';
+ output += (res.ok ? 'ok ' : 'not ok ') + count;
+ output += res.name ? ' ' + res.name.toString().replace(/\s+/g, ' ') : '';
+
+ if (res.skip) output += ' # SKIP';
+ else if (res.todo) output += ' # TODO';
+
+ output += '\n';
+ if (res.ok) return output;
+
+ var outer = ' ';
+ var inner = outer + ' ';
+ output += outer + '---\n';
+ output += inner + 'operator: ' + res.operator + '\n';
+
+ if (has(res, 'expected') || has(res, 'actual')) {
+ var ex = inspect(res.expected, {depth: res.objectPrintDepth});
+ var ac = inspect(res.actual, {depth: res.objectPrintDepth});
+
+ if (Math.max(ex.length, ac.length) > 65 || invalidYaml(ex) || invalidYaml(ac)) {
+ output += inner + 'expected: |-\n' + inner + ' ' + ex + '\n';
+ output += inner + 'actual: |-\n' + inner + ' ' + ac + '\n';
+ }
+ else {
+ output += inner + 'expected: ' + ex + '\n';
+ output += inner + 'actual: ' + ac + '\n';
+ }
+ }
+ if (res.at) {
+ output += inner + 'at: ' + res.at + '\n';
+ }
+ if (res.operator === 'error' && res.actual && res.actual.stack) {
+ var lines = String(res.actual.stack).split('\n');
+ output += inner + 'stack: |-\n';
+ for (var i = 0; i < lines.length; i++) {
+ output += inner + ' ' + lines[i] + '\n';
+ }
+ }
+
+ output += outer + '...\n';
+ return output;
+}
+
+function getNextTest (results) {
+ if (!results._only) {
+ return results.tests.shift();
+ }
+
+ do {
+ var t = results.tests.shift();
+ if (!t) continue;
+ if (results._only === t) {
+ return t;
+ }
+ } while (results.tests.length !== 0)
+}
+
+function invalidYaml (str) {
+ return regexpTest(yamlIndicators, str);
+}
diff --git a/node_modules/tape/lib/test.js b/node_modules/tape/lib/test.js
new file mode 100644
index 0000000..d4b4b1c
--- /dev/null
+++ b/node_modules/tape/lib/test.js
@@ -0,0 +1,507 @@
+var deepEqual = require('deep-equal');
+var defined = require('defined');
+var path = require('path');
+var inherits = require('inherits');
+var EventEmitter = require('events').EventEmitter;
+var has = require('has');
+var trim = require('string.prototype.trim');
+var bind = require('function-bind');
+var isEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
+
+module.exports = Test;
+
+var nextTick = typeof setImmediate !== 'undefined'
+ ? setImmediate
+ : process.nextTick
+;
+var safeSetTimeout = setTimeout;
+
+inherits(Test, EventEmitter);
+
+var getTestArgs = function (name_, opts_, cb_) {
+ var name = '(anonymous)';
+ var opts = {};
+ var cb;
+
+ for (var i = 0; i < arguments.length; i++) {
+ var arg = arguments[i];
+ var t = typeof arg;
+ if (t === 'string') {
+ name = arg;
+ }
+ else if (t === 'object') {
+ opts = arg || opts;
+ }
+ else if (t === 'function') {
+ cb = arg;
+ }
+ }
+ return { name: name, opts: opts, cb: cb };
+};
+
+function Test (name_, opts_, cb_) {
+ if (! (this instanceof Test)) {
+ return new Test(name_, opts_, cb_);
+ }
+
+ var args = getTestArgs(name_, opts_, cb_);
+
+ this.readable = true;
+ this.name = args.name || '(anonymous)';
+ this.assertCount = 0;
+ this.pendingCount = 0;
+ this._skip = args.opts.skip || false;
+ this._timeout = args.opts.timeout;
+ this._objectPrintDepth = args.opts.objectPrintDepth || 5;
+ this._plan = undefined;
+ this._cb = args.cb;
+ this._progeny = [];
+ this._ok = true;
+
+ for (var prop in this) {
+ this[prop] = (function bind(self, val) {
+ if (typeof val === 'function') {
+ return function bound() {
+ return val.apply(self, arguments);
+ };
+ }
+ else return val;
+ })(this, this[prop]);
+ }
+}
+
+Test.prototype.run = function () {
+ if (this._skip) {
+ this.comment('SKIP ' + this.name);
+ }
+ if (!this._cb || this._skip) {
+ return this._end();
+ }
+ if (this._timeout != null) {
+ this.timeoutAfter(this._timeout);
+ }
+ this.emit('prerun');
+ this._cb(this);
+ this.emit('run');
+};
+
+Test.prototype.test = function (name, opts, cb) {
+ var self = this;
+ var t = new Test(name, opts, cb);
+ this._progeny.push(t);
+ this.pendingCount++;
+ this.emit('test', t);
+ t.on('prerun', function () {
+ self.assertCount++;
+ })
+
+ if (!self._pendingAsserts()) {
+ nextTick(function () {
+ self._end();
+ });
+ }
+
+ nextTick(function() {
+ if (!self._plan && self.pendingCount == self._progeny.length) {
+ self._end();
+ }
+ });
+};
+
+Test.prototype.comment = function (msg) {
+ var that = this;
+ trim(msg).split('\n').forEach(function (aMsg) {
+ that.emit('result', trim(aMsg).replace(/^#\s*/, ''));
+ });
+};
+
+Test.prototype.plan = function (n) {
+ this._plan = n;
+ this.emit('plan', n);
+};
+
+Test.prototype.timeoutAfter = function(ms) {
+ if (!ms) throw new Error('timeoutAfter requires a timespan');
+ var self = this;
+ var timeout = safeSetTimeout(function() {
+ self.fail('test timed out after ' + ms + 'ms');
+ self.end();
+ }, ms);
+ this.once('end', function() {
+ clearTimeout(timeout);
+ });
+}
+
+Test.prototype.end = function (err) {
+ var self = this;
+ if (arguments.length >= 1 && !!err) {
+ this.ifError(err);
+ }
+
+ if (this.calledEnd) {
+ this.fail('.end() called twice');
+ }
+ this.calledEnd = true;
+ this._end();
+};
+
+Test.prototype._end = function (err) {
+ var self = this;
+ if (this._progeny.length) {
+ var t = this._progeny.shift();
+ t.on('end', function () { self._end() });
+ t.run();
+ return;
+ }
+
+ if (!this.ended) this.emit('end');
+ var pendingAsserts = this._pendingAsserts();
+ if (!this._planError && this._plan !== undefined && pendingAsserts) {
+ this._planError = true;
+ this.fail('plan != count', {
+ expected : this._plan,
+ actual : this.assertCount
+ });
+ }
+ this.ended = true;
+};
+
+Test.prototype._exit = function () {
+ if (this._plan !== undefined &&
+ !this._planError && this.assertCount !== this._plan) {
+ this._planError = true;
+ this.fail('plan != count', {
+ expected : this._plan,
+ actual : this.assertCount,
+ exiting : true
+ });
+ }
+ else if (!this.ended) {
+ this.fail('test exited without ending', {
+ exiting: true
+ });
+ }
+};
+
+Test.prototype._pendingAsserts = function () {
+ if (this._plan === undefined) {
+ return 1;
+ }
+ else {
+ return this._plan - (this._progeny.length + this.assertCount);
+ }
+};
+
+Test.prototype._assert = function assert (ok, opts) {
+ var self = this;
+ var extra = opts.extra || {};
+
+ var res = {
+ id : self.assertCount ++,
+ ok : Boolean(ok),
+ skip : defined(extra.skip, opts.skip),
+ name : defined(extra.message, opts.message, '(unnamed assert)'),
+ operator : defined(extra.operator, opts.operator),
+ objectPrintDepth : self._objectPrintDepth
+ };
+ if (has(opts, 'actual') || has(extra, 'actual')) {
+ res.actual = defined(extra.actual, opts.actual);
+ }
+ if (has(opts, 'expected') || has(extra, 'expected')) {
+ res.expected = defined(extra.expected, opts.expected);
+ }
+ this._ok = Boolean(this._ok && ok);
+
+ if (!ok) {
+ res.error = defined(extra.error, opts.error, new Error(res.name));
+ }
+
+ if (!ok) {
+ var e = new Error('exception');
+ var err = (e.stack || '').split('\n');
+ var dir = path.dirname(__dirname) + path.sep;
+
+ for (var i = 0; i < err.length; i++) {
+ var m = /^[^\s]*\s*\bat\s+(.+)/.exec(err[i]);
+ if (!m) {
+ continue;
+ }
+
+ var s = m[1].split(/\s+/);
+ var filem = /((?:\/|[A-Z]:\\)[^:\s]+:(\d+)(?::(\d+))?)/.exec(s[1]);
+ if (!filem) {
+ filem = /((?:\/|[A-Z]:\\)[^:\s]+:(\d+)(?::(\d+))?)/.exec(s[2]);
+
+ if (!filem) {
+ filem = /((?:\/|[A-Z]:\\)[^:\s]+:(\d+)(?::(\d+))?)/.exec(s[3]);
+
+ if (!filem) {
+ continue;
+ }
+ }
+ }
+
+ if (filem[1].slice(0, dir.length) === dir) {
+ continue;
+ }
+
+ res.functionName = s[0];
+ res.file = filem[1];
+ res.line = Number(filem[2]);
+ if (filem[3]) res.column = filem[3];
+
+ res.at = m[1];
+ break;
+ }
+ }
+
+ self.emit('result', res);
+
+ var pendingAsserts = self._pendingAsserts();
+ if (!pendingAsserts) {
+ if (extra.exiting) {
+ self._end();
+ } else {
+ nextTick(function () {
+ self._end();
+ });
+ }
+ }
+
+ if (!self._planError && pendingAsserts < 0) {
+ self._planError = true;
+ self.fail('plan != count', {
+ expected : self._plan,
+ actual : self._plan - pendingAsserts
+ });
+ }
+};
+
+Test.prototype.fail = function (msg, extra) {
+ this._assert(false, {
+ message : msg,
+ operator : 'fail',
+ extra : extra
+ });
+};
+
+Test.prototype.pass = function (msg, extra) {
+ this._assert(true, {
+ message : msg,
+ operator : 'pass',
+ extra : extra
+ });
+};
+
+Test.prototype.skip = function (msg, extra) {
+ this._assert(true, {
+ message : msg,
+ operator : 'skip',
+ skip : true,
+ extra : extra
+ });
+};
+
+Test.prototype.ok
+= Test.prototype['true']
+= Test.prototype.assert
+= function (value, msg, extra) {
+ this._assert(value, {
+ message : defined(msg, 'should be truthy'),
+ operator : 'ok',
+ expected : true,
+ actual : value,
+ extra : extra
+ });
+};
+
+Test.prototype.notOk
+= Test.prototype['false']
+= Test.prototype.notok
+= function (value, msg, extra) {
+ this._assert(!value, {
+ message : defined(msg, 'should be falsy'),
+ operator : 'notOk',
+ expected : false,
+ actual : value,
+ extra : extra
+ });
+};
+
+Test.prototype.error
+= Test.prototype.ifError
+= Test.prototype.ifErr
+= Test.prototype.iferror
+= function (err, msg, extra) {
+ this._assert(!err, {
+ message : defined(msg, String(err)),
+ operator : 'error',
+ actual : err,
+ extra : extra
+ });
+};
+
+Test.prototype.equal
+= Test.prototype.equals
+= Test.prototype.isEqual
+= Test.prototype.is
+= Test.prototype.strictEqual
+= Test.prototype.strictEquals
+= function (a, b, msg, extra) {
+ this._assert(a === b, {
+ message : defined(msg, 'should be equal'),
+ operator : 'equal',
+ actual : a,
+ expected : b,
+ extra : extra
+ });
+};
+
+Test.prototype.notEqual
+= Test.prototype.notEquals
+= Test.prototype.notStrictEqual
+= Test.prototype.notStrictEquals
+= Test.prototype.isNotEqual
+= Test.prototype.isNot
+= Test.prototype.not
+= Test.prototype.doesNotEqual
+= Test.prototype.isInequal
+= function (a, b, msg, extra) {
+ this._assert(a !== b, {
+ message : defined(msg, 'should not be equal'),
+ operator : 'notEqual',
+ actual : a,
+ notExpected : b,
+ extra : extra
+ });
+};
+
+Test.prototype.deepEqual
+= Test.prototype.deepEquals
+= Test.prototype.isEquivalent
+= Test.prototype.same
+= function (a, b, msg, extra) {
+ this._assert(deepEqual(a, b, { strict: true }), {
+ message : defined(msg, 'should be equivalent'),
+ operator : 'deepEqual',
+ actual : a,
+ expected : b,
+ extra : extra
+ });
+};
+
+Test.prototype.deepLooseEqual
+= Test.prototype.looseEqual
+= Test.prototype.looseEquals
+= function (a, b, msg, extra) {
+ this._assert(deepEqual(a, b), {
+ message : defined(msg, 'should be equivalent'),
+ operator : 'deepLooseEqual',
+ actual : a,
+ expected : b,
+ extra : extra
+ });
+};
+
+Test.prototype.notDeepEqual
+= Test.prototype.notEquivalent
+= Test.prototype.notDeeply
+= Test.prototype.notSame
+= Test.prototype.isNotDeepEqual
+= Test.prototype.isNotDeeply
+= Test.prototype.isNotEquivalent
+= Test.prototype.isInequivalent
+= function (a, b, msg, extra) {
+ this._assert(!deepEqual(a, b, { strict: true }), {
+ message : defined(msg, 'should not be equivalent'),
+ operator : 'notDeepEqual',
+ actual : a,
+ notExpected : b,
+ extra : extra
+ });
+};
+
+Test.prototype.notDeepLooseEqual
+= Test.prototype.notLooseEqual
+= Test.prototype.notLooseEquals
+= function (a, b, msg, extra) {
+ this._assert(!deepEqual(a, b), {
+ message : defined(msg, 'should be equivalent'),
+ operator : 'notDeepLooseEqual',
+ actual : a,
+ expected : b,
+ extra : extra
+ });
+};
+
+Test.prototype['throws'] = function (fn, expected, msg, extra) {
+ if (typeof expected === 'string') {
+ msg = expected;
+ expected = undefined;
+ }
+
+ var caught = undefined;
+
+ try {
+ fn();
+ } catch (err) {
+ caught = { error : err };
+ if ((err != null) && (!isEnumerable(err, 'message') || !has(err, 'message'))) {
+ var message = err.message;
+ delete err.message;
+ err.message = message;
+ }
+ }
+
+ var passed = caught;
+
+ if (expected instanceof RegExp) {
+ passed = expected.test(caught && caught.error);
+ expected = String(expected);
+ }
+
+ if (typeof expected === 'function' && caught) {
+ passed = caught.error instanceof expected;
+ caught.error = caught.error.constructor;
+ }
+
+ this._assert(typeof fn === 'function' && passed, {
+ message : defined(msg, 'should throw'),
+ operator : 'throws',
+ actual : caught && caught.error,
+ expected : expected,
+ error: !passed && caught && caught.error,
+ extra : extra
+ });
+};
+
+Test.prototype.doesNotThrow = function (fn, expected, msg, extra) {
+ if (typeof expected === 'string') {
+ msg = expected;
+ expected = undefined;
+ }
+ var caught = undefined;
+ try {
+ fn();
+ }
+ catch (err) {
+ caught = { error : err };
+ }
+ this._assert(!caught, {
+ message : defined(msg, 'should not throw'),
+ operator : 'throws',
+ actual : caught && caught.error,
+ expected : expected,
+ error : caught && caught.error,
+ extra : extra
+ });
+};
+
+Test.skip = function (name_, _opts, _cb) {
+ var args = getTestArgs.apply(null, arguments);
+ args.opts.skip = true;
+ return Test(args.name, args.opts, args.cb);
+};
+
+// vim: set softtabstop=4 shiftwidth=4:
+
diff --git a/node_modules/tape/package.json b/node_modules/tape/package.json
new file mode 100644
index 0000000..4e3cf04
--- /dev/null
+++ b/node_modules/tape/package.json
@@ -0,0 +1,141 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "tape",
+ "scope": null,
+ "escapedName": "tape",
+ "name": "tape",
+ "rawSpec": "",
+ "spec": "latest",
+ "type": "tag"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo"
+ ]
+ ],
+ "_from": "tape@latest",
+ "_id": "tape@4.6.2",
+ "_inCache": true,
+ "_location": "/tape",
+ "_nodeVersion": "6.6.0",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/tape-4.6.2.tgz_1475259151192_0.3350706466007978"
+ },
+ "_npmUser": {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ },
+ "_npmVersion": "3.10.3",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "tape",
+ "scope": null,
+ "escapedName": "tape",
+ "name": "tape",
+ "rawSpec": "",
+ "spec": "latest",
+ "type": "tag"
+ },
+ "_requiredBy": [
+ "#USER"
+ ],
+ "_resolved": "https://registry.npmjs.org/tape/-/tape-4.6.2.tgz",
+ "_shasum": "19b3d874508485a1dc30fb30fe2a7d9be2c28b78",
+ "_shrinkwrap": null,
+ "_spec": "tape",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "bin": {
+ "tape": "./bin/tape"
+ },
+ "bugs": {
+ "url": "https://github.com/substack/tape/issues"
+ },
+ "dependencies": {
+ "deep-equal": "~1.0.1",
+ "defined": "~1.0.0",
+ "function-bind": "~1.1.0",
+ "glob": "~7.1.0",
+ "has": "~1.0.1",
+ "inherits": "~2.0.3",
+ "minimist": "~1.2.0",
+ "object-inspect": "~1.2.1",
+ "resolve": "~1.1.7",
+ "resumer": "~0.0.0",
+ "string.prototype.trim": "~1.1.2",
+ "through": "~2.3.8"
+ },
+ "description": "tap-producing test harness for node and browsers",
+ "devDependencies": {
+ "concat-stream": "~1.5.2",
+ "falafel": "~2.0.0",
+ "js-yaml": "~3.6.1",
+ "tap": "~7.1.1",
+ "tap-parser": "~3.0.3"
+ },
+ "directories": {
+ "example": "example",
+ "test": "test"
+ },
+ "dist": {
+ "shasum": "19b3d874508485a1dc30fb30fe2a7d9be2c28b78",
+ "tarball": "https://registry.npmjs.org/tape/-/tape-4.6.2.tgz"
+ },
+ "gitHead": "c9b8ce83e875f556acdb0cc46d6cec9a3c057bd3",
+ "homepage": "https://github.com/substack/tape",
+ "keywords": [
+ "tap",
+ "test",
+ "harness",
+ "assert",
+ "browser"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "substack@gmail.com"
+ },
+ {
+ "name": "raynos",
+ "email": "raynos2@gmail.com"
+ },
+ {
+ "name": "domenic",
+ "email": "d@domenic.me"
+ },
+ {
+ "name": "ljharb",
+ "email": "ljharb@gmail.com"
+ }
+ ],
+ "name": "tape",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/tape.git"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "testling": {
+ "files": "test/browser/*.js",
+ "browsers": [
+ "ie/6..latest",
+ "chrome/20..latest",
+ "firefox/10..latest",
+ "safari/latest",
+ "opera/11.0..latest",
+ "iphone/6",
+ "ipad/6"
+ ]
+ },
+ "version": "4.6.2"
+}
diff --git a/node_modules/tape/readme.markdown b/node_modules/tape/readme.markdown
new file mode 100644
index 0000000..a45db94
--- /dev/null
+++ b/node_modules/tape/readme.markdown
@@ -0,0 +1,385 @@
+# tape
+
+tap-producing test harness for node and browsers
+
+[](http://ci.testling.com/substack/tape)
+
+[](http://travis-ci.org/substack/tape)
+
+
+
+# example
+
+``` js
+var test = require('tape');
+
+test('timing test', function (t) {
+ t.plan(2);
+
+ t.equal(typeof Date.now, 'function');
+ var start = Date.now();
+
+ setTimeout(function () {
+ t.equal(Date.now() - start, 100);
+ }, 100);
+});
+```
+
+```
+$ node example/timing.js
+TAP version 13
+# timing test
+ok 1 should be equal
+not ok 2 should be equal
+ ---
+ operator: equal
+ expected: 100
+ actual: 107
+ ...
+
+1..2
+# tests 2
+# pass 1
+# fail 1
+```
+
+# usage
+
+You always need to `require('tape')` in test files. You can run the tests by
+usual node means (`require('test-file.js')` or `node test-file.js`). You can
+also run tests using the `tape` binary to utilize globbing, on Windows for
+example:
+
+```sh
+$ tape tests/**/*.js
+```
+
+`tape`'s arguments are passed to the
+[`glob`](https://www.npmjs.com/package/glob) module. If you want `glob` to
+perform the expansion on a system where the shell performs such expansion, quote
+the arguments as necessary:
+
+```sh
+$ tape 'tests/**/*.js'
+$ tape "tests/**/*.js"
+```
+
+## Preloading modules
+
+Additionally, it is possible to make `tape` load one or more modules before running any tests, by using the `-r` or `--require` flag. Here's an example that loads [babel-register](http://babeljs.io/docs/usage/require/) before running any tests, to allow for JIT compilation:
+
+```sh
+$ tape -r babel-register tests/**/*.js
+```
+
+Depending on the module you're loading, you may be able to paramaterize it using environment variables or auxiliary files. Babel, for instance, will load options from [`.babelrc`](http://babeljs.io/docs/usage/babelrc/) at runtime.
+
+The `-r` flag behaves exactly like node's `require`, and uses the same module resolution algorithm. This means that if you need to load local modules, you have to prepend their path with `./` or `../` accordingly.
+
+For example:
+
+```sh
+$ tape -r ./my/local/module tests/**/*.js
+```
+
+Please note that all modules loaded using the `-r` flag will run *before* any tests, regardless of when they are specified. For example, `tape -r a b -r c` will actually load `a` and `c` *before* loading `b`, since they are flagged as required modules.
+
+# things that go well with tape
+
+tape maintains a fairly minimal core. Additional features are usually added by using another module alongside tape.
+
+## pretty reporters
+
+The default TAP output is good for machines and humans that are robots.
+
+If you want a more colorful / pretty output there are lots of modules on npm
+that will output something pretty if you pipe TAP into them:
+
+ - https://github.com/scottcorgan/tap-spec
+ - https://github.com/scottcorgan/tap-dot
+ - https://github.com/substack/faucet
+ - https://github.com/juliangruber/tap-bail
+ - https://github.com/kirbysayshi/tap-browser-color
+ - https://github.com/gummesson/tap-json
+ - https://github.com/gummesson/tap-min
+ - https://github.com/calvinmetcalf/tap-nyan
+ - https://www.npmjs.org/package/tap-pessimist
+ - https://github.com/toolness/tap-prettify
+ - https://github.com/shuhei/colortape
+ - https://github.com/aghassemi/tap-xunit
+ - https://github.com/namuol/tap-difflet
+ - https://github.com/gritzko/tape-dom
+ - https://github.com/axross/tap-diff
+ - https://github.com/axross/tap-notify
+ - https://github.com/zoubin/tap-summary
+ - https://github.com/Hypercubed/tap-markdown
+
+To use them, try `node test/index.js | tap-spec` or pipe it into one
+of the modules of your choice!
+
+## uncaught exceptions
+
+By default, uncaught exceptions in your tests will not be intercepted, and will cause tape to crash. If you find this behavior undesirable, use [tape-catch](https://github.com/michaelrhodes/tape-catch) to report any exceptions as TAP errors.
+
+## other
+
+- CoffeeScript support with https://www.npmjs.com/package/coffeetape
+- Promise support with https://www.npmjs.com/package/blue-tape
+- ES6 support with https://www.npmjs.com/package/babel-tape-runner
+
+# methods
+
+The assertion methods in tape are heavily influenced or copied from the methods
+in [node-tap](https://github.com/isaacs/node-tap).
+
+```
+var test = require('tape')
+```
+
+## test([name], [opts], cb)
+
+Create a new test with an optional `name` string and optional `opts` object.
+`cb(t)` fires with the new test object `t` once all preceeding tests have
+finished. Tests execute serially.
+
+Available `opts` options are:
+- opts.skip = true/false. See test.skip.
+- opts.timeout = 500. Set a timeout for the test, after which it will fail.
+ See test.timeoutAfter.
+- opts.objectPrintDepth = 5. Configure max depth of expected / actual object
+ printing.
+
+If you forget to `t.plan()` out how many assertions you are going to run and you
+don't call `t.end()` explicitly, your test will hang.
+
+## test.skip(name, cb)
+
+Generate a new test that will be skipped over.
+
+## test.onFinish(fn)
+
+The onFinish hook will get invoked when ALL tape tests have finished
+right before tape is about to print the test summary.
+
+## t.plan(n)
+
+Declare that `n` assertions should be run. `t.end()` will be called
+automatically after the `n`th assertion. If there are any more assertions after
+the `n`th, or after `t.end()` is called, they will generate errors.
+
+## t.end(err)
+
+Declare the end of a test explicitly. If `err` is passed in `t.end` will assert
+that it is falsey.
+
+## t.fail(msg)
+
+Generate a failing assertion with a message `msg`.
+
+## t.pass(msg)
+
+Generate a passing assertion with a message `msg`.
+
+## t.timeoutAfter(ms)
+
+Automatically timeout the test after X ms.
+
+## t.skip(msg)
+
+Generate an assertion that will be skipped over.
+
+## t.ok(value, msg)
+
+Assert that `value` is truthy with an optional description of the assertion `msg`.
+
+Aliases: `t.true()`, `t.assert()`
+
+## t.notOk(value, msg)
+
+Assert that `value` is falsy with an optional description of the assertion `msg`.
+
+Aliases: `t.false()`, `t.notok()`
+
+## t.error(err, msg)
+
+Assert that `err` is falsy. If `err` is non-falsy, use its `err.message` as the
+description message.
+
+Aliases: `t.ifError()`, `t.ifErr()`, `t.iferror()`
+
+## t.equal(actual, expected, msg)
+
+Assert that `actual === expected` with an optional description of the assertion `msg`.
+
+Aliases: `t.equals()`, `t.isEqual()`, `t.is()`, `t.strictEqual()`,
+`t.strictEquals()`
+
+## t.notEqual(actual, expected, msg)
+
+Assert that `actual !== expected` with an optional description of the assertion `msg`.
+
+Aliases: `t.notEquals()`, `t.notStrictEqual()`, `t.notStrictEquals()`,
+`t.isNotEqual()`, `t.isNot()`, `t.not()`, `t.doesNotEqual()`, `t.isInequal()`
+
+## t.deepEqual(actual, expected, msg)
+
+Assert that `actual` and `expected` have the same structure and nested values using
+[node's deepEqual() algorithm](https://github.com/substack/node-deep-equal)
+with strict comparisons (`===`) on leaf nodes and an optional description of the assertion `msg`.
+
+Aliases: `t.deepEquals()`, `t.isEquivalent()`, `t.same()`
+
+## t.notDeepEqual(actual, expected, msg)
+
+Assert that `actual` and `expected` do not have the same structure and nested values using
+[node's deepEqual() algorithm](https://github.com/substack/node-deep-equal)
+with strict comparisons (`===`) on leaf nodes and an optional description of the assertion `msg`.
+
+Aliases: `t.notEquivalent()`, `t.notDeeply()`, `t.notSame()`,
+`t.isNotDeepEqual()`, `t.isNotDeeply()`, `t.isNotEquivalent()`,
+`t.isInequivalent()`
+
+## t.deepLooseEqual(actual, expected, msg)
+
+Assert that `actual` and `expected` have the same structure and nested values using
+[node's deepEqual() algorithm](https://github.com/substack/node-deep-equal)
+with loose comparisons (`==`) on leaf nodes and an optional description of the assertion `msg`.
+
+Aliases: `t.looseEqual()`, `t.looseEquals()`
+
+## t.notDeepLooseEqual(actual, expected, msg)
+
+Assert that `actual` and `expected` do not have the same structure and nested values using
+[node's deepEqual() algorithm](https://github.com/substack/node-deep-equal)
+with loose comparisons (`==`) on leaf nodes and an optional description of the assertion `msg`.
+
+Aliases: `t.notLooseEqual()`, `t.notLooseEquals()`
+
+## t.throws(fn, expected, msg)
+
+Assert that the function call `fn()` throws an exception. `expected`, if present, must be a `RegExp` or `Function`. The `RegExp` matches the string representation of the exception, as generated by `err.toString()`. The `Function` is the exception thrown (e.g. `Error`). `msg` is an optional description of the assertion.
+
+## t.doesNotThrow(fn, expected, msg)
+
+Assert that the function call `fn()` does not throw an exception. `msg` is an optional description of the assertion.
+
+## t.test(name, [opts], cb)
+
+Create a subtest with a new test handle `st` from `cb(st)` inside the current
+test `t`. `cb(st)` will only fire when `t` finishes. Additional tests queued up
+after `t` will not be run until all subtests finish.
+
+You may pass the same options that [`test()`](#testname-opts-cb) accepts.
+
+## t.comment(message)
+
+Print a message without breaking the tap output. (Useful when using e.g. `tap-colorize` where output is buffered & `console.log` will print in incorrect order vis-a-vis tap output.)
+
+## var htest = test.createHarness()
+
+Create a new test harness instance, which is a function like `test()`, but with
+a new pending stack and test state.
+
+By default the TAP output goes to `console.log()`. You can pipe the output to
+someplace else if you `htest.createStream().pipe()` to a destination stream on
+the first tick.
+
+## test.only(name, cb)
+
+Like `test(name, cb)` except if you use `.only` this is the only test case
+that will run for the entire process, all other test cases using tape will
+be ignored
+
+## var stream = test.createStream(opts)
+
+Create a stream of output, bypassing the default output stream that writes
+messages to `console.log()`. By default `stream` will be a text stream of TAP
+output, but you can get an object stream instead by setting `opts.objectMode` to
+`true`.
+
+### tap stream reporter
+
+You can create your own custom test reporter using this `createStream()` api:
+
+``` js
+var test = require('tape');
+var path = require('path');
+
+test.createStream().pipe(process.stdout);
+
+process.argv.slice(2).forEach(function (file) {
+ require(path.resolve(file));
+});
+```
+
+You could substitute `process.stdout` for whatever other output stream you want,
+like a network connection or a file.
+
+Pass in test files to run as arguments:
+
+```
+$ node tap.js test/x.js test/y.js
+TAP version 13
+# (anonymous)
+not ok 1 should be equal
+ ---
+ operator: equal
+ expected: "boop"
+ actual: "beep"
+ ...
+# (anonymous)
+ok 2 should be equal
+ok 3 (unnamed assert)
+# wheee
+ok 4 (unnamed assert)
+
+1..4
+# tests 4
+# pass 3
+# fail 1
+```
+
+### object stream reporter
+
+Here's how you can render an object stream instead of TAP:
+
+``` js
+var test = require('tape');
+var path = require('path');
+
+test.createStream({ objectMode: true }).on('data', function (row) {
+ console.log(JSON.stringify(row))
+});
+
+process.argv.slice(2).forEach(function (file) {
+ require(path.resolve(file));
+});
+```
+
+The output for this runner is:
+
+```
+$ node object.js test/x.js test/y.js
+{"type":"test","name":"(anonymous)","id":0}
+{"id":0,"ok":false,"name":"should be equal","operator":"equal","actual":"beep","expected":"boop","error":{},"test":0,"type":"assert"}
+{"type":"end","test":0}
+{"type":"test","name":"(anonymous)","id":1}
+{"id":0,"ok":true,"name":"should be equal","operator":"equal","actual":2,"expected":2,"test":1,"type":"assert"}
+{"id":1,"ok":true,"name":"(unnamed assert)","operator":"ok","actual":true,"expected":true,"test":1,"type":"assert"}
+{"type":"end","test":1}
+{"type":"test","name":"wheee","id":2}
+{"id":0,"ok":true,"name":"(unnamed assert)","operator":"ok","actual":true,"expected":true,"test":2,"type":"assert"}
+{"type":"end","test":2}
+```
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install tape --save-dev
+```
+
+# license
+
+MIT
diff --git a/node_modules/tape/test/add-subtest-async.js b/node_modules/tape/test/add-subtest-async.js
new file mode 100644
index 0000000..74b4d8a
--- /dev/null
+++ b/node_modules/tape/test/add-subtest-async.js
@@ -0,0 +1,11 @@
+var test = require('../')
+
+test('parent', function (t) {
+ t.pass('parent');
+ setTimeout(function () {
+ t.test('child', function (t) {
+ t.pass('child');
+ t.end();
+ });
+ }, 100)
+})
diff --git a/node_modules/tape/test/array.js b/node_modules/tape/test/array.js
new file mode 100644
index 0000000..d206be5
--- /dev/null
+++ b/node_modules/tape/test/array.js
@@ -0,0 +1,61 @@
+var falafel = require('falafel');
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('array test', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness();
+
+ test.createStream().pipe(concat(function (rows) {
+ tt.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# array',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'ok 5 should be equivalent',
+ '',
+ '1..5',
+ '# tests 5',
+ '# pass 5',
+ '',
+ '# ok'
+ ].join('\n') + '\n');
+ }));
+
+ test('array', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+ });
+});
diff --git a/node_modules/tape/test/bound.js b/node_modules/tape/test/bound.js
new file mode 100644
index 0000000..d398195
--- /dev/null
+++ b/node_modules/tape/test/bound.js
@@ -0,0 +1,10 @@
+var test = require('../');
+
+test('bind works', function (t) {
+ t.plan(2);
+ var equal = t.equal;
+ var deepEqual = t.deepEqual;
+ equal(3, 3);
+ deepEqual([4], [4]);
+ t.end();
+});
diff --git a/node_modules/tape/test/browser/asserts.js b/node_modules/tape/test/browser/asserts.js
new file mode 100644
index 0000000..a1b24f6
--- /dev/null
+++ b/node_modules/tape/test/browser/asserts.js
@@ -0,0 +1,9 @@
+var test = require('../../');
+
+test(function (t) {
+ t.plan(4);
+ t.ok(true);
+ t.equal(3, 1+2);
+ t.deepEqual([1,2,[3,4]], [1,2,[3,4]]);
+ t.notDeepEqual([1,2,[3,4,5]], [1,2,[3,4]]);
+});
diff --git a/node_modules/tape/test/child_ordering.js b/node_modules/tape/test/child_ordering.js
new file mode 100644
index 0000000..12efafe
--- /dev/null
+++ b/node_modules/tape/test/child_ordering.js
@@ -0,0 +1,54 @@
+var test = require('../');
+
+var childRan = false;
+
+test('parent', function(t) {
+ t.test('child', function(t) {
+ childRan = true;
+ t.pass('child ran');
+ t.end();
+ });
+ t.end();
+});
+
+test('uncle', function(t) {
+ t.ok(childRan, 'Child should run before next top-level test');
+ t.end();
+});
+
+var grandParentRan = false;
+var parentRan = false;
+var grandChildRan = false;
+test('grandparent', function(t) {
+ t.ok(!grandParentRan, 'grand parent ran twice');
+ grandParentRan = true;
+ t.test('parent', function(t) {
+ t.ok(!parentRan, 'parent ran twice');
+ parentRan = true;
+ t.test('grandchild', function(t) {
+ t.ok(!grandChildRan, 'grand child ran twice');
+ grandChildRan = true;
+ t.pass('grand child ran');
+ t.end();
+ });
+ t.pass('parent ran');
+ t.end();
+ });
+ t.test('other parent', function(t) {
+ t.ok(parentRan, 'first parent runs before second parent');
+ t.ok(grandChildRan, 'grandchild runs before second parent');
+ t.end();
+ });
+ t.pass('grandparent ran');
+ t.end();
+});
+
+test('second grandparent', function(t) {
+ t.ok(grandParentRan, 'grandparent ran');
+ t.ok(parentRan, 'parent ran');
+ t.ok(grandChildRan, 'grandchild ran');
+ t.pass('other grandparent ran');
+ t.end();
+});
+
+// vim: set softtabstop=4 shiftwidth=4:
diff --git a/node_modules/tape/test/circular-things.js b/node_modules/tape/test/circular-things.js
new file mode 100644
index 0000000..590ae43
--- /dev/null
+++ b/node_modules/tape/test/circular-things.js
@@ -0,0 +1,36 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('circular test', function (assert) {
+ var test = tape.createHarness({ exit : false });
+ assert.plan(1);
+
+ test.createStream().pipe(concat(function (body) {
+ assert.equal(
+ body.toString('utf8'),
+ 'TAP version 13\n'
+ + '# circular\n'
+ + 'not ok 1 should be equal\n'
+ + ' ---\n'
+ + ' operator: equal\n'
+ + ' expected: |-\n'
+ + ' {}\n'
+ + ' actual: |-\n'
+ + ' { circular: [Circular] }\n'
+ + ' ...\n'
+ + '\n'
+ + '1..1\n'
+ + '# tests 1\n'
+ + '# pass 0\n'
+ + '# fail 1\n'
+ );
+ }));
+
+ test("circular", function (t) {
+ t.plan(1);
+ var circular = {};
+ circular.circular = circular;
+ t.equal(circular, {});
+ })
+})
diff --git a/node_modules/tape/test/comment.js b/node_modules/tape/test/comment.js
new file mode 100644
index 0000000..ab00690
--- /dev/null
+++ b/node_modules/tape/test/comment.js
@@ -0,0 +1,175 @@
+var concat = require('concat-stream');
+var tap = require('tap');
+var tape = require('../');
+
+// Exploratory test to ascertain proper output when no t.comment() call
+// is made.
+tap.test('no comment', function (assert) {
+ assert.plan(1);
+
+ var verify = function (output) {
+ assert.equal(output.toString('utf8'), [
+ 'TAP version 13',
+ '# no comment',
+ '',
+ '1..0',
+ '# tests 0',
+ '# pass 0',
+ '',
+ '# ok',
+ ''
+ ].join('\n'));
+ };
+
+ var test = tape.createHarness();
+ test.createStream().pipe(concat(verify));
+ test('no comment', function (t) {
+ t.end();
+ });
+});
+
+// Exploratory test, can we call t.comment() passing nothing?
+tap.test('missing argument', function (assert) {
+ assert.plan(1);
+ var test = tape.createHarness();
+ test.createStream();
+ test('missing argument', function (t) {
+ try {
+ t.comment();
+ t.end();
+ } catch (err) {
+ assert.equal(err.constructor, TypeError);
+ } finally {
+ assert.end();
+ }
+ });
+});
+
+// Exploratory test, can we call t.comment() passing nothing?
+tap.test('null argument', function (assert) {
+ assert.plan(1);
+ var test = tape.createHarness();
+ test.createStream();
+ test('null argument', function (t) {
+ try {
+ t.comment(null);
+ t.end();
+ } catch (err) {
+ assert.equal(err.constructor, TypeError);
+ } finally {
+ assert.end();
+ }
+ });
+});
+
+
+// Exploratory test, how is whitespace treated?
+tap.test('whitespace', function (assert) {
+ assert.plan(1);
+
+ var verify = function (output) {
+ assert.equal(output.toString('utf8'), [
+ 'TAP version 13',
+ '# whitespace',
+ '# ',
+ '# a',
+ '# a',
+ '# a',
+ '',
+ '1..0',
+ '# tests 0',
+ '# pass 0',
+ '',
+ '# ok',
+ ''
+ ].join('\n'));
+ };
+
+ var test = tape.createHarness();
+ test.createStream().pipe(concat(verify));
+ test('whitespace', function (t) {
+ t.comment(' ');
+ t.comment(' a');
+ t.comment('a ');
+ t.comment(' a ');
+ t.end();
+ });
+});
+
+// Exploratory test, how about passing types other than strings?
+tap.test('non-string types', function (assert) {
+ assert.plan(1);
+
+ var verify = function (output) {
+ assert.equal(output.toString('utf8'), [
+ 'TAP version 13',
+ '# non-string types',
+ '# true',
+ '# false',
+ '# 42',
+ '# 6.66',
+ '# [object Object]',
+ '# [object Object]',
+ '# [object Object]',
+ '# function ConstructorFunction() {}',
+ '',
+ '1..0',
+ '# tests 0',
+ '# pass 0',
+ '',
+ '# ok',
+ ''
+ ].join('\n'));
+ };
+
+ var test = tape.createHarness();
+ test.createStream().pipe(concat(verify));
+ test('non-string types', function (t) {
+ t.comment(true);
+ t.comment(false);
+ t.comment(42);
+ t.comment(6.66);
+ t.comment({});
+ t.comment({"answer": 42});
+ function ConstructorFunction() {}
+ t.comment(new ConstructorFunction());
+ t.comment(ConstructorFunction);
+ t.end();
+ });
+});
+
+tap.test('multiline string', function (assert) {
+ assert.plan(1);
+
+ var verify = function (output) {
+ assert.equal(output.toString('utf8'), [
+ 'TAP version 13',
+ '# multiline strings',
+ '# a',
+ '# b',
+ '# c',
+ '# d',
+ '',
+ '1..0',
+ '# tests 0',
+ '# pass 0',
+ '',
+ '# ok',
+ ''
+ ].join('\n'));
+ };
+
+ var test = tape.createHarness();
+ test.createStream().pipe(concat(verify));
+ test('multiline strings', function (t) {
+ t.comment([
+ 'a',
+ 'b',
+ ].join('\n'));
+ t.comment([
+ 'c',
+ 'd',
+ ].join('\r\n'));
+ t.end();
+ });
+});
diff --git a/node_modules/tape/test/deep-equal-failure.js b/node_modules/tape/test/deep-equal-failure.js
new file mode 100644
index 0000000..3f12b30
--- /dev/null
+++ b/node_modules/tape/test/deep-equal-failure.js
@@ -0,0 +1,174 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+var tapParser = require('tap-parser');
+var yaml = require('js-yaml');
+
+tap.test('deep equal failure', function (assert) {
+ var test = tape.createHarness({ exit : false });
+ var stream = test.createStream();
+ var parser = tapParser();
+ assert.plan(3);
+
+ stream.pipe(parser);
+ stream.pipe(concat(function (body) {
+ assert.equal(
+ body.toString('utf8'),
+ 'TAP version 13\n'
+ + '# deep equal\n'
+ + 'not ok 1 should be equal\n'
+ + ' ---\n'
+ + ' operator: equal\n'
+ + ' expected: |-\n'
+ + ' { b: 2 }\n'
+ + ' actual: |-\n'
+ + ' { a: 1 }\n'
+ + ' ...\n'
+ + '\n'
+ + '1..1\n'
+ + '# tests 1\n'
+ + '# pass 0\n'
+ + '# fail 1\n'
+ );
+
+ assert.deepEqual(getDiag(body), {
+ operator: 'equal',
+ expected: '{ b: 2 }',
+ actual: '{ a: 1 }'
+ });
+ }));
+
+ parser.once('assert', function (data) {
+ assert.deepEqual(data, {
+ ok: false,
+ id: 1,
+ name: 'should be equal',
+ diag: {
+ operator: 'equal',
+ expected: '{ b: 2 }',
+ actual: '{ a: 1 }'
+ }
+ });
+ });
+
+ test("deep equal", function (t) {
+ t.plan(1);
+ t.equal({a: 1}, {b: 2});
+ });
+})
+
+tap.test('deep equal failure, depth 6, with option', function (assert) {
+ var test = tape.createHarness({ exit : false });
+ var stream = test.createStream();
+ var parser = tapParser();
+ assert.plan(3);
+
+ stream.pipe(parser);
+ stream.pipe(concat(function (body) {
+ assert.equal(
+ body.toString('utf8'),
+ 'TAP version 13\n'
+ + '# deep equal\n'
+ + 'not ok 1 should be equal\n'
+ + ' ---\n'
+ + ' operator: equal\n'
+ + ' expected: |-\n'
+ + ' { a: { a1: { a2: { a3: { a4: { a5: 2 } } } } } }\n'
+ + ' actual: |-\n'
+ + ' { a: { a1: { a2: { a3: { a4: { a5: 1 } } } } } }\n'
+ + ' ...\n'
+ + '\n'
+ + '1..1\n'
+ + '# tests 1\n'
+ + '# pass 0\n'
+ + '# fail 1\n'
+ );
+
+ assert.deepEqual(getDiag(body), {
+ operator: 'equal',
+ expected: '{ a: { a1: { a2: { a3: { a4: { a5: 2 } } } } } }',
+ actual: '{ a: { a1: { a2: { a3: { a4: { a5: 1 } } } } } }'
+ });
+ }));
+
+ parser.once('assert', function (data) {
+ assert.deepEqual(data, {
+ ok: false,
+ id: 1,
+ name: 'should be equal',
+ diag: {
+ operator: 'equal',
+ expected: '{ a: { a1: { a2: { a3: { a4: { a5: 2 } } } } } }',
+ actual: '{ a: { a1: { a2: { a3: { a4: { a5: 1 } } } } } }'
+ }
+ });
+ });
+
+ test("deep equal", {objectPrintDepth: 6}, function (t) {
+ t.plan(1);
+ t.equal({ a: { a1: { a2: { a3: { a4: { a5: 1 } } } } } }, { a: { a1: { a2: { a3: { a4: { a5: 2 } } } } } });
+ });
+})
+
+tap.test('deep equal failure, depth 6, without option', function (assert) {
+ var test = tape.createHarness({ exit : false });
+ var stream = test.createStream();
+ var parser = tapParser();
+ assert.plan(3);
+
+ stream.pipe(parser);
+ stream.pipe(concat(function (body) {
+ assert.equal(
+ body.toString('utf8'),
+ 'TAP version 13\n'
+ + '# deep equal\n'
+ + 'not ok 1 should be equal\n'
+ + ' ---\n'
+ + ' operator: equal\n'
+ + ' expected: |-\n'
+ + ' { a: { a1: { a2: { a3: { a4: [Object] } } } } }\n'
+ + ' actual: |-\n'
+ + ' { a: { a1: { a2: { a3: { a4: [Object] } } } } }\n'
+ + ' ...\n'
+ + '\n'
+ + '1..1\n'
+ + '# tests 1\n'
+ + '# pass 0\n'
+ + '# fail 1\n'
+ );
+
+ assert.deepEqual(getDiag(body), {
+ operator: 'equal',
+ expected: '{ a: { a1: { a2: { a3: { a4: [Object] } } } } }',
+ actual: '{ a: { a1: { a2: { a3: { a4: [Object] } } } } }'
+ });
+ }));
+
+ parser.once('assert', function (data) {
+ assert.deepEqual(data, {
+ ok: false,
+ id: 1,
+ name: 'should be equal',
+ diag: {
+ operator: 'equal',
+ expected: '{ a: { a1: { a2: { a3: { a4: [Object] } } } } }',
+ actual: '{ a: { a1: { a2: { a3: { a4: [Object] } } } } }'
+ }
+ });
+ });
+
+ test("deep equal", function (t) {
+ t.plan(1);
+ t.equal({ a: { a1: { a2: { a3: { a4: { a5: 1 } } } } } }, { a: { a1: { a2: { a3: { a4: { a5: 2 } } } } } });
+ });
+})
+
+function getDiag (body) {
+ var yamlStart = body.indexOf(' ---');
+ var yamlEnd = body.indexOf(' ...\n');
+ var diag = body.slice(yamlStart, yamlEnd).split('\n').map(function (line) {
+ return line.slice(2);
+ }).join('\n');
+
+ return yaml.safeLoad(diag);
+}
diff --git a/node_modules/tape/test/deep.js b/node_modules/tape/test/deep.js
new file mode 100644
index 0000000..909ebe1
--- /dev/null
+++ b/node_modules/tape/test/deep.js
@@ -0,0 +1,17 @@
+var test = require('../');
+
+test('deep strict equal', function (t) {
+ t.notDeepEqual(
+ [ { a: '3' } ],
+ [ { a: 3 } ]
+ );
+ t.end();
+});
+
+test('deep loose equal', function (t) {
+ t.deepLooseEqual(
+ [ { a: '3' } ],
+ [ { a: 3 } ]
+ );
+ t.end();
+});
diff --git a/node_modules/tape/test/default-messages.js b/node_modules/tape/test/default-messages.js
new file mode 100644
index 0000000..46c055f
--- /dev/null
+++ b/node_modules/tape/test/default-messages.js
@@ -0,0 +1,31 @@
+var tap = require('tap');
+var path = require('path');
+var spawn = require('child_process').spawn;
+var concat = require('concat-stream');
+
+tap.test('default messages', function (t) {
+ t.plan(1);
+
+ var ps = spawn(process.execPath, [path.join(__dirname, 'messages', 'defaults.js')]);
+
+ ps.stdout.pipe(concat(function (rows) {
+
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# default messages',
+ 'ok 1 should be truthy',
+ 'ok 2 should be falsy',
+ 'ok 3 should be equal',
+ 'ok 4 should not be equal',
+ 'ok 5 should be equivalent',
+ 'ok 6 should be equivalent',
+ 'ok 7 should be equivalent',
+ '',
+ '1..7',
+ '# tests 7',
+ '# pass 7',
+ '',
+ '# ok'
+ ].join('\n') + '\n\n');
+ }));
+});
diff --git a/node_modules/tape/test/double_end.js b/node_modules/tape/test/double_end.js
new file mode 100644
index 0000000..624ce3a
--- /dev/null
+++ b/node_modules/tape/test/double_end.js
@@ -0,0 +1,28 @@
+var test = require('tap').test;
+var path = require('path');
+var concat = require('concat-stream');
+var spawn = require('child_process').spawn;
+
+test(function (t) {
+ t.plan(2);
+ var ps = spawn(process.execPath, [path.join(__dirname, 'double_end', 'double.js')]);
+ ps.on('exit', function (code) {
+ t.equal(code, 1);
+ });
+ ps.stdout.pipe(concat(function (body) {
+ t.equal(body.toString('utf8'), [
+ 'TAP version 13',
+ '# double end',
+ 'ok 1 should be equal',
+ 'not ok 2 .end() called twice',
+ ' ---',
+ ' operator: fail',
+ ' ...',
+ '',
+ '1..2',
+ '# tests 2',
+ '# pass 1',
+ '# fail 1',
+ ].join('\n') + '\n\n');
+ }));
+});
diff --git a/node_modules/tape/test/double_end/double.js b/node_modules/tape/test/double_end/double.js
new file mode 100644
index 0000000..4473482
--- /dev/null
+++ b/node_modules/tape/test/double_end/double.js
@@ -0,0 +1,9 @@
+var test = require('../../');
+
+test('double end', function (t) {
+ t.equal(1 + 1, 2);
+ t.end();
+ setTimeout(function () {
+ t.end();
+ }, 5);
+});
diff --git a/node_modules/tape/test/end-as-callback.js b/node_modules/tape/test/end-as-callback.js
new file mode 100644
index 0000000..a9478cb
--- /dev/null
+++ b/node_modules/tape/test/end-as-callback.js
@@ -0,0 +1,87 @@
+var tap = require("tap");
+var tape = require("../");
+var concat = require('concat-stream');
+
+tap.test("tape assert.end as callback", function (tt) {
+ var test = tape.createHarness({ exit: false })
+
+ test.createStream().pipe(concat(function (rows) {
+ tt.equal(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# do a task and write',
+ 'ok 1 null',
+ 'ok 2 should be equal',
+ '# do a task and write fail',
+ 'ok 3 null',
+ 'ok 4 should be equal',
+ 'not ok 5 Error: fail',
+ getStackTrace(rows), // tap error stack
+ '',
+ '1..5',
+ '# tests 5',
+ '# pass 4',
+ '# fail 1'
+ ].join('\n') + '\n');
+ tt.end()
+ }));
+
+ test("do a task and write", function (assert) {
+ fakeAsyncTask("foo", function (err, value) {
+ assert.ifError(err)
+ assert.equal(value, "taskfoo")
+
+ fakeAsyncWrite("bar", assert.end)
+ })
+ })
+
+ test("do a task and write fail", function (assert) {
+ fakeAsyncTask("bar", function (err, value) {
+ assert.ifError(err)
+ assert.equal(value, "taskbar")
+
+ fakeAsyncWriteFail("baz", assert.end)
+ })
+ })
+})
+
+function fakeAsyncTask(name, cb) {
+ cb(null, "task" + name)
+}
+
+function fakeAsyncWrite(name, cb) {
+ cb(null)
+}
+
+function fakeAsyncWriteFail(name, cb) {
+ cb(new Error("fail"))
+}
+
+/**
+ * extract the stack trace for the failed test.
+ * this will change dependent on the environment
+ * so no point hard-coding it in the test assertion
+ * see: https://git.io/v6hGG for example
+ * @param String rows - the tap output lines
+ * @returns String stacktrace - just the error stack part
+ */
+function getStackTrace(rows) {
+ var stacktrace = ' ---\n';
+ var extract = false;
+ rows.toString('utf8').split('\n').forEach(function (row) {
+ if (!extract) {
+ if (row.indexOf('---') > -1) { // start of stack trace
+ extract = true;
+ }
+ } else {
+ if (row.indexOf('...') > -1) { // end of stack trace
+ extract = false;
+ stacktrace += ' ...';
+ } else {
+ stacktrace += row + '\n';
+ }
+
+ }
+ });
+ // console.log(stacktrace);
+ return stacktrace;
+}
diff --git a/node_modules/tape/test/exit.js b/node_modules/tape/test/exit.js
new file mode 100644
index 0000000..963e6b0
--- /dev/null
+++ b/node_modules/tape/test/exit.js
@@ -0,0 +1,131 @@
+var tap = require('tap');
+var path = require('path');
+var spawn = require('child_process').spawn;
+var concat = require('concat-stream');
+
+tap.test('exit ok', function (t) {
+ t.plan(2);
+
+ var tc = function (rows) {
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# array',
+ '# hi',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'ok 5 should be equivalent',
+ '',
+ '1..5',
+ '# tests 5',
+ '# pass 5',
+ '',
+ '# ok',
+ '', // yes, these double-blank-lines at the end are required.
+ '' // if you can figure out how to remove them, please do!
+ ].join('\n'));
+ }
+
+ var ps = spawn(process.execPath, [path.join(__dirname, 'exit', 'ok.js')]);
+ ps.stdout.pipe(concat(tc));
+ ps.on('exit', function (code) {
+ t.equal(code, 0);
+ });
+});
+
+tap.test('exit fail', function (t) {
+ t.plan(2);
+
+ var tc = function (rows) {
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# array',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'not ok 5 should be equivalent',
+ ' ---',
+ ' operator: deepEqual',
+ ' expected: [ [ 1, 2, [ 3, 4444 ] ], [ 5, 6 ] ]',
+ ' actual: [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]',
+ ' ...',
+ '',
+ '1..5',
+ '# tests 5',
+ '# pass 4',
+ '# fail 1'
+ ].join('\n') + '\n\n');
+ };
+
+ var ps = spawn(process.execPath, [path.join(__dirname, 'exit', 'fail.js')]);
+ ps.stdout.pipe(concat(tc));
+ ps.on('exit', function (code) {
+ t.notEqual(code, 0);
+ });
+});
+
+tap.test('too few exit', function (t) {
+ t.plan(2);
+
+ var tc = function (rows) {
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# array',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'ok 5 should be equivalent',
+ 'not ok 6 plan != count',
+ ' ---',
+ ' operator: fail',
+ ' expected: 6',
+ ' actual: 5',
+ ' ...',
+ '',
+ '1..6',
+ '# tests 6',
+ '# pass 5',
+ '# fail 1'
+ ].join('\n') + '\n\n');
+ };
+
+ var ps = spawn(process.execPath, [path.join(__dirname, '/exit/too_few.js')]);
+ ps.stdout.pipe(concat(tc));
+ ps.on('exit', function (code) {
+ t.notEqual(code, 0);
+ });
+});
+
+tap.test('more planned in a second test', function (t) {
+ t.plan(2);
+
+ var tc = function (rows) {
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# first',
+ 'ok 1 should be truthy',
+ '# second',
+ 'ok 2 should be truthy',
+ 'not ok 3 plan != count',
+ ' ---',
+ ' operator: fail',
+ ' expected: 2',
+ ' actual: 1',
+ ' ...',
+ '',
+ '1..3',
+ '# tests 3',
+ '# pass 2',
+ '# fail 1'
+ ].join('\n') + '\n\n');
+ };
+
+ var ps = spawn(process.execPath, [path.join(__dirname, '/exit/second.js')]);
+ ps.stdout.pipe(concat(tc));
+ ps.on('exit', function (code) {
+ t.notEqual(code, 0);
+ });
+});
diff --git a/node_modules/tape/test/exit/fail.js b/node_modules/tape/test/exit/fail.js
new file mode 100644
index 0000000..d7fd3ce
--- /dev/null
+++ b/node_modules/tape/test/exit/fail.js
@@ -0,0 +1,35 @@
+var test = require('../../');
+var falafel = require('falafel');
+
+test('array', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4444 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/test/exit/ok.js b/node_modules/tape/test/exit/ok.js
new file mode 100644
index 0000000..f1068e5
--- /dev/null
+++ b/node_modules/tape/test/exit/ok.js
@@ -0,0 +1,36 @@
+var falafel = require('falafel');
+var test = require('../../');
+
+test('array', function (t) {
+ t.comment('hi');
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/test/exit/second.js b/node_modules/tape/test/exit/second.js
new file mode 100644
index 0000000..8a206bb
--- /dev/null
+++ b/node_modules/tape/test/exit/second.js
@@ -0,0 +1,11 @@
+var test = require('../../');
+
+test('first', function (t) {
+ t.plan(1);
+ t.ok(true);
+});
+
+test('second', function (t) {
+ t.plan(2);
+ t.ok(true);
+});
diff --git a/node_modules/tape/test/exit/too_few.js b/node_modules/tape/test/exit/too_few.js
new file mode 100644
index 0000000..8e60ce5
--- /dev/null
+++ b/node_modules/tape/test/exit/too_few.js
@@ -0,0 +1,35 @@
+var falafel = require('falafel');
+var test = require('../../');
+
+test('array', function (t) {
+ t.plan(6);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+});
diff --git a/node_modules/tape/test/exposed-harness.js b/node_modules/tape/test/exposed-harness.js
new file mode 100644
index 0000000..b790340
--- /dev/null
+++ b/node_modules/tape/test/exposed-harness.js
@@ -0,0 +1,13 @@
+var tape = require('../');
+var tap = require('tap');
+
+tap.test('main harness object is exposed', function (assert) {
+
+ assert.equal(typeof tape.getHarness, 'function', 'tape.getHarness is a function')
+
+ assert.equal(tape.getHarness()._results.pass, 0)
+
+ assert.end()
+
+})
+
diff --git a/node_modules/tape/test/fail.js b/node_modules/tape/test/fail.js
new file mode 100644
index 0000000..54c544c
--- /dev/null
+++ b/node_modules/tape/test/fail.js
@@ -0,0 +1,67 @@
+var falafel = require('falafel');
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('array test', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness({ exit : false });
+ var tc = function (rows) {
+ tt.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# array',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'not ok 5 should be equivalent',
+ ' ---',
+ ' operator: deepEqual',
+ ' expected: [ [ 1, 2, [ 3, 4444 ] ], [ 5, 6 ] ]',
+ ' actual: [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]',
+ ' ...',
+ '',
+ '1..5',
+ '# tests 5',
+ '# pass 4',
+ '# fail 1',
+ ''
+ ].join('\n'));
+ };
+
+ test.createStream().pipe(concat(tc));
+
+ test('array', function (t) {
+ t.plan(5);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4444 ] ], [ 5, 6 ] ]);
+ }
+ );
+ });
+});
diff --git a/node_modules/tape/test/many.js b/node_modules/tape/test/many.js
new file mode 100644
index 0000000..10556e5
--- /dev/null
+++ b/node_modules/tape/test/many.js
@@ -0,0 +1,8 @@
+var test = require('../');
+
+test('many tests', function (t) {
+ t.plan(100);
+ for (var i = 0; i < 100; i++) {
+ setTimeout(function () { t.pass() }, Math.random() * 50);
+ }
+});
diff --git a/node_modules/tape/test/max_listeners.js b/node_modules/tape/test/max_listeners.js
new file mode 100644
index 0000000..e807cdb
--- /dev/null
+++ b/node_modules/tape/test/max_listeners.js
@@ -0,0 +1,10 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+
+var ps = spawn(process.execPath, [path.join(__dirname, 'max_listeners', 'source.js')]);
+
+ps.stdout.pipe(process.stdout, { end : false });
+
+ps.stderr.on('data', function (buf) {
+ console.log('not ok ' + buf);
+});
diff --git a/node_modules/tape/test/max_listeners/source.js b/node_modules/tape/test/max_listeners/source.js
new file mode 100644
index 0000000..f78782f
--- /dev/null
+++ b/node_modules/tape/test/max_listeners/source.js
@@ -0,0 +1,5 @@
+var test = require('../../');
+
+for (var i = 0; i < 11; i ++) {
+ test(function (t) { t.ok(true, 'true is truthy'); t.end() });
+}
diff --git a/node_modules/tape/test/messages/defaults.js b/node_modules/tape/test/messages/defaults.js
new file mode 100644
index 0000000..8d842eb
--- /dev/null
+++ b/node_modules/tape/test/messages/defaults.js
@@ -0,0 +1,12 @@
+var test = require('../../');
+
+test('default messages', function (t) {
+ t.plan(7);
+ t.ok(true);
+ t.notOk(false);
+ t.equal(true, true);
+ t.notEqual(true, false);
+ t.deepEqual(true, true);
+ t.deepLooseEqual(true, true);
+ t.notDeepLooseEqual(true, false);
+});
diff --git a/node_modules/tape/test/nested-async-plan-noend.js b/node_modules/tape/test/nested-async-plan-noend.js
new file mode 100644
index 0000000..6f8cfdd
--- /dev/null
+++ b/node_modules/tape/test/nested-async-plan-noend.js
@@ -0,0 +1,36 @@
+var test = require('../');
+
+test('Harness async test support', function(t) {
+ t.plan(3);
+
+ t.ok(true, 'sync child A');
+
+ t.test('sync child B', function(tt) {
+ tt.plan(2);
+
+ setTimeout(function(){
+ tt.test('async grandchild A', function(ttt) {
+ ttt.plan(1);
+ ttt.ok(true);
+ });
+ }, 50);
+
+ setTimeout(function() {
+ tt.test('async grandchild B', function(ttt) {
+ ttt.plan(1);
+ ttt.ok(true);
+ });
+ }, 100);
+ });
+
+ setTimeout(function() {
+ t.test('async child', function(tt) {
+ tt.plan(2);
+ tt.ok(true, 'sync grandchild in async child A');
+ tt.test('sync grandchild in async child B', function(ttt) {
+ ttt.plan(1);
+ ttt.ok(true);
+ });
+ });
+ }, 200);
+});
diff --git a/node_modules/tape/test/nested-sync-noplan-noend.js b/node_modules/tape/test/nested-sync-noplan-noend.js
new file mode 100644
index 0000000..6039093
--- /dev/null
+++ b/node_modules/tape/test/nested-sync-noplan-noend.js
@@ -0,0 +1,43 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('nested sync test without plan or end', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness();
+ var tc = function (rows) {
+ tt.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# nested without plan or end',
+ '# first',
+ 'ok 1 should be truthy',
+ '# second',
+ 'ok 2 should be truthy',
+ '',
+ '1..2',
+ '# tests 2',
+ '# pass 2',
+ '',
+ '# ok'
+ ].join('\n') + '\n');
+ };
+
+ test.createStream().pipe(concat(tc));
+
+ test('nested without plan or end', function(t) {
+ t.test('first', function(q) {
+ setTimeout(function first() {
+ q.ok(true);
+ q.end()
+ }, 10);
+ });
+ t.test('second', function(q) {
+ setTimeout(function second() {
+ q.ok(true);
+ q.end()
+ }, 10);
+ });
+ });
+
+});
diff --git a/node_modules/tape/test/nested.js b/node_modules/tape/test/nested.js
new file mode 100644
index 0000000..f444f95
--- /dev/null
+++ b/node_modules/tape/test/nested.js
@@ -0,0 +1,83 @@
+var falafel = require('falafel');
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('array test', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness();
+ var tc = function (rows) {
+ tt.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# nested array test',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'ok 5 should be equivalent',
+ '# inside test',
+ 'ok 6 should be truthy',
+ 'ok 7 should be truthy',
+ '# another',
+ 'ok 8 should be truthy',
+ '',
+ '1..8',
+ '# tests 8',
+ '# pass 8',
+ '',
+ '# ok'
+ ].join('\n') + '\n');
+ };
+
+ test.createStream().pipe(concat(tc));
+
+ test('nested array test', function (t) {
+ t.plan(6);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ t.test('inside test', function (q) {
+ q.plan(2);
+ q.ok(true);
+
+ setTimeout(function () {
+ q.ok(true);
+ }, 100);
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+ });
+
+ test('another', function (t) {
+ t.plan(1);
+ setTimeout(function () {
+ t.ok(true);
+ }, 50);
+ });
+});
diff --git a/node_modules/tape/test/nested2.js b/node_modules/tape/test/nested2.js
new file mode 100644
index 0000000..58ae8f3
--- /dev/null
+++ b/node_modules/tape/test/nested2.js
@@ -0,0 +1,19 @@
+var test = require('../');
+
+test(function(t) {
+ var i = 0
+ t.test('setup', function(t) {
+ process.nextTick(function() {
+ t.equal(i, 0, 'called once')
+ i++
+ t.end()
+ })
+ })
+
+
+ t.test('teardown', function(t) {
+ t.end()
+ })
+
+ t.end()
+})
diff --git a/node_modules/tape/test/no_callback.js b/node_modules/tape/test/no_callback.js
new file mode 100644
index 0000000..760ff26
--- /dev/null
+++ b/node_modules/tape/test/no_callback.js
@@ -0,0 +1,3 @@
+var test = require('../');
+
+test('No callback.');
diff --git a/node_modules/tape/test/onFinish.js b/node_modules/tape/test/onFinish.js
new file mode 100644
index 0000000..5b77fae
--- /dev/null
+++ b/node_modules/tape/test/onFinish.js
@@ -0,0 +1,12 @@
+var tap = require("tap");
+var tape = require("../");
+
+tap.test("on finish", {timeout: 1000}, function (tt) {
+ tt.plan(1);
+ tape.onFinish(function() {
+ tt.pass('tape ended');
+ });
+ tape('dummy test', function(t) {
+ t.end();
+ });
+});
diff --git a/node_modules/tape/test/only-twice.js b/node_modules/tape/test/only-twice.js
new file mode 100644
index 0000000..ce6048e
--- /dev/null
+++ b/node_modules/tape/test/only-twice.js
@@ -0,0 +1,21 @@
+var tape = require('../');
+var tap = require('tap');
+
+tap.test('only twice error', function (assert) {
+ var test = tape.createHarness({ exit : false });
+
+ test.only("first only", function (t) {
+ t.end()
+ });
+
+ assert.throws(function() {
+ test.only('second only', function(t) {
+ t.end();
+ });
+ }, {
+ name: 'Error',
+ message: 'there can only be one only test'
+ });
+ assert.end();
+});
+
diff --git a/node_modules/tape/test/only.js b/node_modules/tape/test/only.js
new file mode 100644
index 0000000..f68c450
--- /dev/null
+++ b/node_modules/tape/test/only.js
@@ -0,0 +1,45 @@
+var tap = require('tap');
+var tape = require('../');
+var concat = require('concat-stream');
+
+tap.test('tape only test', function (tt) {
+ var test = tape.createHarness({ exit: false });
+ var ran = [];
+
+ var tc = function (rows) {
+ tt.deepEqual(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# run success',
+ 'ok 1 assert name',
+ '',
+ '1..1',
+ '# tests 1',
+ '# pass 1',
+ '',
+ '# ok'
+ ].join('\n') + '\n');
+ tt.deepEqual(ran, [ 3 ]);
+
+ tt.end()
+ };
+
+ test.createStream().pipe(concat(tc));
+
+ test("never run fail", function (t) {
+ ran.push(1);
+ t.equal(true, false)
+ t.end()
+ })
+
+ test("never run success", function (t) {
+ ran.push(2);
+ t.equal(true, true)
+ t.end()
+ })
+
+ test.only("run success", function (t) {
+ ran.push(3);
+ t.ok(true, "assert name")
+ t.end()
+ })
+})
diff --git a/node_modules/tape/test/only2.js b/node_modules/tape/test/only2.js
new file mode 100644
index 0000000..fcf4f43
--- /dev/null
+++ b/node_modules/tape/test/only2.js
@@ -0,0 +1,9 @@
+var test = require('../');
+
+test('only2 test 1', function (t) {
+ t.end();
+});
+
+test.only('only2 test 2', function (t) {
+ t.end();
+});
diff --git a/node_modules/tape/test/only3.js b/node_modules/tape/test/only3.js
new file mode 100644
index 0000000..b192a4e
--- /dev/null
+++ b/node_modules/tape/test/only3.js
@@ -0,0 +1,15 @@
+var test = require('../');
+
+test('only3 test 1', function (t) {
+ t.fail('not 1');
+ t.end();
+});
+
+test.only('only3 test 2', function (t) {
+ t.end();
+});
+
+test('only3 test 3', function (t) {
+ t.fail('not 3');
+ t.end();
+});
diff --git a/node_modules/tape/test/only4.js b/node_modules/tape/test/only4.js
new file mode 100644
index 0000000..d570b5b
--- /dev/null
+++ b/node_modules/tape/test/only4.js
@@ -0,0 +1,10 @@
+var test = require('../');
+
+test('only4 duplicate test name', function (t) {
+ t.fail('not 1');
+ t.end();
+});
+
+test.only('only4 duplicate test name', function (t) {
+ t.end();
+});
diff --git a/node_modules/tape/test/only5.js b/node_modules/tape/test/only5.js
new file mode 100644
index 0000000..0e15887
--- /dev/null
+++ b/node_modules/tape/test/only5.js
@@ -0,0 +1,10 @@
+var test = require('../');
+
+test.only('only5 duplicate test name', function (t) {
+ t.end();
+});
+
+test('only5 duplicate test name', function (t) {
+ t.fail('not 2');
+ t.end();
+});
diff --git a/node_modules/tape/test/order.js b/node_modules/tape/test/order.js
new file mode 100644
index 0000000..02aaa05
--- /dev/null
+++ b/node_modules/tape/test/order.js
@@ -0,0 +1,17 @@
+var test = require('../');
+var current = 0;
+
+test(function (t) {
+ t.equal(current++, 0);
+ t.end();
+});
+test(function (t) {
+ t.plan(1);
+ setTimeout(function () {
+ t.equal(current++, 1);
+ }, 100);
+});
+test(function (t) {
+ t.equal(current++, 2);
+ t.end();
+});
diff --git a/node_modules/tape/test/plan_optional.js b/node_modules/tape/test/plan_optional.js
new file mode 100644
index 0000000..a092eab
--- /dev/null
+++ b/node_modules/tape/test/plan_optional.js
@@ -0,0 +1,15 @@
+var test = require('../');
+
+test('plan should be optional', function (t) {
+ t.pass('no plan here');
+ t.end();
+});
+
+test('no plan async', function (t) {
+ setTimeout(function() {
+ t.pass('ok');
+ t.end();
+ }, 100);
+});
+
+// vim: set softtabstop=4 shiftwidth=4:
diff --git a/node_modules/tape/test/require.js b/node_modules/tape/test/require.js
new file mode 100644
index 0000000..6b05a00
--- /dev/null
+++ b/node_modules/tape/test/require.js
@@ -0,0 +1,69 @@
+var tap = require('tap');
+var spawn = require('child_process').spawn;
+var concat = require('concat-stream');
+
+tap.test('requiring a single module', function (t) {
+ t.plan(2);
+
+ var tc = function (rows) {
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# module-a',
+ 'ok 1 loaded module a',
+ '# test-a',
+ 'ok 2 module-a loaded in same context',
+ 'ok 3 test ran after module-a was loaded',
+ '',
+ '1..3',
+ '# tests 3',
+ '# pass 3',
+ '',
+ '# ok'
+ ].join('\n') + '\n\n');
+ };
+
+ var ps = tape('-r ./require/a require/test-a.js');
+ ps.stdout.pipe(concat(tc));
+ ps.on('exit', function (code) {
+ t.equal(code, 0);
+ });
+});
+
+tap.test('requiring multiple modules', function (t) {
+ t.plan(2);
+
+ var tc = function (rows) {
+ t.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# module-a',
+ 'ok 1 loaded module a',
+ '# module-b',
+ 'ok 2 loaded module b',
+ '# test-a',
+ 'ok 3 module-a loaded in same context',
+ 'ok 4 test ran after module-a was loaded',
+ '# test-b',
+ 'ok 5 module-b loaded in same context',
+ 'ok 6 test ran after module-b was loaded',
+ '',
+ '1..6',
+ '# tests 6',
+ '# pass 6',
+ '',
+ '# ok'
+ ].join('\n') + '\n\n');
+ };
+
+ var ps = tape('-r ./require/a -r ./require/b require/test-a.js require/test-b.js');
+ ps.stdout.pipe(concat(tc));
+ ps.on('exit', function (code) {
+ t.equal(code, 0);
+ });
+});
+
+function tape(args) {
+ var proc = require('child_process')
+ var bin = __dirname + '/../bin/tape'
+
+ return proc.spawn('node', [bin].concat(args.split(' ')), { cwd: __dirname })
+}
\ No newline at end of file
diff --git a/node_modules/tape/test/require/a.js b/node_modules/tape/test/require/a.js
new file mode 100644
index 0000000..b2dd811
--- /dev/null
+++ b/node_modules/tape/test/require/a.js
@@ -0,0 +1,8 @@
+var tape = require('../..');
+
+tape.test('module-a', function(t) {
+ t.plan(1)
+ t.pass('loaded module a')
+})
+
+global.module_a = true
\ No newline at end of file
diff --git a/node_modules/tape/test/require/b.js b/node_modules/tape/test/require/b.js
new file mode 100644
index 0000000..2206c17
--- /dev/null
+++ b/node_modules/tape/test/require/b.js
@@ -0,0 +1,8 @@
+var tape = require('../..');
+
+tape.test('module-b', function(t) {
+ t.plan(1)
+ t.pass('loaded module b')
+})
+
+global.module_b = true
\ No newline at end of file
diff --git a/node_modules/tape/test/require/test-a.js b/node_modules/tape/test/require/test-a.js
new file mode 100644
index 0000000..822ef54
--- /dev/null
+++ b/node_modules/tape/test/require/test-a.js
@@ -0,0 +1,7 @@
+var tape = require('../..');
+
+tape.test('test-a', function(t) {
+ t.ok(global.module_a, 'module-a loaded in same context')
+ t.pass('test ran after module-a was loaded')
+ t.end()
+})
\ No newline at end of file
diff --git a/node_modules/tape/test/require/test-b.js b/node_modules/tape/test/require/test-b.js
new file mode 100644
index 0000000..8efcba1
--- /dev/null
+++ b/node_modules/tape/test/require/test-b.js
@@ -0,0 +1,7 @@
+var tape = require('../..');
+
+tape.test('test-b', function(t) {
+ t.ok(global.module_b, 'module-b loaded in same context')
+ t.pass('test ran after module-b was loaded')
+ t.end()
+})
\ No newline at end of file
diff --git a/node_modules/tape/test/skip.js b/node_modules/tape/test/skip.js
new file mode 100644
index 0000000..54c53f9
--- /dev/null
+++ b/node_modules/tape/test/skip.js
@@ -0,0 +1,52 @@
+var test = require('../');
+var ran = 0;
+
+var concat = require('concat-stream');
+var tap = require('tap');
+
+tap.test('test SKIP comment', function (assert) {
+ assert.plan(1);
+
+ var verify = function (output) {
+ assert.equal(output.toString('utf8'), [
+ 'TAP version 13',
+ '# SKIP skipped',
+ '',
+ '1..0',
+ '# tests 0',
+ '# pass 0',
+ '',
+ '# ok',
+ ''
+ ].join('\n'));
+ };
+
+ var tapeTest = test.createHarness();
+ tapeTest.createStream().pipe(concat(verify));
+ tapeTest('skipped', { skip: true }, function (t) {
+ t.end();
+ });
+});
+
+test('skip this', { skip: true }, function(t) {
+ t.fail('this should not even run');
+ ran++;
+ t.end();
+});
+
+test.skip('skip this too', function(t) {
+ t.fail('this should not even run');
+ ran++;
+ t.end();
+});
+
+test('skip subtest', function(t) {
+ ran++;
+ t.test('skip this', { skip: true }, function(t) {
+ t.fail('this should not even run');
+ t.end();
+ });
+ t.end();
+});
+
+// vim: set softtabstop=4 shiftwidth=4:
diff --git a/node_modules/tape/test/stackTrace.js b/node_modules/tape/test/stackTrace.js
new file mode 100644
index 0000000..bde1bc5
--- /dev/null
+++ b/node_modules/tape/test/stackTrace.js
@@ -0,0 +1,77 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+var tapParser = require('tap-parser');
+var yaml = require('js-yaml');
+
+tap.test('preserves stack trace with newlines', function (tt) {
+ tt.plan(3);
+
+ var test = tape.createHarness();
+ var stream = test.createStream();
+ var parser = stream.pipe(tapParser());
+ var stackTrace = 'foo\n bar';
+
+ parser.once('assert', function (data) {
+ tt.deepEqual(data, {
+ ok: false,
+ id: 1,
+ name: "Error: Preserve stack",
+ diag: {
+ stack: stackTrace,
+ operator: 'error',
+ expected: 'undefined',
+ actual: '[Error: Preserve stack]'
+ }
+ });
+ });
+
+ stream.pipe(concat(function (body) {
+ var body = body.toString('utf8')
+ tt.equal(
+ body,
+ 'TAP version 13\n'
+ + '# multiline stack trace\n'
+ + 'not ok 1 Error: Preserve stack\n'
+ + ' ---\n'
+ + ' operator: error\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + ' [Error: Preserve stack]\n'
+ + ' stack: |-\n'
+ + ' foo\n'
+ + ' bar\n'
+ + ' ...\n'
+ + '\n'
+ + '1..1\n'
+ + '# tests 1\n'
+ + '# pass 0\n'
+ + '# fail 1\n'
+ );
+
+ tt.deepEqual(getDiag(body), {
+ stack: stackTrace,
+ operator: 'error',
+ expected: 'undefined',
+ actual: '[Error: Preserve stack]'
+ });
+ }));
+
+ test('multiline stack trace', function (t) {
+ t.plan(1);
+ var err = new Error('Preserve stack');
+ err.stack = stackTrace;
+ t.error(err);
+ });
+});
+
+function getDiag (body) {
+ var yamlStart = body.indexOf(' ---');
+ var yamlEnd = body.indexOf(' ...\n');
+ var diag = body.slice(yamlStart, yamlEnd).split('\n').map(function (line) {
+ return line.slice(2);
+ }).join('\n');
+
+ return yaml.safeLoad(diag);
+}
diff --git a/node_modules/tape/test/subcount.js b/node_modules/tape/test/subcount.js
new file mode 100644
index 0000000..3a5df3f
--- /dev/null
+++ b/node_modules/tape/test/subcount.js
@@ -0,0 +1,14 @@
+var test = require('../');
+
+test('parent test', function (t) {
+ t.plan(2);
+ t.test('first child', function (t) {
+ t.plan(1);
+ t.pass('pass first child');
+ })
+
+ t.test(function (t) {
+ t.plan(1);
+ t.pass('pass second child');
+ })
+})
diff --git a/node_modules/tape/test/subtest_and_async.js b/node_modules/tape/test/subtest_and_async.js
new file mode 100644
index 0000000..719dbf5
--- /dev/null
+++ b/node_modules/tape/test/subtest_and_async.js
@@ -0,0 +1,23 @@
+var test = require('../');
+
+var asyncFunction = function (callback) {
+ setTimeout(callback, Math.random * 50);
+};
+
+test('master test', function (t) {
+ t.test('subtest 1', function (t) {
+ t.pass('subtest 1 before async call');
+ asyncFunction(function () {
+ t.pass('subtest 1 in async callback');
+ t.end();
+ })
+ });
+
+ t.test('subtest 2', function (t) {
+ t.pass('subtest 2 before async call');
+ asyncFunction(function () {
+ t.pass('subtest 2 in async callback');
+ t.end();
+ })
+ });
+});
diff --git a/node_modules/tape/test/subtest_plan.js b/node_modules/tape/test/subtest_plan.js
new file mode 100644
index 0000000..2b075ae
--- /dev/null
+++ b/node_modules/tape/test/subtest_plan.js
@@ -0,0 +1,21 @@
+var test = require('../');
+
+test('parent', function (t) {
+ t.plan(3)
+
+ var firstChildRan = false;
+
+ t.pass('assertion in parent');
+
+ t.test('first child', function (t) {
+ t.plan(1);
+ t.pass('pass first child');
+ firstChildRan = true;
+ });
+
+ t.test('second child', function (t) {
+ t.plan(2);
+ t.ok(firstChildRan, 'first child ran first');
+ t.pass('pass second child');
+ });
+});
diff --git a/node_modules/tape/test/throws.js b/node_modules/tape/test/throws.js
new file mode 100644
index 0000000..31ab9a4
--- /dev/null
+++ b/node_modules/tape/test/throws.js
@@ -0,0 +1,145 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+function fn() {
+ throw new TypeError('RegExp');
+}
+
+function getNonFunctionMessage(fn) {
+ try {
+ fn();
+ } catch (e) {
+ return e.message;
+ }
+}
+
+tap.test('failures', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness();
+ test.createStream().pipe(concat(function (body) {
+ tt.equal(
+ body.toString('utf8'),
+ 'TAP version 13\n'
+ + '# non functions\n'
+ + 'not ok 1 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage() + "] message: '" + getNonFunctionMessage() + "' }\n"
+ + ' ...\n'
+ + 'not ok 2 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage(null) + "] message: '" + getNonFunctionMessage(null) + "' }\n"
+ + ' ...\n'
+ + 'not ok 3 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage(true) + "] message: '" + getNonFunctionMessage(true) + "' }\n"
+ + ' ...\n'
+ + 'not ok 4 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage(false) + "] message: '" + getNonFunctionMessage(false) + "' }\n"
+ + ' ...\n'
+ + 'not ok 5 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage('abc') + "] message: '" + getNonFunctionMessage('abc') + "' }\n"
+ + ' ...\n'
+ + 'not ok 6 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage(/a/g) + "] message: '" + getNonFunctionMessage(/a/g) + "' }\n"
+ + ' ...\n'
+ + 'not ok 7 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage([]) + "] message: '" + getNonFunctionMessage([]) + "' }\n"
+ + ' ...\n'
+ + 'not ok 8 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: |-\n'
+ + ' undefined\n'
+ + ' actual: |-\n'
+ + " { [TypeError: " + getNonFunctionMessage({}) + "] message: '" + getNonFunctionMessage({}) + "' }\n"
+ + ' ...\n'
+ + '# function\n'
+ + 'not ok 9 should throw\n'
+ + ' ---\n'
+ + ' operator: throws\n'
+ + ' expected: undefined\n'
+ + ' actual: undefined\n'
+ + ' ...\n'
+ + '# custom error messages\n'
+ + 'ok 10 "message" is enumerable\n'
+ + "ok 11 { custom: 'error', message: 'message' }\n"
+ + 'ok 12 getter is still the same\n'
+ + '# throws null\n'
+ + 'ok 13 throws null\n'
+ + '\n1..13\n'
+ + '# tests 13\n'
+ + '# pass 4\n'
+ + '# fail 9\n'
+ );
+ }));
+
+ test('non functions', function (t) {
+ t.plan(8);
+ t.throws();
+ t.throws(null);
+ t.throws(true);
+ t.throws(false);
+ t.throws('abc');
+ t.throws(/a/g);
+ t.throws([]);
+ t.throws({});
+ });
+
+ test('function', function (t) {
+ t.plan(1);
+ t.throws(function () {});
+ });
+
+ test('custom error messages', function (t) {
+ t.plan(3);
+ var getter = function () { return 'message'; };
+ var messageGetterError = Object.defineProperty(
+ { custom: 'error' },
+ 'message',
+ { configurable: true, enumerable: true, get: getter }
+ );
+ t.equal(Object.prototype.propertyIsEnumerable.call(messageGetterError, 'message'), true, '"message" is enumerable');
+ t.throws(function () { throw messageGetterError; }, "{ custom: 'error', message: 'message' }");
+ t.equal(Object.getOwnPropertyDescriptor(messageGetterError, 'message').get, getter, 'getter is still the same');
+ });
+
+ test('throws null', function (t) {
+ t.plan(1);
+ t.throws(function () { throw null; }, 'throws null');
+ t.end();
+ });
+});
diff --git a/node_modules/tape/test/timeout.js b/node_modules/tape/test/timeout.js
new file mode 100644
index 0000000..9f4cd82
--- /dev/null
+++ b/node_modules/tape/test/timeout.js
@@ -0,0 +1,15 @@
+var test = require('../');
+var ran = 0;
+
+test('timeout', function(t) {
+ t.pass('this should run');
+ ran++;
+ setTimeout(function () {
+ t.end();
+ }, 100);
+});
+
+test('should still run', { timeout: 50 }, function(t) {
+ t.equal(ran, 1);
+ t.end();
+});
diff --git a/node_modules/tape/test/timeoutAfter.js b/node_modules/tape/test/timeoutAfter.js
new file mode 100644
index 0000000..e44e3c7
--- /dev/null
+++ b/node_modules/tape/test/timeoutAfter.js
@@ -0,0 +1,31 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('timeoutAfter test', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness();
+ var tc = function (rows) {
+ tt.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# timeoutAfter',
+ 'not ok 1 test timed out after 1ms',
+ ' ---',
+ ' operator: fail',
+ ' ...',
+ '',
+ '1..1',
+ '# tests 1',
+ '# pass 0',
+ '# fail 1'
+ ].join('\n') + '\n');
+ };
+
+ test.createStream().pipe(concat(tc));
+
+ test('timeoutAfter', function (t) {
+ t.plan(1);
+ t.timeoutAfter(1);
+ });
+});
diff --git a/node_modules/tape/test/too_many.js b/node_modules/tape/test/too_many.js
new file mode 100644
index 0000000..233a7ab
--- /dev/null
+++ b/node_modules/tape/test/too_many.js
@@ -0,0 +1,67 @@
+var falafel = require('falafel');
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('array test', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness({ exit : false });
+ var tc = function (rows) {
+ tt.same(rows.toString('utf8'), [
+ 'TAP version 13',
+ '# array',
+ 'ok 1 should be equivalent',
+ 'ok 2 should be equivalent',
+ 'ok 3 should be equivalent',
+ 'ok 4 should be equivalent',
+ 'not ok 5 plan != count',
+ ' ---',
+ ' operator: fail',
+ ' expected: 3',
+ ' actual: 4',
+ ' ...',
+ 'ok 6 should be equivalent',
+ '',
+ '1..6',
+ '# tests 6',
+ '# pass 5',
+ '# fail 1'
+ ].join('\n') + '\n');
+ };
+
+ test.createStream().pipe(concat(tc));
+
+ test('array', function (t) {
+ t.plan(3);
+
+ var src = '(' + function () {
+ var xs = [ 1, 2, [ 3, 4 ] ];
+ var ys = [ 5, 6 ];
+ g([ xs, ys ]);
+ } + ')()';
+
+ var output = falafel(src, function (node) {
+ if (node.type === 'ArrayExpression') {
+ node.update('fn(' + node.source() + ')');
+ }
+ });
+
+ var arrays = [
+ [ 3, 4 ],
+ [ 1, 2, [ 3, 4 ] ],
+ [ 5, 6 ],
+ [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ],
+ ];
+
+ Function(['fn','g'], output)(
+ function (xs) {
+ t.same(arrays.shift(), xs);
+ return xs;
+ },
+ function (xs) {
+ t.same(xs, [ [ 1, 2, [ 3, 4 ] ], [ 5, 6 ] ]);
+ }
+ );
+ });
+});
diff --git a/node_modules/tape/test/undef.js b/node_modules/tape/test/undef.js
new file mode 100644
index 0000000..d3ae8d4
--- /dev/null
+++ b/node_modules/tape/test/undef.js
@@ -0,0 +1,34 @@
+var tape = require('../');
+var tap = require('tap');
+var concat = require('concat-stream');
+
+tap.test('array test', function (tt) {
+ tt.plan(1);
+
+ var test = tape.createHarness();
+ test.createStream().pipe(concat(function (body) {
+ tt.equal(
+ body.toString('utf8'),
+ 'TAP version 13\n'
+ + '# undef\n'
+ + 'not ok 1 should be equivalent\n'
+ + ' ---\n'
+ + ' operator: deepEqual\n'
+ + ' expected: |-\n'
+ + ' { beep: undefined }\n'
+ + ' actual: |-\n'
+ + ' {}\n'
+ + ' ...\n'
+ + '\n'
+ + '1..1\n'
+ + '# tests 1\n'
+ + '# pass 0\n'
+ + '# fail 1\n'
+ );
+ }));
+
+ test('undef', function (t) {
+ t.plan(1);
+ t.deepEqual({}, { beep: undefined });
+ });
+});
diff --git a/node_modules/through/.travis.yml b/node_modules/through/.travis.yml
new file mode 100644
index 0000000..c693a93
--- /dev/null
+++ b/node_modules/through/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+ - 0.6
+ - 0.8
+ - "0.10"
diff --git a/node_modules/through/LICENSE.APACHE2 b/node_modules/through/LICENSE.APACHE2
new file mode 100644
index 0000000..6366c04
--- /dev/null
+++ b/node_modules/through/LICENSE.APACHE2
@@ -0,0 +1,15 @@
+Apache License, Version 2.0
+
+Copyright (c) 2011 Dominic Tarr
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/node_modules/through/LICENSE.MIT b/node_modules/through/LICENSE.MIT
new file mode 100644
index 0000000..6eafbd7
--- /dev/null
+++ b/node_modules/through/LICENSE.MIT
@@ -0,0 +1,24 @@
+The MIT License
+
+Copyright (c) 2011 Dominic Tarr
+
+Permission is hereby granted, free of charge,
+to any person obtaining a copy of this software and
+associated documentation files (the "Software"), to
+deal in the Software without restriction, including
+without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom
+the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/through/index.js b/node_modules/through/index.js
new file mode 100644
index 0000000..ca5fc59
--- /dev/null
+++ b/node_modules/through/index.js
@@ -0,0 +1,108 @@
+var Stream = require('stream')
+
+// through
+//
+// a stream that does nothing but re-emit the input.
+// useful for aggregating a series of changing but not ending streams into one stream)
+
+exports = module.exports = through
+through.through = through
+
+//create a readable writable stream.
+
+function through (write, end, opts) {
+ write = write || function (data) { this.queue(data) }
+ end = end || function () { this.queue(null) }
+
+ var ended = false, destroyed = false, buffer = [], _ended = false
+ var stream = new Stream()
+ stream.readable = stream.writable = true
+ stream.paused = false
+
+// stream.autoPause = !(opts && opts.autoPause === false)
+ stream.autoDestroy = !(opts && opts.autoDestroy === false)
+
+ stream.write = function (data) {
+ write.call(this, data)
+ return !stream.paused
+ }
+
+ function drain() {
+ while(buffer.length && !stream.paused) {
+ var data = buffer.shift()
+ if(null === data)
+ return stream.emit('end')
+ else
+ stream.emit('data', data)
+ }
+ }
+
+ stream.queue = stream.push = function (data) {
+// console.error(ended)
+ if(_ended) return stream
+ if(data === null) _ended = true
+ buffer.push(data)
+ drain()
+ return stream
+ }
+
+ //this will be registered as the first 'end' listener
+ //must call destroy next tick, to make sure we're after any
+ //stream piped from here.
+ //this is only a problem if end is not emitted synchronously.
+ //a nicer way to do this is to make sure this is the last listener for 'end'
+
+ stream.on('end', function () {
+ stream.readable = false
+ if(!stream.writable && stream.autoDestroy)
+ process.nextTick(function () {
+ stream.destroy()
+ })
+ })
+
+ function _end () {
+ stream.writable = false
+ end.call(stream)
+ if(!stream.readable && stream.autoDestroy)
+ stream.destroy()
+ }
+
+ stream.end = function (data) {
+ if(ended) return
+ ended = true
+ if(arguments.length) stream.write(data)
+ _end() // will emit or queue
+ return stream
+ }
+
+ stream.destroy = function () {
+ if(destroyed) return
+ destroyed = true
+ ended = true
+ buffer.length = 0
+ stream.writable = stream.readable = false
+ stream.emit('close')
+ return stream
+ }
+
+ stream.pause = function () {
+ if(stream.paused) return
+ stream.paused = true
+ return stream
+ }
+
+ stream.resume = function () {
+ if(stream.paused) {
+ stream.paused = false
+ stream.emit('resume')
+ }
+ drain()
+ //may have become paused again,
+ //as drain emits 'data'.
+ if(!stream.paused)
+ stream.emit('drain')
+ return stream
+ }
+ return stream
+}
+
diff --git a/node_modules/through/package.json b/node_modules/through/package.json
new file mode 100644
index 0000000..5f0b773
--- /dev/null
+++ b/node_modules/through/package.json
@@ -0,0 +1,101 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "through@~2.3.8",
+ "scope": null,
+ "escapedName": "through",
+ "name": "through",
+ "rawSpec": "~2.3.8",
+ "spec": ">=2.3.8 <2.4.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape"
+ ]
+ ],
+ "_from": "through@>=2.3.8 <2.4.0",
+ "_id": "through@2.3.8",
+ "_inCache": true,
+ "_location": "/through",
+ "_nodeVersion": "2.3.1",
+ "_npmUser": {
+ "name": "dominictarr",
+ "email": "dominic.tarr@gmail.com"
+ },
+ "_npmVersion": "2.12.0",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "through@~2.3.8",
+ "scope": null,
+ "escapedName": "through",
+ "name": "through",
+ "rawSpec": "~2.3.8",
+ "spec": ">=2.3.8 <2.4.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/resumer",
+ "/tape"
+ ],
+ "_resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "_shasum": "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5",
+ "_shrinkwrap": null,
+ "_spec": "through@~2.3.8",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/tape",
+ "author": {
+ "name": "Dominic Tarr",
+ "email": "dominic.tarr@gmail.com",
+ "url": "dominictarr.com"
+ },
+ "bugs": {
+ "url": "https://github.com/dominictarr/through/issues"
+ },
+ "dependencies": {},
+ "description": "simplified stream construction",
+ "devDependencies": {
+ "from": "~0.1.3",
+ "stream-spec": "~0.3.5",
+ "tape": "~2.3.2"
+ },
+ "directories": {},
+ "dist": {
+ "shasum": "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5",
+ "tarball": "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ },
+ "gitHead": "2c5a6f9a0cc54da759b6e10964f2081c358e49dc",
+ "homepage": "https://github.com/dominictarr/through",
+ "keywords": [
+ "stream",
+ "streams",
+ "user-streams",
+ "pipe"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "maintainers": [
+ {
+ "name": "dominictarr",
+ "email": "dominic.tarr@gmail.com"
+ }
+ ],
+ "name": "through",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/dominictarr/through.git"
+ },
+ "scripts": {
+ "test": "set -e; for t in test/*.js; do node $t; done"
+ },
+ "testling": {
+ "browsers": [
+ "ie/8..latest",
+ "ff/15..latest",
+ "chrome/20..latest",
+ "safari/5.1..latest"
+ ],
+ "files": "test/*.js"
+ },
+ "version": "2.3.8"
+}
diff --git a/node_modules/through/readme.markdown b/node_modules/through/readme.markdown
new file mode 100644
index 0000000..cb34c81
--- /dev/null
+++ b/node_modules/through/readme.markdown
@@ -0,0 +1,64 @@
+#through
+
+[](http://travis-ci.org/dominictarr/through)
+[](https://ci.testling.com/dominictarr/through)
+
+Easy way to create a `Stream` that is both `readable` and `writable`.
+
+* Pass in optional `write` and `end` methods.
+* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`.
+* Use `this.pause()` and `this.resume()` to manage flow.
+* Check `this.paused` to see current flow state. (`write` always returns `!this.paused`).
+
+This function is the basis for most of the synchronous streams in
+[event-stream](http://github.com/dominictarr/event-stream).
+
+``` js
+var through = require('through')
+
+through(function write(data) {
+ this.queue(data) //data *must* not be null
+ },
+ function end () { //optional
+ this.queue(null)
+ })
+```
+
+Or, can also be used _without_ buffering on pause, use `this.emit('data', data)`,
+and this.emit('end')
+
+``` js
+var through = require('through')
+
+through(function write(data) {
+ this.emit('data', data)
+ //this.pause()
+ },
+ function end () { //optional
+ this.emit('end')
+ })
+```
+
+## Extended Options
+
+You will probably not need these 99% of the time.
+
+### autoDestroy=false
+
+By default, `through` emits close when the writable
+and readable side of the stream has ended.
+If that is not desired, set `autoDestroy=false`.
+
+``` js
+var through = require('through')
+
+//like this
+var ts = through(write, end, {autoDestroy: false})
+//or like this
+var ts = through(write, end)
+ts.autoDestroy = false
+```
+
+## License
+
+MIT / Apache2
diff --git a/node_modules/through/test/async.js b/node_modules/through/test/async.js
new file mode 100644
index 0000000..46bdbae
--- /dev/null
+++ b/node_modules/through/test/async.js
@@ -0,0 +1,28 @@
+var from = require('from')
+var through = require('../')
+
+var tape = require('tape')
+
+tape('simple async example', function (t) {
+
+ var n = 0, expected = [1,2,3,4,5], actual = []
+ from(expected)
+ .pipe(through(function(data) {
+ this.pause()
+ n ++
+ setTimeout(function(){
+ console.log('pushing data', data)
+ this.push(data)
+ this.resume()
+ }.bind(this), 300)
+ })).pipe(through(function(data) {
+ console.log('pushing data second time', data);
+ this.push(data)
+ })).on('data', function (d) {
+ actual.push(d)
+ }).on('end', function() {
+ t.deepEqual(actual, expected)
+ t.end()
+ })
+
+})
diff --git a/node_modules/through/test/auto-destroy.js b/node_modules/through/test/auto-destroy.js
new file mode 100644
index 0000000..9a8fd00
--- /dev/null
+++ b/node_modules/through/test/auto-destroy.js
@@ -0,0 +1,30 @@
+var test = require('tape')
+var through = require('../')
+
+// must emit end before close.
+
+test('end before close', function (assert) {
+ var ts = through()
+ ts.autoDestroy = false
+ var ended = false, closed = false
+
+ ts.on('end', function () {
+ assert.ok(!closed)
+ ended = true
+ })
+ ts.on('close', function () {
+ assert.ok(ended)
+ closed = true
+ })
+
+ ts.write(1)
+ ts.write(2)
+ ts.write(3)
+ ts.end()
+ assert.ok(ended)
+ assert.notOk(closed)
+ ts.destroy()
+ assert.ok(closed)
+ assert.end()
+})
+
diff --git a/node_modules/through/test/buffering.js b/node_modules/through/test/buffering.js
new file mode 100644
index 0000000..b0084bf
--- /dev/null
+++ b/node_modules/through/test/buffering.js
@@ -0,0 +1,71 @@
+var test = require('tape')
+var through = require('../')
+
+// must emit end before close.
+
+test('buffering', function(assert) {
+ var ts = through(function (data) {
+ this.queue(data)
+ }, function () {
+ this.queue(null)
+ })
+
+ var ended = false, actual = []
+
+ ts.on('data', actual.push.bind(actual))
+ ts.on('end', function () {
+ ended = true
+ })
+
+ ts.write(1)
+ ts.write(2)
+ ts.write(3)
+ assert.deepEqual(actual, [1, 2, 3])
+ ts.pause()
+ ts.write(4)
+ ts.write(5)
+ ts.write(6)
+ assert.deepEqual(actual, [1, 2, 3])
+ ts.resume()
+ assert.deepEqual(actual, [1, 2, 3, 4, 5, 6])
+ ts.pause()
+ ts.end()
+ assert.ok(!ended)
+ ts.resume()
+ assert.ok(ended)
+ assert.end()
+})
+
+test('buffering has data in queue, when ends', function (assert) {
+
+ /*
+ * If stream ends while paused with data in the queue,
+ * stream should still emit end after all data is written
+ * on resume.
+ */
+
+ var ts = through(function (data) {
+ this.queue(data)
+ }, function () {
+ this.queue(null)
+ })
+
+ var ended = false, actual = []
+
+ ts.on('data', actual.push.bind(actual))
+ ts.on('end', function () {
+ ended = true
+ })
+
+ ts.pause()
+ ts.write(1)
+ ts.write(2)
+ ts.write(3)
+ ts.end()
+ assert.deepEqual(actual, [], 'no data written yet, still paused')
+ assert.ok(!ended, 'end not emitted yet, still paused')
+ ts.resume()
+ assert.deepEqual(actual, [1, 2, 3], 'resumed, all data should be delivered')
+ assert.ok(ended, 'end should be emitted once all data was delivered')
+ assert.end();
+})
diff --git a/node_modules/through/test/end.js b/node_modules/through/test/end.js
new file mode 100644
index 0000000..fa113f5
--- /dev/null
+++ b/node_modules/through/test/end.js
@@ -0,0 +1,45 @@
+var test = require('tape')
+var through = require('../')
+
+// must emit end before close.
+
+test('end before close', function (assert) {
+ var ts = through()
+ var ended = false, closed = false
+
+ ts.on('end', function () {
+ assert.ok(!closed)
+ ended = true
+ })
+ ts.on('close', function () {
+ assert.ok(ended)
+ closed = true
+ })
+
+ ts.write(1)
+ ts.write(2)
+ ts.write(3)
+ ts.end()
+ assert.ok(ended)
+ assert.ok(closed)
+ assert.end()
+})
+
+test('end only once', function (t) {
+
+ var ts = through()
+ var ended = false, closed = false
+
+ ts.on('end', function () {
+ t.equal(ended, false)
+ ended = true
+ })
+
+ ts.queue(null)
+ ts.queue(null)
+ ts.queue(null)
+
+ ts.resume()
+
+ t.end()
+})
diff --git a/node_modules/through/test/index.js b/node_modules/through/test/index.js
new file mode 100644
index 0000000..96da82f
--- /dev/null
+++ b/node_modules/through/test/index.js
@@ -0,0 +1,133 @@
+
+var test = require('tape')
+var spec = require('stream-spec')
+var through = require('../')
+
+/*
+ I'm using these two functions, and not streams and pipe
+ so there is less to break. if this test fails it must be
+ the implementation of _through_
+*/
+
+function write(array, stream) {
+ array = array.slice()
+ function next() {
+ while(array.length)
+ if(stream.write(array.shift()) === false)
+ return stream.once('drain', next)
+
+ stream.end()
+ }
+
+ next()
+}
+
+function read(stream, callback) {
+ var actual = []
+ stream.on('data', function (data) {
+ actual.push(data)
+ })
+ stream.once('end', function () {
+ callback(null, actual)
+ })
+ stream.once('error', function (err) {
+ callback(err)
+ })
+}
+
+test('simple defaults', function(assert) {
+
+ var l = 1000
+ , expected = []
+
+ while(l--) expected.push(l * Math.random())
+
+ var t = through()
+ var s = spec(t).through().pausable()
+
+ read(t, function (err, actual) {
+ assert.ifError(err)
+ assert.deepEqual(actual, expected)
+ assert.end()
+ })
+
+ t.on('close', s.validate)
+
+ write(expected, t)
+});
+
+test('simple functions', function(assert) {
+
+ var l = 1000
+ , expected = []
+
+ while(l--) expected.push(l * Math.random())
+
+ var t = through(function (data) {
+ this.emit('data', data*2)
+ })
+ var s = spec(t).through().pausable()
+
+
+ read(t, function (err, actual) {
+ assert.ifError(err)
+ assert.deepEqual(actual, expected.map(function (data) {
+ return data*2
+ }))
+ assert.end()
+ })
+
+ t.on('close', s.validate)
+
+ write(expected, t)
+})
+
+test('pauses', function(assert) {
+
+ var l = 1000
+ , expected = []
+
+ while(l--) expected.push(l) //Math.random())
+
+ var t = through()
+
+ var s = spec(t)
+ .through()
+ .pausable()
+
+ t.on('data', function () {
+ if(Math.random() > 0.1) return
+ t.pause()
+ process.nextTick(function () {
+ t.resume()
+ })
+ })
+
+ read(t, function (err, actual) {
+ assert.ifError(err)
+ assert.deepEqual(actual, expected)
+ })
+
+ t.on('close', function () {
+ s.validate()
+ assert.end()
+ })
+
+ write(expected, t)
+})
+
+test('does not soft-end on `undefined`', function(assert) {
+ var stream = through()
+ , count = 0
+
+ stream.on('data', function (data) {
+ count++
+ })
+
+ stream.write(undefined)
+ stream.write(undefined)
+
+ assert.equal(count, 2)
+
+ assert.end()
+})
diff --git a/node_modules/wrappy/LICENSE b/node_modules/wrappy/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/wrappy/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/wrappy/README.md b/node_modules/wrappy/README.md
new file mode 100644
index 0000000..98eab25
--- /dev/null
+++ b/node_modules/wrappy/README.md
@@ -0,0 +1,36 @@
+# wrappy
+
+Callback wrapping utility
+
+## USAGE
+
+```javascript
+var wrappy = require("wrappy")
+
+// var wrapper = wrappy(wrapperFunction)
+
+// make sure a cb is called only once
+// See also: http://npm.im/once for this specific use case
+var once = wrappy(function (cb) {
+ var called = false
+ return function () {
+ if (called) return
+ called = true
+ return cb.apply(this, arguments)
+ }
+})
+
+function printBoo () {
+ console.log('boo')
+}
+// has some rando property
+printBoo.iAmBooPrinter = true
+
+var onlyPrintOnce = once(printBoo)
+
+onlyPrintOnce() // prints 'boo'
+onlyPrintOnce() // does nothing
+
+// random property is retained!
+assert.equal(onlyPrintOnce.iAmBooPrinter, true)
+```
diff --git a/node_modules/wrappy/package.json b/node_modules/wrappy/package.json
new file mode 100644
index 0000000..feae7d7
--- /dev/null
+++ b/node_modules/wrappy/package.json
@@ -0,0 +1,97 @@
+{
+ "_args": [
+ [
+ {
+ "raw": "wrappy@1",
+ "scope": null,
+ "escapedName": "wrappy",
+ "name": "wrappy",
+ "rawSpec": "1",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/inflight"
+ ]
+ ],
+ "_from": "wrappy@>=1.0.0 <2.0.0",
+ "_id": "wrappy@1.0.2",
+ "_inCache": true,
+ "_location": "/wrappy",
+ "_nodeVersion": "5.10.1",
+ "_npmOperationalInternal": {
+ "host": "packages-16-east.internal.npmjs.com",
+ "tmp": "tmp/wrappy-1.0.2.tgz_1463527848281_0.037129373755306005"
+ },
+ "_npmUser": {
+ "name": "zkat",
+ "email": "kat@sykosomatic.org"
+ },
+ "_npmVersion": "3.9.1",
+ "_phantomChildren": {},
+ "_requested": {
+ "raw": "wrappy@1",
+ "scope": null,
+ "escapedName": "wrappy",
+ "name": "wrappy",
+ "rawSpec": "1",
+ "spec": ">=1.0.0 <2.0.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/inflight",
+ "/once"
+ ],
+ "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
+ "_shrinkwrap": null,
+ "_spec": "wrappy@1",
+ "_where": "/Users/giovanicascaes/Dev/JavaScript/codingdojo/node_modules/inflight",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/npm/wrappy/issues"
+ },
+ "dependencies": {},
+ "description": "Callback wrapping utility",
+ "devDependencies": {
+ "tap": "^2.3.1"
+ },
+ "directories": {
+ "test": "test"
+ },
+ "dist": {
+ "shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
+ "tarball": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ },
+ "files": [
+ "wrappy.js"
+ ],
+ "gitHead": "71d91b6dc5bdeac37e218c2cf03f9ab55b60d214",
+ "homepage": "https://github.com/npm/wrappy",
+ "license": "ISC",
+ "main": "wrappy.js",
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ {
+ "name": "zkat",
+ "email": "kat@sykosomatic.org"
+ }
+ ],
+ "name": "wrappy",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/wrappy.git"
+ },
+ "scripts": {
+ "test": "tap --coverage test/*.js"
+ },
+ "version": "1.0.2"
+}
diff --git a/node_modules/wrappy/wrappy.js b/node_modules/wrappy/wrappy.js
new file mode 100644
index 0000000..bb7e7d6
--- /dev/null
+++ b/node_modules/wrappy/wrappy.js
@@ -0,0 +1,33 @@
+// Returns a wrapper function that returns a wrapped callback
+// The wrapper function should do some stuff, and return a
+// presumably different callback function.
+// This makes sure that own properties are retained, so that
+// decorations and such are not lost along the way.
+module.exports = wrappy
+function wrappy (fn, cb) {
+ if (fn && cb) return wrappy(fn)(cb)
+
+ if (typeof fn !== 'function')
+ throw new TypeError('need wrapper function')
+
+ Object.keys(fn).forEach(function (k) {
+ wrapper[k] = fn[k]
+ })
+
+ return wrapper
+
+ function wrapper() {
+ var args = new Array(arguments.length)
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i]
+ }
+ var ret = fn.apply(this, args)
+ var cb = args[args.length-1]
+ if (typeof ret === 'function' && ret !== cb) {
+ Object.keys(cb).forEach(function (k) {
+ ret[k] = cb[k]
+ })
+ }
+ return ret
+ }
+}