From 81f3b3d7d7991f4fdd69885fae61c2feb1e985b6 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Wed, 24 Oct 2018 22:53:11 +0200 Subject: [PATCH 01/98] Added unit testing for week 2 and week 2 homework --- .eslintrc | 6 +- Week2/MAKEME.md | 87 +- Week2/homework-solutions/maartjes_work.js | 65 + Week2/homework-solutions/map_filter.js | 16 + Week2/homework-solutions/playground.js | 12 + Week2/homework/maartjes_work.js | 17 +- Week2/homework/map_filter.js | 13 +- Week2/test/maartjes_work.test.js | 13 + Week2/test/map_filter.test.js | 11 + Week3/MAKEME.md | 31 +- Week3/homework-solutions/1-step3.js | 15 + Week3/homework-solutions/2-step3.js | 37 + Week3/homework-solutions/3-step3.js | 50 + Week3/homework-solutions/4-step3.js | 13 + Week3/homework-solutions/5-step3.js | 19 + Week3/homework-solutions/6-step3.js | 28 + Week3/homework-solutions/7-step3.js | 25 + Week3/homework-solutions/step4-bonus.js | 14 + Week3/homework-solutions/step4.js | 15 + Week3/homework/1-step3.js | 3 + Week3/homework/2-step3.js | 15 +- Week3/homework/3-step3.js | 18 +- Week3/homework/4-step3.js | 9 + Week3/homework/5-step3.js | 13 +- Week3/homework/6-step3.js | 18 +- Week3/homework/7-step3.js | 1 - Week3/homework/step4-bonus.js | 11 +- Week3/homework/step4.js | 11 +- Week3/test/1-step3.test.js | 9 + Week3/test/2-step3.test.js | 17 + Week3/test/3-step3.test.js | 41 + Week3/test/4-step3.test.js | 9 + Week3/test/5-step3.test.js | 7 + Week3/test/6-step3.test.js | 32 + Week3/test/console-test.js | 14 + Week3/test/step4-bonus.test.js | 9 + Week3/test/step4.test.js | 8 + package-lock.json | 6044 +++++++++++++++++++++ package.json | 25 + test-config.js | 3 + 40 files changed, 6758 insertions(+), 46 deletions(-) create mode 100644 Week2/homework-solutions/maartjes_work.js create mode 100644 Week2/homework-solutions/map_filter.js create mode 100644 Week2/homework-solutions/playground.js create mode 100644 Week2/test/maartjes_work.test.js create mode 100644 Week2/test/map_filter.test.js create mode 100644 Week3/homework-solutions/1-step3.js create mode 100644 Week3/homework-solutions/2-step3.js create mode 100644 Week3/homework-solutions/3-step3.js create mode 100644 Week3/homework-solutions/4-step3.js create mode 100644 Week3/homework-solutions/5-step3.js create mode 100644 Week3/homework-solutions/6-step3.js create mode 100644 Week3/homework-solutions/7-step3.js create mode 100644 Week3/homework-solutions/step4-bonus.js create mode 100644 Week3/homework-solutions/step4.js create mode 100644 Week3/test/1-step3.test.js create mode 100644 Week3/test/2-step3.test.js create mode 100644 Week3/test/3-step3.test.js create mode 100644 Week3/test/4-step3.test.js create mode 100644 Week3/test/5-step3.test.js create mode 100644 Week3/test/6-step3.test.js create mode 100644 Week3/test/console-test.js create mode 100644 Week3/test/step4-bonus.test.js create mode 100644 Week3/test/step4.test.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 test-config.js diff --git a/.eslintrc b/.eslintrc index ae8189517..d09b6652d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,7 +3,8 @@ "browser": true, "commonjs": true, "es6": true, - "node": true + "node": true, + "jest/globals": true }, "parserOptions": { "ecmaVersion": 2017, @@ -12,6 +13,9 @@ }, "sourceType": "module" }, + "plugins": [ + "jest" + ], "extends": [ "eslint:recommended" ], diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index b4b5b29fc..8ca688251 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -21,25 +21,26 @@ Go through the `html-css`, `javascript1` and `javascript2` Github repositories o _Deadline Wednesday_ -**2.1** Say you would like to write a program that doubles the odd numbers in an array and throws away the even number. +**2.1** Say you would like to write a program that doubles the odd numbers in an array and throws away the even numbers. Your solution could be something like this: ```js -const numbers = [1, 2, 3, 4]; -const newNumbers = []; - -for (let i = 0; i < numbers.length; i++) { - if (numbers[i] % 2 !== 0) { - newNumbers.push(numbers[i] * 2); +function doubleOddNumbers(numbers) { + const newNumbers = []; + for (let i = 0; i < numbers.length; i++) { + if (numbers[i] % 2 !== 0) { + newNumbers.push(numbers[i] * 2); + } } + return newNumbers; } -console.log('The doubled numbers are', newNumbers); // ==> [2, 6] - +const myNumbers = [1, 2, 3, 4]; +console.log(doubleOddNumbers(myNumbers)); // ==> [2, 6] ``` -Rewrite the above program using `map` and `filter` don't forget to use `=>`. +Rewrite the above `doubleOddNumbers` function using `map` and `filter`; don't forget to use `=>`. --- @@ -87,8 +88,6 @@ const tuesday = [ duration: 40 } ]; - -const tasks = monday.concat(tuesday); ``` _Note: the durations are specified in minutes._ @@ -99,16 +98,70 @@ Follow these steps. Each step should build on the result of the previous step. - Map the tasks to durations in hours. - Filter out everything that took less than two hours (i.e., remove from the collection) -- Multiply the each duration by a per-hour rate for billing (you can decide yourself what Maartje should earn per hour) and sum it all up. +- Multiply the each duration by a per-hour rate for billing (assume €20/hour) and sum it all up. - Output a formatted Euro amount, rounded to Euro cents, e.g: `€ 12.34`. - Choose variable and parameters names that most accurately describe their contents or purpose. When naming an array, use a plural form, e.g. `durations`. For a single item, use a singular form, e.g. `duration`. For details, see [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). - Don't forget to use `=>`. -## Step 3: ROVER +## Step 3: Testing your homework + +We have provided _unit tests_ in this repo that allow you to verify that your homework produces the expected results. + +> **Unit test**: A _unit test_ is a piece of code (usually a function) that invokes another piece of code and checks the correctness of some assumptions afterwards. If the assumptions turn out to be wrong, the unit test has failed. A 'unit' is a method or function. +> +> Adapted from: Roy Osherove (2009), The art of Unit Testing. Greenwich, CT: Manning. + +At this point it is not important to understand how unit tests work. The only thing you need to know now is how to run the tests and how to determine whether your homework produces the correct results. + +#### Installation + +Before you can run the unit tests you need to install some additional software. You need to do this only once; there is no need to repeat it for the week 3 homework. + +Open a terminal window. Make sure the current directory is the `JavaScript2` folder and type the following command: + +``` +npm install +``` + +This software installation might take a while. + +#### Run the tests + +Once the software installation has been completed, you can test your week 2 homework by typing this command in the terminal window: + +``` +npm run test2 +``` + +You will see some output appearing in the console while the tests run. If all is well (no errors), the last couple of lines will look like this: + +``` +Test Suites: 2 passed, 2 total +Tests: 2 passed, 2 total +Snapshots: 0 total +Time: 1.849s +Ran all test suites matching /Week2\//i. +``` + +In case of unexpected results, say from _Maartjes work_ assignment, you might see something like this (you may need to scroll up a bit): + +``` +Test Suites: 1 failed, 1 passed, 2 total +Tests: 1 failed, 1 passed, 2 total +Snapshots: 0 total +Time: 2.255s +Ran all test suites matching /Week2\//i. +``` + +If that's the case, try and fix the error. When done, run the tests again: `npm run test2` + +Repeat the previous step until all (= 2 in this case) tests pass. + +## Step 4: ROVER Finish up to chapter 7: JSON on [roverjs.com](http://roverjs.com/)! -## Step 4: **Some freeCodeCamp challenges:** +## Step 5: **Some freeCodeCamp challenges:** _Deadline Saturday_ @@ -119,7 +172,7 @@ _Deadline Saturday_ 3. [Use the map Method to Extract Data from an Array](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array) -## Step 5: Read before next lecture +## Step 6: Read before next lecture _Deadline Sunday morning_ @@ -130,7 +183,7 @@ Go trough the reading material in the [README.md](/Week3/README.md) to prepare f Go over your homework one last time: -- Does every file run without errors and with the correct results when you run them with Node? +- Does your homework pass all the unit tests? - Does every file start with `'use strict';`? - Have you used `const` and `let` and avoided `var`? - Do the variable, function and argument names you created follow the [Naming Conventions](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md)? diff --git a/Week2/homework-solutions/maartjes_work.js b/Week2/homework-solutions/maartjes_work.js new file mode 100644 index 000000000..29b9d1d17 --- /dev/null +++ b/Week2/homework-solutions/maartjes_work.js @@ -0,0 +1,65 @@ +'use strict'; + +const monday = [ + { + name: 'Write a summary HTML/CSS', + duration: 180 + }, + { + name: 'Some web development', + duration: 120 + }, + { + name: 'Fix homework for class10', + duration: 20 + }, + { + name: 'Talk to a lot of people', + duration: 200 + } +]; + +const tuesday = [ + { + name: 'Keep writing summary', + duration: 240 + }, + { + name: 'Some more web development', + duration: 180 + }, + { + name: 'Staring out the window', + duration: 10 + }, + { + name: 'Talk to a lot of people', + duration: 200 + }, + { + name: 'Look at application assignments new students', + duration: 40 + } +]; + +const maartjesTasks = monday.concat(tuesday); +const maartjesHourlyRate = 20; + +function computeEarnings(tasks, hourlyRate) { + return tasks + .map(task => task.duration / 61) + .filter(duration => duration >= 2) + .map(duration => duration * hourlyRate) + .reduce((total, amount) => total + amount, 0); +} + +const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); +console.log(`Maartje has earned €${earnings.toFixed(2)}`); + +// Do not change or remove the next line +module.exports = { + maartjesTasks, + maartjesHourlyRate, + computeEarnings +}; + diff --git a/Week2/homework-solutions/map_filter.js b/Week2/homework-solutions/map_filter.js new file mode 100644 index 000000000..1aa3d6baa --- /dev/null +++ b/Week2/homework-solutions/map_filter.js @@ -0,0 +1,16 @@ +'use strict'; + +function doubleOddNumbers(numbers) { + return numbers + .filter(number => number % 2 !== 0) + .map(number => number * 2); +} + +const myNumbers = [1, 2, 3, 4]; +console.log(doubleOddNumbers(myNumbers)); + +// Do not change or remove the next line +module.exports = { + myNumbers, + doubleOddNumbers +}; diff --git a/Week2/homework-solutions/playground.js b/Week2/homework-solutions/playground.js new file mode 100644 index 000000000..088bc98c3 --- /dev/null +++ b/Week2/homework-solutions/playground.js @@ -0,0 +1,12 @@ +function doubleOddNumbers(numbers) { + const newNumbers = []; + for (let i = 0; i < numbers.length; i++) { + if (numbers[i] % 2 !== 0) { + newNumbers.push(numbers[i] * 2); + } + } + return newNumbers; +} + +const myNumbers = [1, 2, 3, 4]; +console.log(doubleOddNumbers(myNumbers)); // ==> [2, 6] diff --git a/Week2/homework/maartjes_work.js b/Week2/homework/maartjes_work.js index 0b451d122..cf6384e86 100644 --- a/Week2/homework/maartjes_work.js +++ b/Week2/homework/maartjes_work.js @@ -42,6 +42,19 @@ const tuesday = [ } ]; -const tasks = monday.concat(tuesday); +const maartjesTasks = monday.concat(tuesday); +const maartjesHourlyRate = 20; -// Add your code here +function computeEarnings(tasks, hourlyRate) { + // add your code here +} + +const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); +console.log(`Maartje has earned €${'replace this string with the earnings rounded to eurocents'}`); + +// Do not change or remove the next lines +module.exports = { + maartjesTasks, + maartjesHourlyRate, + computeEarnings +}; diff --git a/Week2/homework/map_filter.js b/Week2/homework/map_filter.js index b6af22631..22dc5bb9f 100644 --- a/Week2/homework/map_filter.js +++ b/Week2/homework/map_filter.js @@ -1,5 +1,14 @@ 'use strict'; -const numbers = [1, 2, 3, 4]; +function doubleOddNumbers(numbers) { + // add your code here +} -// Add your code here +const myNumbers = [1, 2, 3, 4]; +console.log(doubleOddNumbers(myNumbers)); + +// Do not change or remove the next lines +module.exports = { + myNumbers, + doubleOddNumbers +}; diff --git a/Week2/test/maartjes_work.test.js b/Week2/test/maartjes_work.test.js new file mode 100644 index 000000000..88a651fbd --- /dev/null +++ b/Week2/test/maartjes_work.test.js @@ -0,0 +1,13 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const { + maartjesTasks, + maartjesHourlyRate, + computeEarnings +} = require(`../${HOMEWORK_FOLDER}/maartjes_work`); + +test('maartjes_work.js', () => { + + const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); + const result = earnings.toFixed(2); + expect(result).toBe('373.33'); +}); diff --git a/Week2/test/map_filter.test.js b/Week2/test/map_filter.test.js new file mode 100644 index 000000000..2d6fb4b8e --- /dev/null +++ b/Week2/test/map_filter.test.js @@ -0,0 +1,11 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const { + myNumbers, + doubleOddNumbers +} = require(`../${HOMEWORK_FOLDER}/map_filter`); + +test('map_filter.js', () => { + + const result = doubleOddNumbers(myNumbers); + expect(result).toEqual([2, 6]); +}); diff --git a/Week3/MAKEME.md b/Week3/MAKEME.md index c3c95ee32..e84004ea6 100644 --- a/Week3/MAKEME.md +++ b/Week3/MAKEME.md @@ -72,7 +72,7 @@ Both functions should be called if the array value is divisible by both 3 and 5. ```js function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { - const values = []; + const numbers = []; // make array // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next } @@ -84,11 +84,11 @@ threeFive(10, 15, sayThree, sayFive); // please make sure you see why these calls are made before you start coding ``` -> Note: The following assignments include some problems from _freeCodeCamp_. While we normally ask you to use more modern `const` and `let` keywords to declare variables, currently _freeCodeCamp_ does not give you that option and expects you to use the older `var` keyword. +> Note: The following assignments include some problems from _freeCodeCamp_. Note that some _freeCodeCamp_ examples still mention `var`. However you can safely replace them with `let` and `const` as appropriate. **3.3** Please solve this problem: -> https://www.freecodecamp.com/challenges/repeat-a-string-repeat-a-string +>[Basic Algorithm Scripting: Repeat a String Repeat a String](https://www.freecodecamp.com/challenges/repeat-a-string-repeat-a-string) _3.3.1_: with a `for` loop. _3.3.2_: with a `while` loop. @@ -96,12 +96,13 @@ _3.3.3_: with a `do...while` loop. **3.4** Some practice with objects: ->https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/define-a-constructor-function ->https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/use-a-constructor-to-create-objects +>[Object Oriented Programming: Define a Constructor Function](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/define-a-constructor-function)
+[Object Oriented Programming: Use a Constructor to Create Objects](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/use-a-constructor-to-create-objects) **3.5** Nested loops -> https://www.freecodecamp.com/challenges/nesting-for-loops +>[Basic JavaScript: Nesting For Loops +](https://www.freecodecamp.com/challenges/nesting-for-loops) **3.6** We did some work with arrays: @@ -160,7 +161,21 @@ addSix(21); // returns 27 __Bonus__: Write a function takes this array `['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']` and returns an array which only has unique values in it (so it removes the duplicate ones). Make it a 'smart' algorithm that could do it for every array (only strings/number). Try to make it as fast as possible! -## Step 5: Read before next lecture +## Step 5: Run the unit tests + +(See the week 2 MAKEME for detailed instructions.) + +To run the unit test for the week 3 homework, open a terminal window in the `JavaScript2` folder and type + +``` +npm run test3 +``` + +In case of errors, try and fix them. When done, run the tests again: `npm run test3` + +Repeat the previous step until all tests pass. + +## Step 6: Read before next lecture _Deadline Sunday morning_ @@ -171,7 +186,7 @@ Go trough the reading material in the [README.md](https://github.com/HackYourFut Go over your homework one last time: -- Does every file run without errors and with the correct results when you run them with Node? +- Does your homework pass all the unit tests? - Does every file start with `'use strict';`? - Have you used `const` and `let` and avoided `var`? - Do the variable, function and argument names you created follow the [Naming Conventions](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md)? diff --git a/Week3/homework-solutions/1-step3.js b/Week3/homework-solutions/1-step3.js new file mode 100644 index 000000000..8a0fb9810 --- /dev/null +++ b/Week3/homework-solutions/1-step3.js @@ -0,0 +1,15 @@ +'use strict'; + +function foo(func) { + func(); + // What to do here? +} + +function bar() { + console.log('Hello, I am bar!'); +} + +foo(bar); + +// Do not change or remove the next line +module.exports = foo; diff --git a/Week3/homework-solutions/2-step3.js b/Week3/homework-solutions/2-step3.js new file mode 100644 index 000000000..28d1293b1 --- /dev/null +++ b/Week3/homework-solutions/2-step3.js @@ -0,0 +1,37 @@ +'use strict'; + +function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { + const numbers = []; + for (let i = startIndex; i <= stopIndex; i++) { + numbers.push(i); + } + + numbers.forEach(num => { + if (num % 3 === 0) { + threeCallback(num); + } + if (num % 5 === 0) { + fiveCallback(num); + } + }); +} + +// uses a closure +function sayDivisibleBy(divisor) { + return function (num) { + console.log(`${num} is divisible by ${divisor}`); + }; +} + +function sayThree(number) { + sayDivisibleBy(3)(number); +} + +function sayFive(number) { + sayDivisibleBy(5)(number); +} + +threeFive(10, 15, sayThree, sayFive); + +// Do not change or remove the next line +module.exports = threeFive; diff --git a/Week3/homework-solutions/3-step3.js b/Week3/homework-solutions/3-step3.js new file mode 100644 index 000000000..9ad0dc5b9 --- /dev/null +++ b/Week3/homework-solutions/3-step3.js @@ -0,0 +1,50 @@ +'use strict'; + +// use a 'for' loop +function repeatStringNumTimesWithFor(str, num) { + let result = ''; + for (let i = 0; i < num; i++) { + result += str; + } + return result; +} + + +console.log('for', repeatStringNumTimesWithFor('abc', 3)); + +// use a 'while' loop +function repeatStringNumTimesWithWhile(str, num) { + let result = ''; + let i = 0; + while (i < num) { + result += str; + i++; + } + return result; +} + + +console.log('while', repeatStringNumTimesWithWhile('abc', 3)); + +// use a 'do...while' loop +function repeatStringNumTimesWithDoWhile(str, num) { + let result = ''; + if (num > 0) { + let i = 0; + do { + result += str; + i++; + } while (i < num); + } + return result; +} + + +console.log('do-while', repeatStringNumTimesWithDoWhile('abc', 3)); + +// Do not change or remove the next lines +module.exports = { + repeatStringNumTimesWithFor, + repeatStringNumTimesWithWhile, + repeatStringNumTimesWithDoWhile +}; diff --git a/Week3/homework-solutions/4-step3.js b/Week3/homework-solutions/4-step3.js new file mode 100644 index 000000000..bb4a9bdb7 --- /dev/null +++ b/Week3/homework-solutions/4-step3.js @@ -0,0 +1,13 @@ +'use strict'; +// paste your freeCodeCamp solutions in here + +function Dog() { + this.name = 'Tarzan'; + this.color = 'brown'; + this.numLegs = 4; +} + +const hound = new Dog(); + +// Do not change or remove the next line +module.exports = hound; diff --git a/Week3/homework-solutions/5-step3.js b/Week3/homework-solutions/5-step3.js new file mode 100644 index 000000000..de0cb1ebf --- /dev/null +++ b/Week3/homework-solutions/5-step3.js @@ -0,0 +1,19 @@ +'use strict'; + +// note: prefer const and let over var +function multiplyAll(arr) { + var product = 1; + for (var i = 0; i < arr.length; i++) { + var innerArray = arr[i]; + for (var j = 0; j < innerArray.length; j++) { + product *= innerArray[j]; + } + } + return product; +} + +const result = multiplyAll([[1, 2], [3, 4], [5, 6, 7]]); +console.log(result); // 5040 + +// Do not change or remove the next line +module.exports = multiplyAll; diff --git a/Week3/homework-solutions/6-step3.js b/Week3/homework-solutions/6-step3.js new file mode 100644 index 000000000..13226df55 --- /dev/null +++ b/Week3/homework-solutions/6-step3.js @@ -0,0 +1,28 @@ +'use strict'; + +const arr2d = [[1, 2], [3, 4], [5, 6]]; +const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; + +// This is a recursive function: a function calling itself. +// It can print an array of any dimension. +function printArray(arg) { + if (Array.isArray(arg)) { + arg.forEach(elem => printArray(elem)); + } else { + console.log(arg); + } +} + +const printArray2d = printArray; +const printArray3d = printArray; + +printArray2d(arr2d); + +printArray3d(arr3d); + +// Do not change or remove the next lines +module.exports = { + printArray2d, + printArray3d +}; + diff --git a/Week3/homework-solutions/7-step3.js b/Week3/homework-solutions/7-step3.js new file mode 100644 index 000000000..af1712faf --- /dev/null +++ b/Week3/homework-solutions/7-step3.js @@ -0,0 +1,25 @@ +'use strict'; + +const x = 9; +function f1(val) { + val = val + 1; + return val; +} + +f1(x); + +console.log(x); + + +const y = { x: 9 }; +function f2(val) { + val.x = val.x + 1; + return val; +} + +f2(y); + +console.log(y); + +// Add your explanation as a comment here + diff --git a/Week3/homework-solutions/step4-bonus.js b/Week3/homework-solutions/step4-bonus.js new file mode 100644 index 000000000..c71e8ccb4 --- /dev/null +++ b/Week3/homework-solutions/step4-bonus.js @@ -0,0 +1,14 @@ +'use strict'; + +const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; + +function makeUnique(arr) { + return arr.filter((elem, index) => arr.indexOf(elem) === index); +} + +const uniqueValues = makeUnique(values); + +console.log(uniqueValues); + +// Do not change or remove the next line +module.exports = makeUnique; diff --git a/Week3/homework-solutions/step4.js b/Week3/homework-solutions/step4.js new file mode 100644 index 000000000..e0c9b98d8 --- /dev/null +++ b/Week3/homework-solutions/step4.js @@ -0,0 +1,15 @@ +'use strict'; + +function createBase(base) { + return function (num) { + return base + num; + }; +} + +const addSix = createBase(6); + +console.log(addSix(10)); // returns 16 +console.log(addSix(21)); // returns 27 + +// Do not change or remove the next line +module.exports = createBase; diff --git a/Week3/homework/1-step3.js b/Week3/homework/1-step3.js index bee3be0a0..74b0d6ce0 100644 --- a/Week3/homework/1-step3.js +++ b/Week3/homework/1-step3.js @@ -9,3 +9,6 @@ function bar() { } foo(bar); + +// Do not change or remove the next line +module.exports = foo; diff --git a/Week3/homework/2-step3.js b/Week3/homework/2-step3.js index 777ca2038..33e6cbe1d 100644 --- a/Week3/homework/2-step3.js +++ b/Week3/homework/2-step3.js @@ -1,8 +1,19 @@ 'use strict'; function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { - const values = []; - // Add your code here + const numbers = []; + // add your code here +} + +function sayThree(number) { + // add your code here +} + +function sayFive(number) { + // add your code here } threeFive(10, 15, sayThree, sayFive); + +// Do not change or remove the next line +module.exports = threeFive; diff --git a/Week3/homework/3-step3.js b/Week3/homework/3-step3.js index 75200818b..4360616fc 100644 --- a/Week3/homework/3-step3.js +++ b/Week3/homework/3-step3.js @@ -2,24 +2,34 @@ // use a 'for' loop function repeatStringNumTimesWithFor(str, num) { + let result = ''; // add your code here - return str; + return result; } console.log('for', repeatStringNumTimesWithFor('abc', 3)); // use a 'while' loop function repeatStringNumTimesWithWhile(str, num) { + let result = ''; // add your code here - return str; + return result; } console.log('while', repeatStringNumTimesWithWhile('abc', 3)); // use a 'do...while' loop function repeatStringNumTimesWithDoWhile(str, num) { + let result = ''; // add your code here - return str; + return result; } -console.log('while', repeatStringNumTimesWithDoWhile('abc', 3)); +console.log('do-while', repeatStringNumTimesWithDoWhile('abc', 3)); + +// Do not change or remove the next lines +module.exports = { + repeatStringNumTimesWithFor, + repeatStringNumTimesWithWhile, + repeatStringNumTimesWithDoWhile +}; diff --git a/Week3/homework/4-step3.js b/Week3/homework/4-step3.js index 52a0e9d74..2c1e64c90 100644 --- a/Week3/homework/4-step3.js +++ b/Week3/homework/4-step3.js @@ -1,2 +1,11 @@ 'use strict'; // paste your freeCodeCamp solutions in here + +function Dog() { + // add your code here +} + +const hound = new Dog(); + +// Do not change or remove the next line +module.exports = hound; diff --git a/Week3/homework/5-step3.js b/Week3/homework/5-step3.js index 52a0e9d74..5fadcffb3 100644 --- a/Week3/homework/5-step3.js +++ b/Week3/homework/5-step3.js @@ -1,2 +1,13 @@ 'use strict'; -// paste your freeCodeCamp solutions in here + +function multiplyAll(arr) { + let product = 1; + // add your code here + return product; +} + +const result = multiplyAll([[1, 2], [3, 4], [5, 6]]); +console.log(result); // 720 + +// Do not change or remove the next line +module.exports = multiplyAll; diff --git a/Week3/homework/6-step3.js b/Week3/homework/6-step3.js index 89076b078..a7e8b24eb 100644 --- a/Week3/homework/6-step3.js +++ b/Week3/homework/6-step3.js @@ -3,4 +3,20 @@ const arr2d = [[1, 2], [3, 4], [5, 6]]; const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; -// add your solution here, or add a comment on how you would tackle this problem +function printArray2d(arr) { + // add your code here +} + +function printArray3d(arr) { + // add your code here +} + +printArray2d(arr2d); +printArray3d(arr3d); + +// Do not change or remove the next lines +module.exports = { + printArray2d, + printArray3d +}; + diff --git a/Week3/homework/7-step3.js b/Week3/homework/7-step3.js index af1712faf..24094063c 100644 --- a/Week3/homework/7-step3.js +++ b/Week3/homework/7-step3.js @@ -22,4 +22,3 @@ f2(y); console.log(y); // Add your explanation as a comment here - diff --git a/Week3/homework/step4-bonus.js b/Week3/homework/step4-bonus.js index 4e89b29e7..ed7657cf1 100644 --- a/Week3/homework/step4-bonus.js +++ b/Week3/homework/step4-bonus.js @@ -2,9 +2,12 @@ const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; -// Add your function here. Try and come up with a good name for this function - -// Replace `yourFunction` with the name of the function you just created -const uniqueValues = yourFunction(values); +function makeUnique(arr) { + // add your code here +} +const uniqueValues = makeUnique(values); console.log(uniqueValues); + +// Do not change or remove the next line +module.exports = makeUnique; diff --git a/Week3/homework/step4.js b/Week3/homework/step4.js index e38d43447..2bf11c0d1 100644 --- a/Week3/homework/step4.js +++ b/Week3/homework/step4.js @@ -1,8 +1,13 @@ 'use strict'; -// Add your code here +function createBase(base) { + // add your code here +} const addSix = createBase(6); -addSix(10); // returns 16 -addSix(21); // returns 27 +console.log(addSix(10)); // returns 16 +console.log(addSix(21)); // returns 27 + +// Do not change or remove the next line +module.exports = createBase; diff --git a/Week3/test/1-step3.test.js b/Week3/test/1-step3.test.js new file mode 100644 index 000000000..8b39f9bf3 --- /dev/null +++ b/Week3/test/1-step3.test.js @@ -0,0 +1,9 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const foo = require(`../${HOMEWORK_FOLDER}/1-step3`); + +const mockFn = jest.fn(() => undefined); + +test('1-step3.js', () => { + foo(mockFn); + expect(mockFn.mock.calls.length).toBe(1); +}); diff --git a/Week3/test/2-step3.test.js b/Week3/test/2-step3.test.js new file mode 100644 index 000000000..1794a8763 --- /dev/null +++ b/Week3/test/2-step3.test.js @@ -0,0 +1,17 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const threeFive = require(`../${HOMEWORK_FOLDER}/2-step3`); + +const mockSayThree = jest.fn(() => undefined); +const mockSayFive = jest.fn(() => undefined); + +test('2-step3.js', () => { + threeFive(10, 15, mockSayThree, mockSayFive); + + expect(mockSayThree.mock.calls.length).toBe(2); + expect(mockSayThree.mock.calls[0][0]).toBe(12); + expect(mockSayThree.mock.calls[1][0]).toBe(15); + + expect(mockSayFive.mock.calls.length).toBe(2); + expect(mockSayFive.mock.calls[0][0]).toBe(10); + expect(mockSayFive.mock.calls[1][0]).toBe(15); +}); diff --git a/Week3/test/3-step3.test.js b/Week3/test/3-step3.test.js new file mode 100644 index 000000000..0d4596171 --- /dev/null +++ b/Week3/test/3-step3.test.js @@ -0,0 +1,41 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const { + repeatStringNumTimesWithFor, + repeatStringNumTimesWithWhile, + repeatStringNumTimesWithDoWhile +} = require(`../${HOMEWORK_FOLDER}/3-step3`); + +describe('1-step3.js', () => { + test('for-loop', () => { + let result = repeatStringNumTimesWithFor('abc', 3); + expect(result).toBe('abcabcabc'); + + result = repeatStringNumTimesWithFor('abc', 1); + expect(result).toBe('abc'); + + result = repeatStringNumTimesWithFor('abc', -2); + expect(result).toBe(''); + }); + + test('while-loop', () => { + let result = repeatStringNumTimesWithWhile('abc', 3); + expect(result).toBe('abcabcabc'); + + result = repeatStringNumTimesWithFor('abc', 1); + expect(result).toBe('abc'); + + result = repeatStringNumTimesWithFor('abc', -2); + expect(result).toBe(''); + }); + + test('do-while-loop', () => { + let result = repeatStringNumTimesWithDoWhile('abc', 3); + expect(result).toBe('abcabcabc'); + + result = repeatStringNumTimesWithFor('abc', 1); + expect(result).toBe('abc'); + + result = repeatStringNumTimesWithFor('abc', -2); + expect(result).toBe(''); + }); +}); diff --git a/Week3/test/4-step3.test.js b/Week3/test/4-step3.test.js new file mode 100644 index 000000000..54af44b9b --- /dev/null +++ b/Week3/test/4-step3.test.js @@ -0,0 +1,9 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const hound = require(`../${HOMEWORK_FOLDER}/4-step3`); + +test('4-step3', () => { + expect(typeof hound).toBe('object'); + expect(typeof hound.name).toBe('string'); + expect(typeof hound.color).toBe('string'); + expect(typeof hound.numLegs).toBe('number'); +}); diff --git a/Week3/test/5-step3.test.js b/Week3/test/5-step3.test.js new file mode 100644 index 000000000..74db828da --- /dev/null +++ b/Week3/test/5-step3.test.js @@ -0,0 +1,7 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const multiplyAll = require(`../${HOMEWORK_FOLDER}/5-step3`); + +test('5-step3.js', () => { + const result = multiplyAll([[1, 2], [3, 4], [5, 6, 7]]); + expect(result).toBe(5040); +}); diff --git a/Week3/test/6-step3.test.js b/Week3/test/6-step3.test.js new file mode 100644 index 000000000..9d90771ef --- /dev/null +++ b/Week3/test/6-step3.test.js @@ -0,0 +1,32 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const { + printArray2d, + printArray3d +} = require(`../${HOMEWORK_FOLDER}/6-step3`); + +const arr2d = [[1, 2], [3, 4], [5, 6]]; +const expected2d = [1, 2, 3, 4, 5, 6].join(''); + +const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; +const expected3d = [1, 2, 3, 4, 5, 6, 7, 8].join(''); + + +describe('6-step3.js', () => { + let outputData; + const storeLog = (...inputs) => (outputData += inputs.join(' ')); + + test('printArray2d', () => { + outputData = ''; + console['log'] = jest.fn(storeLog); + printArray2d(arr2d); + expect(outputData).toBe(expected2d); + }); + + test('printArray2d', () => { + outputData = ''; + console['log'] = jest.fn(storeLog); + printArray3d(arr3d); + expect(outputData).toBe(expected3d); + }); +}); + diff --git a/Week3/test/console-test.js b/Week3/test/console-test.js new file mode 100644 index 000000000..72d5a84fc --- /dev/null +++ b/Week3/test/console-test.js @@ -0,0 +1,14 @@ +// see: https://stackoverflow.com/questions/44890836/how-to-test-console-log-output-using-jest-or-other-javascript-testing-framework?rq=1 + +function consoleTest(filename, expectedOutput) { + let outputData = ''; + const storeLog = (...inputs) => (outputData += inputs.join(' ')); + + test(filename, () => { + console['log'] = jest.fn(storeLog); + require('../homework/' + filename); + expect(outputData).toBe(expectedOutput); + }); +} + +module.exports = consoleTest; diff --git a/Week3/test/step4-bonus.test.js b/Week3/test/step4-bonus.test.js new file mode 100644 index 000000000..9a2edf31b --- /dev/null +++ b/Week3/test/step4-bonus.test.js @@ -0,0 +1,9 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const makeUnique = require(`../${HOMEWORK_FOLDER}/step4-bonus`); + +test('step4-bonus', () => { + const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; + const expected = ['a', 'b', 'c', 'd', 'e', 'f']; + const result = makeUnique(values); + expect(result).toEqual(expected); +}); diff --git a/Week3/test/step4.test.js b/Week3/test/step4.test.js new file mode 100644 index 000000000..33d4fa3de --- /dev/null +++ b/Week3/test/step4.test.js @@ -0,0 +1,8 @@ +const { HOMEWORK_FOLDER } = require('../../test-config'); +const createBase = require(`../${HOMEWORK_FOLDER}/step4`); + +test('step4.js', () => { + const addSix = createBase(6); + const result = addSix(10); + expect(result).toBe(16); +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..dc753b21c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6044 @@ +{ + "name": "javascript2", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz", + "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", + "dev": true, + "requires": { + "acorn": "^5.0.3" + } + }, + "acorn-walk": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", + "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + }, + "dependencies": { + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + } + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true + }, + "cssstyle": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", + "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", + "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", + "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "imurmurhash": "^0.1.4", + "inquirer": "^6.1.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "globals": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", + "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "21.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.26.0.tgz", + "integrity": "sha512-zYePgbZaJsTfiJMb6XcsrrqgDpUB40AmGjjlwMZPEgVstrAsDNW8z7qQggD1lC24yR9h9VxTTb8qu6HRq3n6eg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "dev": true, + "requires": { + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", + "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", + "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "dev": true + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "realpath-native": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", + "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "^4.13.1" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", + "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", + "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "dev": true, + "requires": { + "ajv": "^6.5.3", + "lodash": "^4.17.10", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", + "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..494fd6583 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "javascript2", + "version": "1.0.0", + "description": "HYF JavaScript2 module", + "main": "index.js", + "scripts": { + "test2": "jest Week2/", + "test3": "jest Week3/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/HackYourFuture/JavaScript2.git" + }, + "author": "HackYourFuture", + "license": "ISC", + "bugs": { + "url": "https://github.com/HackYourFuture/JavaScript2/issues" + }, + "homepage": "https://github.com/HackYourFuture/JavaScript2#readme", + "devDependencies": { + "eslint": "^5.7.0", + "eslint-plugin-jest": "^21.26.0", + "jest": "^23.6.0" + } +} \ No newline at end of file diff --git a/test-config.js b/test-config.js new file mode 100644 index 000000000..a47aa6cbf --- /dev/null +++ b/test-config.js @@ -0,0 +1,3 @@ +module.exports = { + HOMEWORK_FOLDER: 'homework-solutions' +}; From 7a71bba133aad6905e536a522c2df3122f991627 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Wed, 24 Oct 2018 23:24:07 +0200 Subject: [PATCH 02/98] Replaced some var's --- Week3/homework-solutions/5-step3.js | 10 +++++----- Week3/homework-solutions/6-step3.js | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Week3/homework-solutions/5-step3.js b/Week3/homework-solutions/5-step3.js index de0cb1ebf..48ac00dba 100644 --- a/Week3/homework-solutions/5-step3.js +++ b/Week3/homework-solutions/5-step3.js @@ -1,11 +1,11 @@ 'use strict'; -// note: prefer const and let over var +// note: prefer const and let over let function multiplyAll(arr) { - var product = 1; - for (var i = 0; i < arr.length; i++) { - var innerArray = arr[i]; - for (var j = 0; j < innerArray.length; j++) { + let product = 1; + for (let i = 0; i < arr.length; i++) { + const innerArray = arr[i]; + for (let j = 0; j < innerArray.length; j++) { product *= innerArray[j]; } } diff --git a/Week3/homework-solutions/6-step3.js b/Week3/homework-solutions/6-step3.js index 13226df55..7bbc90a0b 100644 --- a/Week3/homework-solutions/6-step3.js +++ b/Week3/homework-solutions/6-step3.js @@ -17,7 +17,6 @@ const printArray2d = printArray; const printArray3d = printArray; printArray2d(arr2d); - printArray3d(arr3d); // Do not change or remove the next lines From c97dfac45fe25d529ce64430d3c95c51ff3f358e Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Fri, 4 Jan 2019 18:56:22 +0100 Subject: [PATCH 03/98] prepare for class 19 --- .eslintrc | 51 - .eslintrc.json | 19 + .vscode/settings.json | 1 + Week1/MAKEME.md | 68 +- Week1/README.md | 63 +- Week1/homework/app.js | 2 +- Week2/MAKEME.md | 63 +- Week2/homework-solutions/maartjes_work.js | 65 - Week2/homework-solutions/map_filter.js | 16 - Week2/homework-solutions/playground.js | 12 - .../{maartjes_work.js => maartjes-work.js} | 11 +- .../homework/{map_filter.js => map-filter.js} | 5 +- ...jes_work.test.js => maartjes-work.test.js} | 8 +- Week2/test/map-filter.test.js | 6 + Week2/test/map_filter.test.js | 11 - Week3/MAKEME.md | 91 +- Week3/homework-solutions/1-step3.js | 15 - Week3/homework-solutions/2-step3.js | 37 - Week3/homework-solutions/4-step3.js | 13 - Week3/homework-solutions/5-step3.js | 19 - Week3/homework-solutions/6-step3.js | 27 - Week3/homework-solutions/7-step3.js | 25 - Week3/homework-solutions/step4-bonus.js | 14 - Week3/homework-solutions/step4.js | 15 - Week3/homework/1-step3.js | 14 - Week3/homework/2-step3.js | 19 - Week3/homework/3-step3.js | 35 - Week3/homework/step2-1.js | 16 + Week3/homework/step2-2.js | 23 + .../3-step3.js => homework/step2-3.js} | 41 +- Week3/homework/{4-step3.js => step2-4.js} | 3 +- Week3/homework/{5-step3.js => step2-5.js} | 8 +- Week3/homework/{6-step3.js => step2-6.js} | 9 +- Week3/homework/{7-step3.js => step2-7.js} | 1 - .../{step4-bonus.js => step3-bonus.js} | 5 +- Week3/homework/{step4.js => step3.js} | 5 +- .../test/{1-step3.test.js => step2-1.test.js} | 3 +- .../test/{2-step3.test.js => step2-2.test.js} | 3 +- .../test/{3-step3.test.js => step2-3.test.js} | 3 +- .../test/{4-step3.test.js => step2-4.test.js} | 3 +- .../test/{5-step3.test.js => step2-5.test.js} | 3 +- .../test/{6-step3.test.js => step2-6.test.js} | 8 +- ...tep4-bonus.test.js => step3-bonus.test.js} | 3 +- Week3/test/{step4.test.js => step3.test.js} | 3 +- package-lock.json | 1075 +++++++++++------ package.json | 31 +- prettier.config.js | 9 + test-config.js | 3 - 48 files changed, 1014 insertions(+), 969 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.json delete mode 100644 Week2/homework-solutions/maartjes_work.js delete mode 100644 Week2/homework-solutions/map_filter.js delete mode 100644 Week2/homework-solutions/playground.js rename Week2/homework/{maartjes_work.js => maartjes-work.js} (75%) rename Week2/homework/{map_filter.js => map-filter.js} (57%) rename Week2/test/{maartjes_work.test.js => maartjes-work.test.js} (50%) create mode 100644 Week2/test/map-filter.test.js delete mode 100644 Week2/test/map_filter.test.js delete mode 100644 Week3/homework-solutions/1-step3.js delete mode 100644 Week3/homework-solutions/2-step3.js delete mode 100644 Week3/homework-solutions/4-step3.js delete mode 100644 Week3/homework-solutions/5-step3.js delete mode 100644 Week3/homework-solutions/6-step3.js delete mode 100644 Week3/homework-solutions/7-step3.js delete mode 100644 Week3/homework-solutions/step4-bonus.js delete mode 100644 Week3/homework-solutions/step4.js delete mode 100644 Week3/homework/1-step3.js delete mode 100644 Week3/homework/2-step3.js delete mode 100644 Week3/homework/3-step3.js create mode 100644 Week3/homework/step2-1.js create mode 100644 Week3/homework/step2-2.js rename Week3/{homework-solutions/3-step3.js => homework/step2-3.js} (55%) rename Week3/homework/{4-step3.js => step2-4.js} (55%) rename Week3/homework/{5-step3.js => step2-5.js} (53%) rename Week3/homework/{6-step3.js => step2-6.js} (56%) rename Week3/homework/{7-step3.js => step2-7.js} (99%) rename Week3/homework/{step4-bonus.js => step3-bonus.js} (60%) rename Week3/homework/{step4.js => step3.js} (58%) rename Week3/test/{1-step3.test.js => step2-1.test.js} (54%) rename Week3/test/{2-step3.test.js => step2-2.test.js} (80%) rename Week3/test/{3-step3.test.js => step2-3.test.js} (90%) rename Week3/test/{4-step3.test.js => step2-4.test.js} (64%) rename Week3/test/{5-step3.test.js => step2-5.test.js} (50%) rename Week3/test/{6-step3.test.js => step2-6.test.js} (81%) rename Week3/test/{step4-bonus.test.js => step3-bonus.test.js} (63%) rename Week3/test/{step4.test.js => step3.test.js} (50%) create mode 100644 prettier.config.js delete mode 100644 test-config.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index d09b6652d..000000000 --- a/.eslintrc +++ /dev/null @@ -1,51 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true, - "es6": true, - "node": true, - "jest/globals": true - }, - "parserOptions": { - "ecmaVersion": 2017, - "ecmaFeatures": { - "jsx": true - }, - "sourceType": "module" - }, - "plugins": [ - "jest" - ], - "extends": [ - "eslint:recommended" - ], - "rules": { - "no-const-assign": "warn", - "no-this-before-super": "warn", - "no-undef": "warn", - "no-unreachable": "warn", - "no-unused-vars": "warn", - "constructor-super": "warn", - "valid-typeof": "warn", - "no-var": "warn", - "prefer-const": "warn", - "no-multiple-empty-lines": "warn", - "eol-last": [ - "error", - "always" - ], - "no-console": "off", - "camelcase": "warn", - "eqeqeq": [ - "error", - "always", - { - "null": "ignore" - } - ], - "semi": [ - "warn", - "always" - ] - } -} \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..83e420291 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "extends": ["airbnb", "prettier"], + "plugins": ["prettier"], + "env": { + "browser": true, + "jest": true + }, + "rules": { + "prettier/prettier": ["error"], + "strict": "off", + "func-names": "off", + "no-console": "off", + "no-plusplus": "off", + "trailing-comma": "off", + "operator-assignment": "off", + "no-param-reassign": "off", + "import/no-dynamic-require": "off" + } +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 38f966ebe..91171c0fe 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,7 @@ "codewars", "keyup", "maartje's", + "maartjes", "roverjs", "taalmap", "trollface" diff --git a/Week1/MAKEME.md b/Week1/MAKEME.md index de11d584e..79b197b83 100644 --- a/Week1/MAKEME.md +++ b/Week1/MAKEME.md @@ -2,95 +2,81 @@ ``` Topics discussed in class this week: -• Capturing user input +• Capturing user input • Events • Basic DOM manipulations (img src, innerHTML) -• Code debugging using the browser +• Code debugging using the browser • Code commenting • Structuring code files • Code formatting • Handing in homework via PR ``` ->[Here](/Week2/README.md) you find the readings you have to complete before the second lecture. +> [Here](/Week2/README.md) you find the readings you have to complete before the second lecture. ## Step 0: Make a small dance -Give yourself (or your neighbor) a little tap on the shoulder, you've made it to JS2! :muscle: - - -## Step 1: Implement feedback - -_Deadline Monday_ - -Your fellow students and teachers have provided you with feedback on your last JavaScript1 homework in Trello. -- Implement both feedback from Trello and Github. -- Check on one of your fellow students code and issues and see if her or she implemented their feedback correctly. If there are some things that can be improved make an issue suggesting further improvements. If you think that the feedback has been implemented correctly create a issue saying something like: "nice work you can clear your issues". - -## Step 2: Custom DOM manipulation challenge :mortar_board: +Give yourself (or your neighbor) a little tap on the shoulder, you've made it to JS2! :muscle: -_Deadline Saturday_ +## Step 1: Custom DOM manipulation challenge :mortar_board: -> **Preparation**: Fork this repository and use the [Homework Pull Request Workflow](../../../../fundamentals/blob/master/fundamentals/homework_pr.md) to hand in your homework. +_Deadline Thursday evening_ Modify the (mostly empty) files in the `Week1/homework` folder for this step. -**2.1** Open the `apps.js` and start by declaring an array that contains 10 strings. These strings should be of book titles you have read (or made up) and be lowercase without spaces so that you can use these later as HTML `id` attributes. (Example: _Harry Potter's - The Chamber of Secrets_ -> `harry_potter_chamber_secrets`). Add a console.log statement to output this array to console. (This is for debugging and making sure everything is in order. Delete it later when you're done :)) +**1.1** Open the `apps.js` and start by declaring an array that contains 10 strings. These strings should be of book titles you have read (or made up) and be lowercase without spaces so that you can use these later as HTML `id` attributes. (Example: _Harry Potter's - The Chamber of Secrets_ -> `harry_potter_chamber_secrets`). Add a console.log statement to output this array to console. (This is for debugging and making sure everything is in order. Delete it later when you're done :)) -**2.2** Open the empty `index.html` and add the required HTML to load the `app.js` file. Open `index.html` in the browser and confirm that the `console.log` statement shows the array. (Open the Chrome Developer Tools and inspect the console.) +**1.2** Open the empty `index.html` and add the required HTML to load the `app.js` file. Open `index.html` in the browser and confirm that the `console.log` statement shows the array. (Open the Chrome Developer Tools and inspect the console.) -**2.3** Remove the temporary `console.log` from step 2.1. Make a function (or functions) that generate a `ul` with `li` elements for each book ID in the array using a `for` loop. Make sure that the function names you choose are an accurate reflection of what they do. As a reminder, here are the recommended [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). +**1.3** Remove the temporary `console.log` from step 1.1. Make a function (or functions) that generate a `ul` with `li` elements for each book ID in the array using a `for` loop. Make sure that the function names you choose are an accurate reflection of what they do. As a reminder, here are the recommended [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). -**2.4** Make an object (_not an array!_) containing information for each book. Each property of this object should be another (i.e., nested) object with the book ID you thought up in step 2.1 as a key, and at least the following properties: `title`, `language` and `author`. +**1.4** Make an object (_not an array!_) containing information for each book. Each property of this object should be another (i.e., nested) object with the book ID you thought up in step 1.1 as a key, and at least the following properties: `title`, `language` and `author`. -**2.5** Now change the function from step 2.3 that you used to display the book ID's in a list to take the actual information about the book from the object and display that. Make sure you choose the correct HTML elements for each piece of info, for instance, a heading for the title. +**1.5** Now change the function from step 1.3 that you used to display the book ID's in a list to take the actual information about the book from the object and display that. Make sure you choose the correct HTML elements for each piece of info, for instance, a heading for the title. -**2.6** Beautify your html page with css (use the `style.css` file for that), add sources and alts to each of the images. - -**2.7** Find and download book covers for each book and construct a new object which has as keys the book IDs again, and as value the path to the image source (e.g. `{ harry_potter_blabla: './img/harry_potter_blabla.jpg', ... }`). +**1.6** Beautify your html page with css (use the `style.css` file for that), add sources and alts to each of the images. -Loop over these entries (_hint: `Object.keys(objectName)` gives you an array containing the keys_). Then write a function which places an image at the corresponding `li` element. Remember that objects are not ordered, so you cannot guarantee that the first key is the first `li` element. (_Hint: you could give each `li` item an `id` tag by modifying the function you made before._) +**1.7** Find and download book covers for each book and construct a new object which has as keys the book IDs again, and as value the path to the image source (e.g. `{ harry_potter_blabla: './img/harry_potter_blabla.jpg', ... }`). +**1.8** Loop over these entries (_hint: `Object.keys(objectName)` gives you an array containing the keys_). Then write a function which places an image at the corresponding `li` element. Remember that objects are not ordered, so you cannot guarantee that the first key is the first `li` element. (_Hint: you could give each `li` item an `id` tag by modifying the function you made before._) ### How to hand in your homework: Go over your homework one last time: -- Does every file run without errors and with the correct results when you run them with Node? -- Does every file start with `'use strict';`? -- Have you used `const` and `let` and avoided `var`? -- Do the variable, function and argument names you created follow the [Naming Conventions](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md)? -- Is your code well-formatted (see [Code Formatting](../../../../fundamentals/blob/master/fundamentals/code_formatting.md))? +- Does your JavaScript file start with `'use strict';`? +- Do the variable, function and argument names you created follow the [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md)? - Have you resolved all issues flagged by ESLint and the spell checker (no wavy red and green underlines in VSCode)? If the answer is 'yes' to all preceding questions you are ready to follow these instructions: -- [Handing in homework](../../../../fundamentals/blob/master/fundamentals/homework_pr.md) +- [Handing in homework](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/homework_pr.md) -## Step 4: **FreeCodeCamp challenges:** +## Step 2: **FreeCodeCamp challenges:** _Deadline Sunday morning_ --[Build JavaScript Objects](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/build-javascript-objects) -- Use a Constructor to Create Objects -- https://www.freecodecamp.com/challenges/make-instances-of-objects-with-a-constructor-function -- https://www.freecodecamp.com/challenges/make-unique-objects-by-passing-parameters-to-our-constructor -- https://www.freecodecamp.com/challenges/make-object-properties-private +- [Build JavaScript Objects](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/build-javascript-objects) +Use a Constructor to Create Objects -And just for fun ... https://www.freecodecamp.com/challenges/sum-all-numbers-in-a-range +- [Define a Constructor Function](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/define-a-constructor-function) +- [Extend Constructors to Receive Argument](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/extend-constructors-to-receive-arguments) -## Step 5: Read before next lecture +And just for fun ... [Sum All Numbers in a Range](https://www.freecodecamp.com/challenges/sum-all-numbers-in-a-range) + +## Step 3: Read before next lecture _Deadline Sunday morning_ Go trough the reading material in the [README.md](/Week2/README.md) to prepare for your next class ## :boom: Bonus homework :boom: + the Bonus homework for this week (for those of you want an extra challenge) do the following: - Sign up on codewars.com -- In you account setting under “clan” write “Hack Your Future” +- In you account setting under “clan” write “Hack Your Future” - Go do the challenges in the following playlist: https://www.codewars.com/collections/fun-fun-fundamentals Codewars is really a lot of fun, and you can compete against each other who has the most points :trollface: diff --git a/Week1/README.md b/Week1/README.md index caa85a5f6..837b24c19 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -12,26 +12,46 @@ In week one we will discuss the following topics: • Handing in homework via PR ``` -- Chrome DevTools [Debugging](https://developers.google.com/web/tools/chrome-devtools/) +## Software installation for the JavaScript 2 Module -### A Refresher from some previous covered topics: +**_To save time, please do these preparations at home before coming to the first lecture._** -Links to MDN (Mozilla Developer Network) topics: +1. Install the following extensions in VSCode (you may have installed some of them already): -- [Strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) + - Code Spell Checker + - ESLint + - open in browser + - Live Server + - Bracket Pair Colorizer + +2. Install the ESLint tool globally by issuing the following command from the command line: + + ``` + npm install -g eslint + ``` + +3. Fork this repository (i.e., **JavaScript2**) and clone your fork to your laptop. + +4. Open the `JavaScript2` folder from the cloned repository in VSCode. + +5. Open a terminal window in VSCode and type the following command: -## Review + ``` + npm install + ``` -Review through the topics of JavaScript1: +## Review of JavaScript1 -### JavaScript1 - Week 2 +As a refresher, go through the topics of JavaScript1: + +### Week 2 - [Variables (var, let, const)](./../../../../fundamentals/blob/master/fundamentals/variables.md) - [Basic Data types (Strings, Numbers, Arrays, Booleans)](./../../../../fundamentals/blob/master/fundamentals/values.md) - [Operators](./../../../../fundamentals/blob/master/fundamentals/operators.md) - [Naming conventions](./../../../../fundamentals/blob/master/fundamentals/naming_conventions.md) -### JavaScript1 - Week 3 +### Week 3 - [Advanced data types (objects)](./../../../../fundamentals/blob/master/fundamentals/objects.md) - [Conditional execution](./../../../../fundamentals/blob/master/fundamentals/conditional_execution.md)
@@ -40,7 +60,7 @@ Review through the topics of JavaScript1: - [Functions](./../../../../fundamentals/blob/master/fundamentals/functions.md) - [Scope](./../../../../fundamentals/blob/master/fundamentals/scope.md) -### Required readings +## Required readings for the first lecture (No reading material available at this time for the crossed-out topics) @@ -53,6 +73,11 @@ Review through the topics of JavaScript1: - [Code formatting](./../../../../fundamentals/blob/master/fundamentals/code_formatting.md) - [Handing in homework via PR](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/homework_pr.md) +Extras: + +- [Strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) +- [Chrome DevTools Debugging](https://developers.google.com/web/tools/chrome-devtools/) + ### Recommended readings These chapters from _Eloquent JavaScript_ give in-depth explanations of the topics that will be discussed during the lecture. Highly recommended (if time permits). @@ -61,20 +86,20 @@ These chapters from _Eloquent JavaScript_ give in-depth explanations of the topi - Chapter 14: [The Document Object Model](http://eloquentjavascript.net/14_dom.html) - _You can skip the following sections:_ + _You can skip the following sections:_ - - Moving through the tree + - Moving through the tree - Chapter 15: [Handling Events](http://eloquentjavascript.net/15_event.html) - Notes: for the lectures and homework you only need to know about these events: `click`, `change`, `keyup` and `load`. - - _You can skip the following sections (but come to these sections when doing the React module):_ + Notes: for the lectures and homework you only need to know about these events: `click`, `change`, `keyup` and `load`. + + _You can skip the following sections (but come to these sections when doing the React module):_ - - Touch events - - Scroll events - - Focus events - - Events and the Event Loop - - Debouncing + - Touch events + - Scroll events + - Focus events + - Events and the Event Loop + - Debouncing _Please go through the material and come to class prepared!_ diff --git a/Week1/homework/app.js b/Week1/homework/app.js index ffef836dc..6131f54ea 100644 --- a/Week1/homework/app.js +++ b/Week1/homework/app.js @@ -1,11 +1,11 @@ 'use strict'; + { const bookTitles = [ // Replace with your own book titles 'harry_potter_chamber_secrets' ]; - // Replace with your own code console.log(bookTitles); } diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index 8ca688251..d6cda53b3 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -9,19 +9,13 @@ Topics discussed this week: • Arrow functions ``` ->[Here](/Week3/README.md) you find the readings you have to complete before the third lecture. +> [Here](/Week3/README.md) you find the readings you have to complete before the third lecture. -## Step 1: Feedback - -_Deadline Monday_ - -Go through the `html-css`, `javascript1` and `javascript2` Github repositories of one of your fellow students, check if they have neat repository's with the different weeks (eg. `week1`, `week2`, `week3`)of homework for all the modules up and until now. Also check if they have hosted their homework on Github pages. If there is anything that they can improve please provide feedback in an issue. - -## Step 2: More map, filter and `=>` +## Step 1: More map, filter and `=>` _Deadline Wednesday_ -**2.1** Say you would like to write a program that doubles the odd numbers in an array and throws away the even numbers. +**1.1** Say you would like to write a program that doubles the odd numbers in an array and throws away the even numbers. Your solution could be something like this: @@ -44,7 +38,7 @@ Rewrite the above `doubleOddNumbers` function using `map` and `filter`; don't fo --- -**2.2** Underneath you see a very interesting small insight in Maartje's work: +**1.2** Underneath you see a very interesting small insight in Maartje's work: ```js const monday = [ @@ -62,14 +56,14 @@ const monday = [ }, { name: 'Talk to a lot of people', - duration: 200 + duration: 1.0 } ]; const tuesday = [ { name: 'Keep writing summary', - duration: 240 + duration: 1.0 }, { name: 'Some more web development', @@ -81,7 +75,7 @@ const tuesday = [ }, { name: 'Talk to a lot of people', - duration: 200 + duration: 1.0 }, { name: 'Look at application assignments new students', @@ -94,43 +88,31 @@ _Note: the durations are specified in minutes._ Write a program that computes how much Maartje has earned by completing these tasks, using `map` and `filter`. For the 'summing part' you can try your luck with `reduce`; alternatively, you may use `forEach` or a `for` loop. -Follow these steps. Each step should build on the result of the previous step. +Follow these steps. Each step should build on the result of the previous step. - Map the tasks to durations in hours. - Filter out everything that took less than two hours (i.e., remove from the collection) -- Multiply the each duration by a per-hour rate for billing (assume €20/hour) and sum it all up. -- Output a formatted Euro amount, rounded to Euro cents, e.g: `€ 12.34`. +- Multiply the each duration by a per-hour rate for billing (use €20/hour) and sum it all up. +- Output a formatted Euro amount, rounded to Euro cents, e.g: `€11.34`. - Choose variable and parameters names that most accurately describe their contents or purpose. When naming an array, use a plural form, e.g. `durations`. For a single item, use a singular form, e.g. `duration`. For details, see [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). - Don't forget to use `=>`. -## Step 3: Testing your homework +## Step 2: Testing your homework We have provided _unit tests_ in this repo that allow you to verify that your homework produces the expected results. > **Unit test**: A _unit test_ is a piece of code (usually a function) that invokes another piece of code and checks the correctness of some assumptions afterwards. If the assumptions turn out to be wrong, the unit test has failed. A 'unit' is a method or function. > -> Adapted from: Roy Osherove (2009), The art of Unit Testing. Greenwich, CT: Manning. +> Adapted from: Roy Osherove (1.09), The art of Unit Testing. Greenwich, CT: Manning. At this point it is not important to understand how unit tests work. The only thing you need to know now is how to run the tests and how to determine whether your homework produces the correct results. -#### Installation - -Before you can run the unit tests you need to install some additional software. You need to do this only once; there is no need to repeat it for the week 3 homework. - -Open a terminal window. Make sure the current directory is the `JavaScript2` folder and type the following command: - -``` -npm install -``` - -This software installation might take a while. - #### Run the tests -Once the software installation has been completed, you can test your week 2 homework by typing this command in the terminal window: +You can test your week 2 homework by typing this command in the terminal window: ``` -npm run test2 +npm run test-week2 ``` You will see some output appearing in the console while the tests run. If all is well (no errors), the last couple of lines will look like this: @@ -149,7 +131,7 @@ In case of unexpected results, say from _Maartjes work_ assignment, you might se Test Suites: 1 failed, 1 passed, 2 total Tests: 1 failed, 1 passed, 2 total Snapshots: 0 total -Time: 2.255s +Time: 1.255s Ran all test suites matching /Week2\//i. ``` @@ -157,11 +139,11 @@ If that's the case, try and fix the error. When done, run the tests again: `npm Repeat the previous step until all (= 2 in this case) tests pass. -## Step 4: ROVER +## Step 3: ROVER Finish up to chapter 7: JSON on [roverjs.com](http://roverjs.com/)! -## Step 5: **Some freeCodeCamp challenges:** +## Step 4: **Some freeCodeCamp challenges:** _Deadline Saturday_ @@ -171,26 +153,21 @@ _Deadline Saturday_ 3. [Use the map Method to Extract Data from an Array](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array) - -## Step 6: Read before next lecture +## Step 5: Read before next lecture _Deadline Sunday morning_ Go trough the reading material in the [README.md](/Week3/README.md) to prepare for your next class - ### How to hand in your homework: Go over your homework one last time: - Does your homework pass all the unit tests? - Does every file start with `'use strict';`? -- Have you used `const` and `let` and avoided `var`? -- Do the variable, function and argument names you created follow the [Naming Conventions](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md)? -- Is your code well-formatted (see [Code Formatting](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md))? +- Do the variable, function and argument names you created follow the [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md)? - Have you resolved all issues flagged by ESLint and the spell checker (no wavy red and green underlines in VSCode)? - If the answer is 'yes' to all preceding questions you are ready to follow these instructions: -- [Handing in homework](../../../../fundamentals/blob/master/fundamentals/homework_pr.md) +- [Handing in homework](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/homework_pr.md) diff --git a/Week2/homework-solutions/maartjes_work.js b/Week2/homework-solutions/maartjes_work.js deleted file mode 100644 index 29b9d1d17..000000000 --- a/Week2/homework-solutions/maartjes_work.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -const monday = [ - { - name: 'Write a summary HTML/CSS', - duration: 180 - }, - { - name: 'Some web development', - duration: 120 - }, - { - name: 'Fix homework for class10', - duration: 20 - }, - { - name: 'Talk to a lot of people', - duration: 200 - } -]; - -const tuesday = [ - { - name: 'Keep writing summary', - duration: 240 - }, - { - name: 'Some more web development', - duration: 180 - }, - { - name: 'Staring out the window', - duration: 10 - }, - { - name: 'Talk to a lot of people', - duration: 200 - }, - { - name: 'Look at application assignments new students', - duration: 40 - } -]; - -const maartjesTasks = monday.concat(tuesday); -const maartjesHourlyRate = 20; - -function computeEarnings(tasks, hourlyRate) { - return tasks - .map(task => task.duration / 61) - .filter(duration => duration >= 2) - .map(duration => duration * hourlyRate) - .reduce((total, amount) => total + amount, 0); -} - -const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); -console.log(`Maartje has earned €${earnings.toFixed(2)}`); - -// Do not change or remove the next line -module.exports = { - maartjesTasks, - maartjesHourlyRate, - computeEarnings -}; - diff --git a/Week2/homework-solutions/map_filter.js b/Week2/homework-solutions/map_filter.js deleted file mode 100644 index 1aa3d6baa..000000000 --- a/Week2/homework-solutions/map_filter.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -function doubleOddNumbers(numbers) { - return numbers - .filter(number => number % 2 !== 0) - .map(number => number * 2); -} - -const myNumbers = [1, 2, 3, 4]; -console.log(doubleOddNumbers(myNumbers)); - -// Do not change or remove the next line -module.exports = { - myNumbers, - doubleOddNumbers -}; diff --git a/Week2/homework-solutions/playground.js b/Week2/homework-solutions/playground.js deleted file mode 100644 index 088bc98c3..000000000 --- a/Week2/homework-solutions/playground.js +++ /dev/null @@ -1,12 +0,0 @@ -function doubleOddNumbers(numbers) { - const newNumbers = []; - for (let i = 0; i < numbers.length; i++) { - if (numbers[i] % 2 !== 0) { - newNumbers.push(numbers[i] * 2); - } - } - return newNumbers; -} - -const myNumbers = [1, 2, 3, 4]; -console.log(doubleOddNumbers(myNumbers)); // ==> [2, 6] diff --git a/Week2/homework/maartjes_work.js b/Week2/homework/maartjes-work.js similarity index 75% rename from Week2/homework/maartjes_work.js rename to Week2/homework/maartjes-work.js index cf6384e86..fc8c0e633 100644 --- a/Week2/homework/maartjes_work.js +++ b/Week2/homework/maartjes-work.js @@ -46,13 +46,18 @@ const maartjesTasks = monday.concat(tuesday); const maartjesHourlyRate = 20; function computeEarnings(tasks, hourlyRate) { - // add your code here + // Replace this comment and the next line with your code + console.log(tasks, hourlyRate); } +// eslint-disable-next-line no-unused-vars const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); -console.log(`Maartje has earned €${'replace this string with the earnings rounded to eurocents'}`); -// Do not change or remove the next lines +// add code to convert `earnings` to a string rounded to two decimals (euro cents) + +console.log(`Maartje has earned €${'replace this string with the earnings rounded to euro cents'}`); + +// Do not change or remove anything below this line module.exports = { maartjesTasks, maartjesHourlyRate, diff --git a/Week2/homework/map_filter.js b/Week2/homework/map-filter.js similarity index 57% rename from Week2/homework/map_filter.js rename to Week2/homework/map-filter.js index 22dc5bb9f..ab3c622d4 100644 --- a/Week2/homework/map_filter.js +++ b/Week2/homework/map-filter.js @@ -1,13 +1,14 @@ 'use strict'; function doubleOddNumbers(numbers) { - // add your code here + // Replace this comment and the next line with your code + console.log(numbers); } const myNumbers = [1, 2, 3, 4]; console.log(doubleOddNumbers(myNumbers)); -// Do not change or remove the next lines +// Do not change or remove anything below this line module.exports = { myNumbers, doubleOddNumbers diff --git a/Week2/test/maartjes_work.test.js b/Week2/test/maartjes-work.test.js similarity index 50% rename from Week2/test/maartjes_work.test.js rename to Week2/test/maartjes-work.test.js index 88a651fbd..59225a53a 100644 --- a/Week2/test/maartjes_work.test.js +++ b/Week2/test/maartjes-work.test.js @@ -1,12 +1,6 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const { - maartjesTasks, - maartjesHourlyRate, - computeEarnings -} = require(`../${HOMEWORK_FOLDER}/maartjes_work`); +const { maartjesTasks, maartjesHourlyRate, computeEarnings } = require(`../homework/maartjes-work`); test('maartjes_work.js', () => { - const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); const result = earnings.toFixed(2); expect(result).toBe('373.33'); diff --git a/Week2/test/map-filter.test.js b/Week2/test/map-filter.test.js new file mode 100644 index 000000000..a3f613a8b --- /dev/null +++ b/Week2/test/map-filter.test.js @@ -0,0 +1,6 @@ +const { myNumbers, doubleOddNumbers } = require(`../homework/map-filter`); + +test('map_filter.js', () => { + const result = doubleOddNumbers(myNumbers); + expect(result).toEqual([2, 6]); +}); diff --git a/Week2/test/map_filter.test.js b/Week2/test/map_filter.test.js deleted file mode 100644 index 2d6fb4b8e..000000000 --- a/Week2/test/map_filter.test.js +++ /dev/null @@ -1,11 +0,0 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const { - myNumbers, - doubleOddNumbers -} = require(`../${HOMEWORK_FOLDER}/map_filter`); - -test('map_filter.js', () => { - - const result = doubleOddNumbers(myNumbers); - expect(result).toEqual([2, 6]); -}); diff --git a/Week3/MAKEME.md b/Week3/MAKEME.md index e84004ea6..05a091a88 100644 --- a/Week3/MAKEME.md +++ b/Week3/MAKEME.md @@ -7,18 +7,13 @@ Topics discussed this week: • Callbacks ``` ->[Here](https://github.com/HackYourFuture/JavaScript3/tree/master/Week1) you find the readings you have to complete before the first JavaScript3 lecture. +> [Here](https://github.com/HackYourFuture/JavaScript3/tree/master/Week1) you find the readings you have to complete before the first JavaScript3 lecture. -## Step 1: Feedback +## Step 1: Read -_Deadline Monday_ +> Read: -Give feedback on `step 2` of `week 5` to one of your fellow students (do this by creating issues in Github). - -## Step 2: Read - ->Read: -- JavaScript : [Closures](http://conceptf1.blogspot.nl/2013/11/javascript-closures.html) +- JavaScript : [Closures](http://conceptf1.blogspot.nl/2012.11/javascript-closures.html) - Everything you wanted to know about [JavaScript scope](https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/) - JavaScript [Scoping and Hoisting](http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) - 5 JavaScript [“Bad” Parts That Are Fixed In ES6](https://medium.freecodecamp.com/5-javascript-bad-parts-that-are-fixed-in-es6-c7c45d44fd81) @@ -26,11 +21,11 @@ Give feedback on `step 2` of `week 5` to one of your fellow students (do this by - More about [closures](https://www.reddit.com/r/learnjavascript/comments/1v6n8p/closure_explain_likei_am_in_high_school/?st=ixsp0mbe&sh=5526d150) - A VERY popular [StackOverflow article](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) -## Step 3: JavaScript +## Step 2: JavaScript _Deadline Wednesday_ -We learned a little bit about callbacks in JS. A callback is simply a function passed to another function that gets executed (run) after a potentially long running operation has completed. There is another function called `setTimeout` that will wait a specified period of time and then execute a function. For example: +We learned a little bit about callbacks in JS. A callback is simply a function passed to another function that gets executed (run) after a potentially long running operation has completed. There is another function called `setTimeout` that will wait a specified period of time and then execute a function. For example: ```js function doIt() { @@ -39,13 +34,13 @@ function doIt() { setTimeout(doIt, 5000); ``` ->If you run the above code it will wait 5 seconds and then print `I am done`. Please read something about setTimeout on MDN. The first argument to the `setTimeout` call is the callback (`doIt`). +> If you run the above code it will wait 5 seconds and then print `I am done`. Please read something about setTimeout on MDN. The first argument to the `setTimeout` call is the callback (`doIt`). -**3.1** We saw that we can pass functions as arguments to other functions. Your task is to write a function that takes another function as an argument and runs it. +**2.1** We saw that we can pass functions as arguments to other functions. Your task is to write a function that takes another function as an argument and runs it. ```js function foo(func) { - // What to do here? + // What to do here? } function bar() { @@ -55,14 +50,14 @@ function bar() { foo(bar); ``` -**3.2** You must write a function that takes 4 arguments. +**2.2** You must write a function that takes 4 arguments. -- A start value +- A start value - An end value -- A callback to call if the number is divisible by 3 +- A callback to call if the number is divisible by 3 - A callback to use if the number is divisible by 5 -The function should first generate an array containing values from start value to end value (inclusive). +The function should first generate an array containing values from start value to end value (inclusive). Then the function should take the newly created array and iterate over it, and calling the first callback if the array value is divisible by 3. @@ -72,56 +67,56 @@ Both functions should be called if the array value is divisible by both 3 and 5. ```js function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { - const numbers = []; + const numbers = []; // make array - // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next + // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next } threeFive(10, 15, sayThree, sayFive); -// Should create an array [10,11,12,13,14,15] +// Should create an array [10,11,12,12.14,15] // and call sayFive, sayThree, sayThree, sayFive // please make sure you see why these calls are made before you start coding ``` > Note: The following assignments include some problems from _freeCodeCamp_. Note that some _freeCodeCamp_ examples still mention `var`. However you can safely replace them with `let` and `const` as appropriate. -**3.3** Please solve this problem: +**2.3** Please solve this problem: ->[Basic Algorithm Scripting: Repeat a String Repeat a String](https://www.freecodecamp.com/challenges/repeat-a-string-repeat-a-string) +> [Basic Algorithm Scripting: Repeat a String Repeat a String](https://www.freecodecamp.com/challenges/repeat-a-string-repeat-a-string) -_3.3.1_: with a `for` loop. -_3.3.2_: with a `while` loop. -_3.3.3_: with a `do...while` loop. +_2.3.1_: with a `for` loop. +_2.3.2_: with a `while` loop. +_2.3.3_: with a `do...while` loop. -**3.4** Some practice with objects: +**2.4** Some practice with objects: ->[Object Oriented Programming: Define a Constructor Function](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/define-a-constructor-function)
-[Object Oriented Programming: Use a Constructor to Create Objects](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/use-a-constructor-to-create-objects) +> [Object Oriented Programming: Define a Constructor Function](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/define-a-constructor-function)
> [Object Oriented Programming: Use a Constructor to Create Objects](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/object-oriented-programming/use-a-constructor-to-create-objects) -**3.5** Nested loops +**2.5** Nested loops ->[Basic JavaScript: Nesting For Loops -](https://www.freecodecamp.com/challenges/nesting-for-loops) +> [Basic JavaScript: Nesting For Loops +> ](https://www.freecodecamp.com/challenges/nesting-for-loops) -**3.6** We did some work with arrays: +**2.6** We did some work with arrays: ```js const arr = [1, 2, 3]; ``` + We can also nest arrays inside arrays like this: ```js const arr2d = [[1, 2], [3, 4], [5, 6]]; -```` +``` (for math people you can think of this as a matrix) -How would you print all the items of an array with 3 dimensions? -How about with _K_ dimensions? +How would you print all the items of an array with 3 dimensions? +How about with _K_ dimensions? What if you didn't know how deep the array was nested? (You don't have to write code for this but think about it.) -**3.7** Here are two functions that look like they do the something similar but they print different results. Please explain what's going on here. +**2.7** Here are two functions that look like they do the something similar but they print different results. Please explain what's going on here. ```js const x = 9; @@ -143,12 +138,11 @@ console.log(y); If you are confused please run the code and then consult the Google for "javascript pass by value pass by reference" - -## Step 4: Scope and Closures +## Step 3: Scope and Closures _Deadline Saturday_ -> Let's continue to learn a little more about scope and Closures. +> Let's continue to learn a little more about scope and Closures. Write a function that would allow you to do this: @@ -158,30 +152,26 @@ addSix(10); // returns 16 addSix(21); // returns 27 ``` -__Bonus__: Write a function takes this array `['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']` and returns an array which only has unique values in it (so it removes the duplicate ones). Make it a 'smart' algorithm that could do it for every array (only strings/number). Try to make it as fast as possible! - +**Bonus**: Write a function takes this array `['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']` and returns an array which only has unique values in it (so it removes the duplicate ones). Make it a 'smart' algorithm that could do it for every array (only strings/number). Try to make it as fast as possible! -## Step 5: Run the unit tests - -(See the week 2 MAKEME for detailed instructions.) +## Step 4: Run the unit tests To run the unit test for the week 3 homework, open a terminal window in the `JavaScript2` folder and type ``` -npm run test3 +npm run test-week3 ``` In case of errors, try and fix them. When done, run the tests again: `npm run test3` Repeat the previous step until all tests pass. -## Step 6: Read before next lecture +## Step 5: Read before next lecture _Deadline Sunday morning_ Go trough the reading material in the [README.md](https://github.com/HackYourFuture/JavaScript3/tree/master/Week1) to prepare for your next class - ### How to hand in your homework: Go over your homework one last time: @@ -189,10 +179,9 @@ Go over your homework one last time: - Does your homework pass all the unit tests? - Does every file start with `'use strict';`? - Have you used `const` and `let` and avoided `var`? -- Do the variable, function and argument names you created follow the [Naming Conventions](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md)? -- Is your code well-formatted (see [Code Formatting](../../../../fundamentals/blob/master/fundamentals/naming_conventions.md))? +- Do the variable, function and argument names you created follow the [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md)? - Have you resolved all issues flagged by ESLint and the spell checker (no wavy red and green underlines in VSCode)? If the answer is 'yes' to all preceding questions you are ready to follow these instructions: -- [Handing in homework](../../../../fundamentals/blob/master/fundamentals/homework_pr.md) +- [Handing in homework](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/homework_pr.md) diff --git a/Week3/homework-solutions/1-step3.js b/Week3/homework-solutions/1-step3.js deleted file mode 100644 index 8a0fb9810..000000000 --- a/Week3/homework-solutions/1-step3.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -function foo(func) { - func(); - // What to do here? -} - -function bar() { - console.log('Hello, I am bar!'); -} - -foo(bar); - -// Do not change or remove the next line -module.exports = foo; diff --git a/Week3/homework-solutions/2-step3.js b/Week3/homework-solutions/2-step3.js deleted file mode 100644 index 28d1293b1..000000000 --- a/Week3/homework-solutions/2-step3.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { - const numbers = []; - for (let i = startIndex; i <= stopIndex; i++) { - numbers.push(i); - } - - numbers.forEach(num => { - if (num % 3 === 0) { - threeCallback(num); - } - if (num % 5 === 0) { - fiveCallback(num); - } - }); -} - -// uses a closure -function sayDivisibleBy(divisor) { - return function (num) { - console.log(`${num} is divisible by ${divisor}`); - }; -} - -function sayThree(number) { - sayDivisibleBy(3)(number); -} - -function sayFive(number) { - sayDivisibleBy(5)(number); -} - -threeFive(10, 15, sayThree, sayFive); - -// Do not change or remove the next line -module.exports = threeFive; diff --git a/Week3/homework-solutions/4-step3.js b/Week3/homework-solutions/4-step3.js deleted file mode 100644 index bb4a9bdb7..000000000 --- a/Week3/homework-solutions/4-step3.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; -// paste your freeCodeCamp solutions in here - -function Dog() { - this.name = 'Tarzan'; - this.color = 'brown'; - this.numLegs = 4; -} - -const hound = new Dog(); - -// Do not change or remove the next line -module.exports = hound; diff --git a/Week3/homework-solutions/5-step3.js b/Week3/homework-solutions/5-step3.js deleted file mode 100644 index 48ac00dba..000000000 --- a/Week3/homework-solutions/5-step3.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -// note: prefer const and let over let -function multiplyAll(arr) { - let product = 1; - for (let i = 0; i < arr.length; i++) { - const innerArray = arr[i]; - for (let j = 0; j < innerArray.length; j++) { - product *= innerArray[j]; - } - } - return product; -} - -const result = multiplyAll([[1, 2], [3, 4], [5, 6, 7]]); -console.log(result); // 5040 - -// Do not change or remove the next line -module.exports = multiplyAll; diff --git a/Week3/homework-solutions/6-step3.js b/Week3/homework-solutions/6-step3.js deleted file mode 100644 index 7bbc90a0b..000000000 --- a/Week3/homework-solutions/6-step3.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -const arr2d = [[1, 2], [3, 4], [5, 6]]; -const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; - -// This is a recursive function: a function calling itself. -// It can print an array of any dimension. -function printArray(arg) { - if (Array.isArray(arg)) { - arg.forEach(elem => printArray(elem)); - } else { - console.log(arg); - } -} - -const printArray2d = printArray; -const printArray3d = printArray; - -printArray2d(arr2d); -printArray3d(arr3d); - -// Do not change or remove the next lines -module.exports = { - printArray2d, - printArray3d -}; - diff --git a/Week3/homework-solutions/7-step3.js b/Week3/homework-solutions/7-step3.js deleted file mode 100644 index af1712faf..000000000 --- a/Week3/homework-solutions/7-step3.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -const x = 9; -function f1(val) { - val = val + 1; - return val; -} - -f1(x); - -console.log(x); - - -const y = { x: 9 }; -function f2(val) { - val.x = val.x + 1; - return val; -} - -f2(y); - -console.log(y); - -// Add your explanation as a comment here - diff --git a/Week3/homework-solutions/step4-bonus.js b/Week3/homework-solutions/step4-bonus.js deleted file mode 100644 index c71e8ccb4..000000000 --- a/Week3/homework-solutions/step4-bonus.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; - -function makeUnique(arr) { - return arr.filter((elem, index) => arr.indexOf(elem) === index); -} - -const uniqueValues = makeUnique(values); - -console.log(uniqueValues); - -// Do not change or remove the next line -module.exports = makeUnique; diff --git a/Week3/homework-solutions/step4.js b/Week3/homework-solutions/step4.js deleted file mode 100644 index e0c9b98d8..000000000 --- a/Week3/homework-solutions/step4.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -function createBase(base) { - return function (num) { - return base + num; - }; -} - -const addSix = createBase(6); - -console.log(addSix(10)); // returns 16 -console.log(addSix(21)); // returns 27 - -// Do not change or remove the next line -module.exports = createBase; diff --git a/Week3/homework/1-step3.js b/Week3/homework/1-step3.js deleted file mode 100644 index 74b0d6ce0..000000000 --- a/Week3/homework/1-step3.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -function foo(func) { - // What to do here? -} - -function bar() { - console.log('Hello, I am bar!'); -} - -foo(bar); - -// Do not change or remove the next line -module.exports = foo; diff --git a/Week3/homework/2-step3.js b/Week3/homework/2-step3.js deleted file mode 100644 index 33e6cbe1d..000000000 --- a/Week3/homework/2-step3.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { - const numbers = []; - // add your code here -} - -function sayThree(number) { - // add your code here -} - -function sayFive(number) { - // add your code here -} - -threeFive(10, 15, sayThree, sayFive); - -// Do not change or remove the next line -module.exports = threeFive; diff --git a/Week3/homework/3-step3.js b/Week3/homework/3-step3.js deleted file mode 100644 index 4360616fc..000000000 --- a/Week3/homework/3-step3.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -// use a 'for' loop -function repeatStringNumTimesWithFor(str, num) { - let result = ''; - // add your code here - return result; -} - -console.log('for', repeatStringNumTimesWithFor('abc', 3)); - -// use a 'while' loop -function repeatStringNumTimesWithWhile(str, num) { - let result = ''; - // add your code here - return result; -} - -console.log('while', repeatStringNumTimesWithWhile('abc', 3)); - -// use a 'do...while' loop -function repeatStringNumTimesWithDoWhile(str, num) { - let result = ''; - // add your code here - return result; -} - -console.log('do-while', repeatStringNumTimesWithDoWhile('abc', 3)); - -// Do not change or remove the next lines -module.exports = { - repeatStringNumTimesWithFor, - repeatStringNumTimesWithWhile, - repeatStringNumTimesWithDoWhile -}; diff --git a/Week3/homework/step2-1.js b/Week3/homework/step2-1.js new file mode 100644 index 000000000..d5699882c --- /dev/null +++ b/Week3/homework/step2-1.js @@ -0,0 +1,16 @@ +'use strict'; + +function foo(func) { + // What to do here? + // Replace this comment and the next line with your code + console.log(func); +} + +function bar() { + console.log('Hello, I am bar!'); +} + +foo(bar); + +// Do not change or remove anything below this line +module.exports = foo; diff --git a/Week3/homework/step2-2.js b/Week3/homework/step2-2.js new file mode 100644 index 000000000..dcd135040 --- /dev/null +++ b/Week3/homework/step2-2.js @@ -0,0 +1,23 @@ +'use strict'; + +function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { + const numbers = []; + + // Replace this comment and the next line with your code + console.log(startIndex, stopIndex, threeCallback, fiveCallback, numbers); +} + +function sayThree(number) { + // Replace this comment and the next line with your code + console.log(number); +} + +function sayFive(number) { + // Replace this comment and the next line with your code + console.log(number); +} + +threeFive(10, 15, sayThree, sayFive); + +// Do not change or remove anything below this line +module.exports = threeFive; diff --git a/Week3/homework-solutions/3-step3.js b/Week3/homework/step2-3.js similarity index 55% rename from Week3/homework-solutions/3-step3.js rename to Week3/homework/step2-3.js index 9ad0dc5b9..5278d64f4 100644 --- a/Week3/homework-solutions/3-step3.js +++ b/Week3/homework/step2-3.js @@ -1,48 +1,45 @@ 'use strict'; -// use a 'for' loop +// Use a 'for' loop function repeatStringNumTimesWithFor(str, num) { + // eslint-disable-next-line let result = ''; - for (let i = 0; i < num; i++) { - result += str; - } + + // Replace this comment and the next line with your code + console.log(str, num, result); + return result; } - console.log('for', repeatStringNumTimesWithFor('abc', 3)); -// use a 'while' loop +// Use a 'while' loop function repeatStringNumTimesWithWhile(str, num) { + // eslint-disable-next-line let result = ''; - let i = 0; - while (i < num) { - result += str; - i++; - } + + // Replace this comment and the next line with your code + console.log(str, num, result); + return result; } - console.log('while', repeatStringNumTimesWithWhile('abc', 3)); -// use a 'do...while' loop +// Use a 'do...while' loop function repeatStringNumTimesWithDoWhile(str, num) { + // eslint-disable-next-line let result = ''; - if (num > 0) { - let i = 0; - do { - result += str; - i++; - } while (i < num); - } + + // Replace this comment and the next line with your code + console.log(str, num, result); + return result; } - console.log('do-while', repeatStringNumTimesWithDoWhile('abc', 3)); -// Do not change or remove the next lines +// Do not change or remove anything below this line module.exports = { repeatStringNumTimesWithFor, repeatStringNumTimesWithWhile, diff --git a/Week3/homework/4-step3.js b/Week3/homework/step2-4.js similarity index 55% rename from Week3/homework/4-step3.js rename to Week3/homework/step2-4.js index 2c1e64c90..b11b1dcb6 100644 --- a/Week3/homework/4-step3.js +++ b/Week3/homework/step2-4.js @@ -1,5 +1,4 @@ 'use strict'; -// paste your freeCodeCamp solutions in here function Dog() { // add your code here @@ -7,5 +6,5 @@ function Dog() { const hound = new Dog(); -// Do not change or remove the next line +// Do not change or remove anything below this line module.exports = hound; diff --git a/Week3/homework/5-step3.js b/Week3/homework/step2-5.js similarity index 53% rename from Week3/homework/5-step3.js rename to Week3/homework/step2-5.js index 5fadcffb3..cbb54fa1d 100644 --- a/Week3/homework/5-step3.js +++ b/Week3/homework/step2-5.js @@ -1,13 +1,17 @@ 'use strict'; function multiplyAll(arr) { + // eslint-disable-next-line let product = 1; - // add your code here + + // Replace this comment and the next line with your code + console.log(arr, product); + return product; } const result = multiplyAll([[1, 2], [3, 4], [5, 6]]); console.log(result); // 720 -// Do not change or remove the next line +// Do not change or remove anything below this line module.exports = multiplyAll; diff --git a/Week3/homework/6-step3.js b/Week3/homework/step2-6.js similarity index 56% rename from Week3/homework/6-step3.js rename to Week3/homework/step2-6.js index a7e8b24eb..76e458e4c 100644 --- a/Week3/homework/6-step3.js +++ b/Week3/homework/step2-6.js @@ -4,19 +4,20 @@ const arr2d = [[1, 2], [3, 4], [5, 6]]; const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; function printArray2d(arr) { - // add your code here + // Replace this comment and the next line with your code + console.log(arr); } function printArray3d(arr) { - // add your code here + // Replace this comment and the next line with your code + console.log(arr); } printArray2d(arr2d); printArray3d(arr3d); -// Do not change or remove the next lines +// Do not change or remove anything below this line module.exports = { printArray2d, printArray3d }; - diff --git a/Week3/homework/7-step3.js b/Week3/homework/step2-7.js similarity index 99% rename from Week3/homework/7-step3.js rename to Week3/homework/step2-7.js index 24094063c..3e72e8551 100644 --- a/Week3/homework/7-step3.js +++ b/Week3/homework/step2-7.js @@ -10,7 +10,6 @@ f1(x); console.log(x); - const y = { x: 9 }; function f2(val) { val.x = val.x + 1; diff --git a/Week3/homework/step4-bonus.js b/Week3/homework/step3-bonus.js similarity index 60% rename from Week3/homework/step4-bonus.js rename to Week3/homework/step3-bonus.js index ed7657cf1..917091d61 100644 --- a/Week3/homework/step4-bonus.js +++ b/Week3/homework/step3-bonus.js @@ -3,11 +3,12 @@ const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; function makeUnique(arr) { - // add your code here + // Replace this comment and the next line with your code + console.log(arr); } const uniqueValues = makeUnique(values); console.log(uniqueValues); -// Do not change or remove the next line +// Do not change or remove anything below this line module.exports = makeUnique; diff --git a/Week3/homework/step4.js b/Week3/homework/step3.js similarity index 58% rename from Week3/homework/step4.js rename to Week3/homework/step3.js index 2bf11c0d1..292724bf4 100644 --- a/Week3/homework/step4.js +++ b/Week3/homework/step3.js @@ -1,7 +1,8 @@ 'use strict'; function createBase(base) { - // add your code here + // Replace this comment and the next line with your code + console.log(base); } const addSix = createBase(6); @@ -9,5 +10,5 @@ const addSix = createBase(6); console.log(addSix(10)); // returns 16 console.log(addSix(21)); // returns 27 -// Do not change or remove the next line +// Do not change or remove anything below this line module.exports = createBase; diff --git a/Week3/test/1-step3.test.js b/Week3/test/step2-1.test.js similarity index 54% rename from Week3/test/1-step3.test.js rename to Week3/test/step2-1.test.js index 8b39f9bf3..9f6b29c10 100644 --- a/Week3/test/1-step3.test.js +++ b/Week3/test/step2-1.test.js @@ -1,5 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const foo = require(`../${HOMEWORK_FOLDER}/1-step3`); +const foo = require('../homework/step2-1'); const mockFn = jest.fn(() => undefined); diff --git a/Week3/test/2-step3.test.js b/Week3/test/step2-2.test.js similarity index 80% rename from Week3/test/2-step3.test.js rename to Week3/test/step2-2.test.js index 1794a8763..71cd7f424 100644 --- a/Week3/test/2-step3.test.js +++ b/Week3/test/step2-2.test.js @@ -1,5 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const threeFive = require(`../${HOMEWORK_FOLDER}/2-step3`); +const threeFive = require('../homework/step2-2'); const mockSayThree = jest.fn(() => undefined); const mockSayFive = jest.fn(() => undefined); diff --git a/Week3/test/3-step3.test.js b/Week3/test/step2-3.test.js similarity index 90% rename from Week3/test/3-step3.test.js rename to Week3/test/step2-3.test.js index 0d4596171..11d29b16c 100644 --- a/Week3/test/3-step3.test.js +++ b/Week3/test/step2-3.test.js @@ -1,9 +1,8 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); const { repeatStringNumTimesWithFor, repeatStringNumTimesWithWhile, repeatStringNumTimesWithDoWhile -} = require(`../${HOMEWORK_FOLDER}/3-step3`); +} = require('../homework/step2-3'); describe('1-step3.js', () => { test('for-loop', () => { diff --git a/Week3/test/4-step3.test.js b/Week3/test/step2-4.test.js similarity index 64% rename from Week3/test/4-step3.test.js rename to Week3/test/step2-4.test.js index 54af44b9b..924564383 100644 --- a/Week3/test/4-step3.test.js +++ b/Week3/test/step2-4.test.js @@ -1,5 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const hound = require(`../${HOMEWORK_FOLDER}/4-step3`); +const hound = require('../homework/step2-4'); test('4-step3', () => { expect(typeof hound).toBe('object'); diff --git a/Week3/test/5-step3.test.js b/Week3/test/step2-5.test.js similarity index 50% rename from Week3/test/5-step3.test.js rename to Week3/test/step2-5.test.js index 74db828da..e87138099 100644 --- a/Week3/test/5-step3.test.js +++ b/Week3/test/step2-5.test.js @@ -1,5 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const multiplyAll = require(`../${HOMEWORK_FOLDER}/5-step3`); +const multiplyAll = require('../homework/step2-5'); test('5-step3.js', () => { const result = multiplyAll([[1, 2], [3, 4], [5, 6, 7]]); diff --git a/Week3/test/6-step3.test.js b/Week3/test/step2-6.test.js similarity index 81% rename from Week3/test/6-step3.test.js rename to Week3/test/step2-6.test.js index 9d90771ef..ee742d527 100644 --- a/Week3/test/6-step3.test.js +++ b/Week3/test/step2-6.test.js @@ -1,8 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const { - printArray2d, - printArray3d -} = require(`../${HOMEWORK_FOLDER}/6-step3`); +const { printArray2d, printArray3d } = require('../homework/step2-6'); const arr2d = [[1, 2], [3, 4], [5, 6]]; const expected2d = [1, 2, 3, 4, 5, 6].join(''); @@ -10,7 +6,6 @@ const expected2d = [1, 2, 3, 4, 5, 6].join(''); const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; const expected3d = [1, 2, 3, 4, 5, 6, 7, 8].join(''); - describe('6-step3.js', () => { let outputData; const storeLog = (...inputs) => (outputData += inputs.join(' ')); @@ -29,4 +24,3 @@ describe('6-step3.js', () => { expect(outputData).toBe(expected3d); }); }); - diff --git a/Week3/test/step4-bonus.test.js b/Week3/test/step3-bonus.test.js similarity index 63% rename from Week3/test/step4-bonus.test.js rename to Week3/test/step3-bonus.test.js index 9a2edf31b..a53764e06 100644 --- a/Week3/test/step4-bonus.test.js +++ b/Week3/test/step3-bonus.test.js @@ -1,5 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const makeUnique = require(`../${HOMEWORK_FOLDER}/step4-bonus`); +const makeUnique = require(`../homework/step3-bonus`); test('step4-bonus', () => { const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; diff --git a/Week3/test/step4.test.js b/Week3/test/step3.test.js similarity index 50% rename from Week3/test/step4.test.js rename to Week3/test/step3.test.js index 33d4fa3de..5bdb657ef 100644 --- a/Week3/test/step4.test.js +++ b/Week3/test/step3.test.js @@ -1,5 +1,4 @@ -const { HOMEWORK_FOLDER } = require('../../test-config'); -const createBase = require(`../${HOMEWORK_FOLDER}/step4`); +const createBase = require(`../homework/step3`); test('step4.js', () => { const addSix = createBase(6); diff --git a/package-lock.json b/package-lock.json index dc753b21c..e89e9916d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,14 +22,6 @@ "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } } }, "abab": { @@ -39,9 +31,9 @@ "dev": true }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", "dev": true }, "acorn-globals": { @@ -52,53 +44,42 @@ "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz", - "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==", - "dev": true - } } }, "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true }, "acorn-walk": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", - "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", "dev": true }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-escapes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { @@ -161,6 +142,15 @@ } } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -393,6 +383,12 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -414,6 +410,16 @@ "sprintf-js": "~1.0.2" } }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -437,25 +443,20 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -489,6 +490,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -534,6 +541,15 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -545,6 +561,12 @@ "js-tokens": "^3.0.2" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -564,6 +586,12 @@ "supports-color": "^2.0.0" } }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -606,6 +634,23 @@ "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-generator": { @@ -740,6 +785,29 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-types": { @@ -931,20 +999,12 @@ "dev": true, "requires": { "callsites": "^0.2.0" - }, - "dependencies": { - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - } } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, "camelcase": { @@ -1102,8 +1162,7 @@ "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true + "dev": true }, "component-emitter": { "version": "1.2.1", @@ -1117,6 +1176,12 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -1133,9 +1198,9 @@ "dev": true }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==", "dev": true }, "core-util-is": { @@ -1145,12 +1210,14 @@ "dev": true }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } @@ -1170,6 +1237,12 @@ "cssom": "0.3.x" } }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1180,13 +1253,13 @@ } }, "data-urls": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", - "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { "abab": "^2.0.0", - "whatwg-mimetype": "^2.1.0", + "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" }, "dependencies": { @@ -1204,12 +1277,12 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -1301,21 +1374,6 @@ } } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1371,6 +1429,12 @@ "safer-buffer": "^2.1.0" } }, + "emoji-regex": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1439,9 +1503,9 @@ } }, "eslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", - "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.10.0.tgz", + "integrity": "sha512-HpqzC+BHULKlnPwWae9MaVZ5AXJKpkxCVXQHrFaRw3hbDj26V/9ArYM4Rr/SQ8pi6qUPLXSSXC4RBJlyq2Z2OQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1453,7 +1517,7 @@ "eslint-scope": "^4.0.0", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", @@ -1463,7 +1527,6 @@ "ignore": "^4.0.6", "imurmurhash": "^0.1.4", "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", @@ -1482,72 +1545,293 @@ "strip-json-comments": "^2.0.1", "table": "^5.0.2", "text-table": "^0.2.0" + } + }, + "eslint-config-airbnb": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz", + "integrity": "sha512-R9jw28hFfEQnpPau01NO5K/JWMGLi6aymiF6RsnMURjTk+MqZKllCqGK/0tOvHkPi/NWSSOU2Ced/GX++YxLnw==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^13.1.0", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, + "eslint-config-airbnb-base": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz", + "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==", + "dev": true, + "requires": { + "eslint-restricted-globals": "^0.1.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, + "eslint-config-prettier": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.3.0.tgz", + "integrity": "sha512-Bc3bh5bAcKNvs3HOpSi6EfGA2IIp7EzWcg2tS4vP7stnXu/J1opihHDM7jI9JCIckyIDTgZLSWn7J3HY0j2JfA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" }, "dependencies": { - "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ms": "2.0.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-parse": "^1.0.6" } - }, + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + }, + "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, - "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true } } }, "eslint-plugin-jest": { - "version": "21.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.26.0.tgz", - "integrity": "sha512-zYePgbZaJsTfiJMb6XcsrrqgDpUB40AmGjjlwMZPEgVstrAsDNW8z7qQggD1lC24yR9h9VxTTb8qu6HRq3n6eg==", + "version": "21.27.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.27.2.tgz", + "integrity": "sha512-0E4OIgBJVlAmf1KfYFtZ3gYxgUzC5Eb3Jzmrc9ikI1OY+/cM8Kh72Ti7KfpeHNeD3HJNf9SmEfmvQLIz44Hrhw==", + "dev": true + }, + "eslint-plugin-jsx-a11y": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz", + "integrity": "sha512-7gSSmwb3A+fQwtw0arguwMdOdzmKUgnUcbSNlo+GjKLAQFuC2EZxWqG9XHRI8VscBJD5a8raz3RuxQNFW+XJbw==", + "dev": true, + "requires": { + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.1", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^6.5.1", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1" + } + }, + "eslint-plugin-prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", + "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.2.tgz", + "integrity": "sha512-6F8uOJXOsWWWD3Mg8cvz4onsqEYp2LFZCFlgjaTAzbPLwqdwRCeK78unbuEaMXYPxq8paXCzTpoaDCwXBvC/gg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "object.fromentries": "^2.0.0", + "prop-types": "^15.6.2", + "resolve": "^1.9.0" + }, + "dependencies": { + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", "dev": true }, "eslint-scope": { @@ -1573,13 +1857,14 @@ "dev": true }, "espree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", - "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "dev": true, "requires": { - "acorn": "^5.6.0", - "acorn-jsx": "^4.1.1" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -1640,6 +1925,19 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } } }, "exit": { @@ -1659,7 +1957,7 @@ }, "expand-range": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { @@ -1734,9 +2032,15 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, "fast-json-stable-stringify": { @@ -1818,14 +2122,14 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -2423,6 +2727,12 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -2478,29 +2788,15 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "growly": { @@ -2536,12 +2832,12 @@ "dev": true }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, @@ -2561,6 +2857,14 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-flag": { @@ -2719,9 +3023,9 @@ "dev": true }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -2735,8 +3039,25 @@ "run-async": "^2.2.0", "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } } }, "invariant": { @@ -2899,30 +3220,6 @@ "kind-of": "^3.0.2" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2967,12 +3264,6 @@ "has": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3132,12 +3423,6 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, @@ -3513,6 +3798,12 @@ "source-map": "^0.6.0" }, "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3554,9 +3845,9 @@ } }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { @@ -3607,11 +3898,19 @@ "whatwg-url": "^6.4.1", "ws": "^5.2.0", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } } }, "jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, @@ -3622,9 +3921,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -3657,6 +3956,15 @@ "verror": "1.10.0" } }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3748,9 +4056,9 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -3797,9 +4105,9 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, "merge-stream": { @@ -3899,9 +4207,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "mute-stream": { @@ -4085,6 +4393,42 @@ } } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", + "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -4148,6 +4492,14 @@ "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } } }, "optionator": { @@ -4162,19 +4514,11 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -4191,7 +4535,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -4266,7 +4610,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -4365,6 +4709,21 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz", + "integrity": "sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-format": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", @@ -4373,14 +4732,6 @@ "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } } }, "private": { @@ -4396,9 +4747,9 @@ "dev": true }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "prompts": { @@ -4411,6 +4762,16 @@ "sisteransi": "^0.1.1" } }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -4418,9 +4779,9 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, "punycode": { @@ -4610,6 +4971,24 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } } }, "request-promise-core": { @@ -4646,25 +5025,17 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } } }, "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, @@ -4675,12 +5046,20 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, "resolve-url": { @@ -4746,7 +5125,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -4817,6 +5196,15 @@ } } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -5055,6 +5443,12 @@ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -5139,11 +5533,13 @@ "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", + "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -5163,6 +5559,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -5180,6 +5585,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -5290,9 +5701,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -5316,9 +5727,9 @@ } }, "spdx-license-ids": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", "dev": true }, "split-string": { @@ -5332,14 +5743,14 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", - "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -5354,9 +5765,9 @@ } }, "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, "static-extend": { @@ -5408,7 +5819,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -5422,14 +5833,6 @@ "dev": true, "requires": { "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } } }, "strip-bom": { @@ -5443,7 +5846,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -5469,41 +5872,15 @@ "dev": true }, "table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz", + "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==", "dev": true, "requires": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "2.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "test-exclude": { @@ -5601,21 +5978,13 @@ } }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { @@ -5880,9 +6249,9 @@ } }, "whatwg-mimetype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", - "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { @@ -5912,9 +6281,9 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { @@ -5927,6 +6296,12 @@ "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", diff --git a/package.json b/package.json index 494fd6583..87d91d54a 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,21 @@ "description": "HYF JavaScript2 module", "main": "index.js", "scripts": { - "test2": "jest Week2/", - "test3": "jest Week3/" + "lint": "eslint **/homework", + "test": "npm run lint", + "test-week1": "eslint Week1/homework", + "test-week2": "eslint Week2/homework && jest Week2", + "test-week3": "eslint Week3/homework && jest Week3", + "test-maartjes-work": "jest maartjes-work", + "test-map-filter": "jest map-filter", + "test-step2-1": "jest step2-1", + "test-step2-2": "jest step2-2", + "test-step2-3": "jest step2-3", + "test-step2-4": "jest step2-4", + "test-step2-5": "jest step2-5", + "test-step2-6": "jest step2-6", + "test-step3": "jest step3", + "test-step3-bonus": "jest step3-bonus" }, "repository": { "type": "git", @@ -18,8 +31,16 @@ }, "homepage": "https://github.com/HackYourFuture/JavaScript2#readme", "devDependencies": { - "eslint": "^5.7.0", + "eslint": "^5.9.0", + "eslint-config-airbnb-base": "^13.1.0", + "eslint-config-airbnb": "^17.1.0", + "eslint-config-prettier": "^3.3.0", + "eslint-plugin-import": "^2.14.0", "eslint-plugin-jest": "^21.26.0", - "jest": "^23.6.0" + "eslint-plugin-jsx-a11y": "^6.1.2", + "eslint-plugin-prettier": "^3.0.0", + "eslint-plugin-react": "^7.11.1", + "jest": "^23.6.0", + "prettier": "^1.15.2" } -} \ No newline at end of file +} diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 000000000..1400fac1d --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,9 @@ +module.exports = { + printWidth: 100, + singleQuote: true, + trailingComma: 'none', + bracketSpacing: true, + jsxBracketSameLine: false, + tabWidth: 2, + semi: true +}; diff --git a/test-config.js b/test-config.js deleted file mode 100644 index a47aa6cbf..000000000 --- a/test-config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - HOMEWORK_FOLDER: 'homework-solutions' -}; From bc1b0f7611715a82ecfd8ac25d80eabe40fb236d Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Fri, 4 Jan 2019 19:05:22 +0100 Subject: [PATCH 04/98] add travis --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..5e1bae462 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - '10' + +script: + - npm run lint From aa0ef2f58e751ddb83795a760643d289b46c79df Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Fri, 4 Jan 2019 20:00:34 +0100 Subject: [PATCH 05/98] Add Prettier extension --- Week1/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Week1/README.md b/Week1/README.md index 837b24c19..f7617fad6 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -20,6 +20,7 @@ In week one we will discuss the following topics: - Code Spell Checker - ESLint + - Prettier - Code formatter - open in browser - Live Server - Bracket Pair Colorizer From d0eeb074591fcb46f899297b0cb1374dd98e179c Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Sat, 5 Jan 2019 13:48:55 +0100 Subject: [PATCH 06/98] Ease up on some ESLint rules --- .eslintrc.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 83e420291..0f5eaafc0 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,11 +9,16 @@ "prettier/prettier": ["error"], "strict": "off", "func-names": "off", + "import/no-dynamic-require": "off", "no-console": "off", + "no-param-reassign": "off", "no-plusplus": "off", - "trailing-comma": "off", + "no-restricted-syntax": "off", + "object-shorthand": "off", "operator-assignment": "off", - "no-param-reassign": "off", - "import/no-dynamic-require": "off" + "prefer-arrow-callback": "off", + "prefer-destructuring": "off", + "prefer-template": "off", + "trailing-comma": "off" } } From 5854a72aafe0c3fade8ce1042370d0d0b293d620 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Wed, 9 Jan 2019 10:48:32 +0100 Subject: [PATCH 07/98] Turn off ESLint linebreak-style for the benefit of Windows users --- .eslintrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index 0f5eaafc0..e1cb8994c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,6 +19,7 @@ "prefer-arrow-callback": "off", "prefer-destructuring": "off", "prefer-template": "off", - "trailing-comma": "off" + "trailing-comma": "off", + "linebreak-style": "off" } } From a9dad81a7389136c8e0aa9419f56b7b4fd0f181f Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Tue, 15 Jan 2019 10:30:37 +0100 Subject: [PATCH 08/98] Fixed typo --- Week2/MAKEME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index d6cda53b3..0169b7920 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -135,7 +135,7 @@ Time: 1.255s Ran all test suites matching /Week2\//i. ``` -If that's the case, try and fix the error. When done, run the tests again: `npm run test2` +If that's the case, try and fix the error. When done, run the tests again: `npm run test-week2` Repeat the previous step until all (= 2 in this case) tests pass. From e53a7e8f97ea80ffea40b5237c608f2347623dfa Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Fri, 25 Jan 2019 12:15:55 +0100 Subject: [PATCH 09/98] Updates README to include required User Settings --- Week1/README.md | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Week1/README.md b/Week1/README.md index f7617fad6..a2f5bbd59 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -25,17 +25,42 @@ In week one we will discuss the following topics: - Live Server - Bracket Pair Colorizer -2. Install the ESLint tool globally by issuing the following command from the command line: +2. Modify the VSCode User Settings to include the settings listed below. If a particular setting is already present in your User Settings, make sure that the setting value listed below is used and change it if necessary. + + To open your user and workspace settings, use the following VS Code menu command: + + - On Windows/Linux - **File** > **Preferences** > **Settings** + - On macOS - **Code** > **Preferences** > **Settings** + + Then, click on the `{ }` button in the top-right corner of the settings screen to access the settings in JSON format. + + ```json + /// Place your settings in this file to overwrite the default settings + { + "editor.detectIndentation": false, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "editor.minimap.enabled": false, + "editor.renderIndentGuides": true, + "editor.tabSize": 2, + "files.autoSave": "onFocusChange", + "prettier.printWidth": 100, + "prettier.singleQuote": true, + "prettier.trailingComma": "es5" + } + ``` + +3. Install the ESLint CLI tool globally by issuing the following command from the command line: ``` - npm install -g eslint + npm install -g eslint-cli ``` -3. Fork this repository (i.e., **JavaScript2**) and clone your fork to your laptop. +4. Fork this repository (i.e., **JavaScript2**) and clone your fork to your laptop. -4. Open the `JavaScript2` folder from the cloned repository in VSCode. +5. Open the `JavaScript2` folder from the cloned repository in VSCode. -5. Open a terminal window in VSCode and type the following command: +6. Open a terminal window in VSCode and type the following command: ``` npm install From 499d75798eb172e0fcbd4fa1f333a9aebec282c5 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Fri, 25 Jan 2019 12:16:10 +0100 Subject: [PATCH 10/98] Improves unit tests --- Week2/test/maartjes-work.test.js | 10 +++--- Week2/test/map-filter.test.js | 8 +++-- Week3/test/step2-1.test.js | 8 +++-- Week3/test/step2-2.test.js | 22 +++++++----- Week3/test/step2-3.test.js | 57 ++++++++++++++++++++++++-------- Week3/test/step2-4.test.js | 21 +++++++++--- Week3/test/step2-5.test.js | 8 +++-- Week3/test/step2-6.test.js | 7 ++-- Week3/test/step3-bonus.test.js | 12 ++++--- Week3/test/step3.test.js | 16 ++++++--- 10 files changed, 118 insertions(+), 51 deletions(-) diff --git a/Week2/test/maartjes-work.test.js b/Week2/test/maartjes-work.test.js index 59225a53a..ab6bc2a44 100644 --- a/Week2/test/maartjes-work.test.js +++ b/Week2/test/maartjes-work.test.js @@ -1,7 +1,9 @@ const { maartjesTasks, maartjesHourlyRate, computeEarnings } = require(`../homework/maartjes-work`); -test('maartjes_work.js', () => { - const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); - const result = earnings.toFixed(2); - expect(result).toBe('373.33'); +describe('maartjes_work', () => { + test('earnings rounded to euro cents', () => { + const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); + const result = earnings.toFixed(2); + expect(result).toBe('373.33'); + }); }); diff --git a/Week2/test/map-filter.test.js b/Week2/test/map-filter.test.js index a3f613a8b..e4cb83906 100644 --- a/Week2/test/map-filter.test.js +++ b/Week2/test/map-filter.test.js @@ -1,6 +1,8 @@ const { myNumbers, doubleOddNumbers } = require(`../homework/map-filter`); -test('map_filter.js', () => { - const result = doubleOddNumbers(myNumbers); - expect(result).toEqual([2, 6]); +describe('map_filter', () => { + test('result -> [2, 6]', () => { + const result = doubleOddNumbers(myNumbers); + expect(result).toEqual([2, 6]); + }); }); diff --git a/Week3/test/step2-1.test.js b/Week3/test/step2-1.test.js index 9f6b29c10..070706181 100644 --- a/Week3/test/step2-1.test.js +++ b/Week3/test/step2-1.test.js @@ -2,7 +2,9 @@ const foo = require('../homework/step2-1'); const mockFn = jest.fn(() => undefined); -test('1-step3.js', () => { - foo(mockFn); - expect(mockFn.mock.calls.length).toBe(1); +describe('step2-1', () => { + test('foo calls func', () => { + foo(mockFn); + expect(mockFn.mock.calls.length).toBe(1); + }); }); diff --git a/Week3/test/step2-2.test.js b/Week3/test/step2-2.test.js index 71cd7f424..8e0be47cc 100644 --- a/Week3/test/step2-2.test.js +++ b/Week3/test/step2-2.test.js @@ -3,14 +3,20 @@ const threeFive = require('../homework/step2-2'); const mockSayThree = jest.fn(() => undefined); const mockSayFive = jest.fn(() => undefined); -test('2-step3.js', () => { - threeFive(10, 15, mockSayThree, mockSayFive); +describe('step2-2', () => { + test('12 and 15 divisible by 3', () => { + threeFive(10, 15, mockSayThree, () => undefined); - expect(mockSayThree.mock.calls.length).toBe(2); - expect(mockSayThree.mock.calls[0][0]).toBe(12); - expect(mockSayThree.mock.calls[1][0]).toBe(15); + expect(mockSayThree.mock.calls.length).toBe(2); + expect(mockSayThree.mock.calls[0][0]).toBe(12); + expect(mockSayThree.mock.calls[1][0]).toBe(15); + }); - expect(mockSayFive.mock.calls.length).toBe(2); - expect(mockSayFive.mock.calls[0][0]).toBe(10); - expect(mockSayFive.mock.calls[1][0]).toBe(15); + test('10 and 15 divisible by 5', () => { + threeFive(10, 15, () => undefined, mockSayFive); + + expect(mockSayFive.mock.calls.length).toBe(2); + expect(mockSayFive.mock.calls[0][0]).toBe(10); + expect(mockSayFive.mock.calls[1][0]).toBe(15); + }); }); diff --git a/Week3/test/step2-3.test.js b/Week3/test/step2-3.test.js index 11d29b16c..387562660 100644 --- a/Week3/test/step2-3.test.js +++ b/Week3/test/step2-3.test.js @@ -4,37 +4,68 @@ const { repeatStringNumTimesWithDoWhile } = require('../homework/step2-3'); -describe('1-step3.js', () => { - test('for-loop', () => { - let result = repeatStringNumTimesWithFor('abc', 3); +describe('step2-3 with for-loop', () => { + test('num = 3', () => { + const result = repeatStringNumTimesWithFor('abc', 3); expect(result).toBe('abcabcabc'); + }); - result = repeatStringNumTimesWithFor('abc', 1); + test('num = 1', () => { + const result = repeatStringNumTimesWithFor('abc', 1); expect(result).toBe('abc'); + }); - result = repeatStringNumTimesWithFor('abc', -2); + test('num = -2', () => { + const result = repeatStringNumTimesWithFor('abc', -2); expect(result).toBe(''); }); - test('while-loop', () => { - let result = repeatStringNumTimesWithWhile('abc', 3); + test('num = 0', () => { + const result = repeatStringNumTimesWithFor('abc', 0); + expect(result).toBe(''); + }); +}); + +describe('step2-3 with while-loop', () => { + test('num = 3', () => { + const result = repeatStringNumTimesWithWhile('abc', 3); expect(result).toBe('abcabcabc'); + }); - result = repeatStringNumTimesWithFor('abc', 1); + test('num = 1', () => { + const result = repeatStringNumTimesWithWhile('abc', 1); expect(result).toBe('abc'); + }); - result = repeatStringNumTimesWithFor('abc', -2); + test('num = 0', () => { + const result = repeatStringNumTimesWithWhile('abc', 0); expect(result).toBe(''); }); - test('do-while-loop', () => { - let result = repeatStringNumTimesWithDoWhile('abc', 3); + test('num = -2', () => { + const result = repeatStringNumTimesWithWhile('abc', -2); + expect(result).toBe(''); + }); +}); + +describe('step2-3 with do-while-loop', () => { + test('num = 3', () => { + const result = repeatStringNumTimesWithDoWhile('abc', 3); expect(result).toBe('abcabcabc'); + }); - result = repeatStringNumTimesWithFor('abc', 1); + test('num = 1', () => { + const result = repeatStringNumTimesWithDoWhile('abc', 1); expect(result).toBe('abc'); + }); + + test('num = 0', () => { + const result = repeatStringNumTimesWithDoWhile('abc', 0); + expect(result).toBe(''); + }); - result = repeatStringNumTimesWithFor('abc', -2); + test('num = -2', () => { + const result = repeatStringNumTimesWithDoWhile('abc', -2); expect(result).toBe(''); }); }); diff --git a/Week3/test/step2-4.test.js b/Week3/test/step2-4.test.js index 924564383..af21ca4cf 100644 --- a/Week3/test/step2-4.test.js +++ b/Week3/test/step2-4.test.js @@ -1,8 +1,19 @@ const hound = require('../homework/step2-4'); -test('4-step3', () => { - expect(typeof hound).toBe('object'); - expect(typeof hound.name).toBe('string'); - expect(typeof hound.color).toBe('string'); - expect(typeof hound.numLegs).toBe('number'); +describe('step2-4', () => { + test('hound to be an object', () => { + expect(typeof hound).toBe('object'); + }); + + test('hound.name to be a string', () => { + expect(typeof hound.name).toBe('string'); + }); + + test('hound.color to be a string', () => { + expect(typeof hound.color).toBe('string'); + }); + + test('hound.numLegs to be a number', () => { + expect(typeof hound.numLegs).toBe('number'); + }); }); diff --git a/Week3/test/step2-5.test.js b/Week3/test/step2-5.test.js index e87138099..19c770412 100644 --- a/Week3/test/step2-5.test.js +++ b/Week3/test/step2-5.test.js @@ -1,6 +1,8 @@ const multiplyAll = require('../homework/step2-5'); -test('5-step3.js', () => { - const result = multiplyAll([[1, 2], [3, 4], [5, 6, 7]]); - expect(result).toBe(5040); +describe('step2-5', () => { + test('result to be product of array elements', () => { + const result = multiplyAll([[1, 2], [3, 4], [5, 6, 7]]); + expect(result).toBe(5040); + }); }); diff --git a/Week3/test/step2-6.test.js b/Week3/test/step2-6.test.js index ee742d527..c2ccd55d8 100644 --- a/Week3/test/step2-6.test.js +++ b/Week3/test/step2-6.test.js @@ -1,3 +1,4 @@ +/* eslint-disable no-return-assign, dot-notation */ const { printArray2d, printArray3d } = require('../homework/step2-6'); const arr2d = [[1, 2], [3, 4], [5, 6]]; @@ -6,18 +7,18 @@ const expected2d = [1, 2, 3, 4, 5, 6].join(''); const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; const expected3d = [1, 2, 3, 4, 5, 6, 7, 8].join(''); -describe('6-step3.js', () => { +describe('step2-6', () => { let outputData; const storeLog = (...inputs) => (outputData += inputs.join(' ')); - test('printArray2d', () => { + test('printArray2d -> 1, 2, 3, 4, 5, 6', () => { outputData = ''; console['log'] = jest.fn(storeLog); printArray2d(arr2d); expect(outputData).toBe(expected2d); }); - test('printArray2d', () => { + test('printArray3d -> 1, 2, 3, 4, 5, 6, 7, 8', () => { outputData = ''; console['log'] = jest.fn(storeLog); printArray3d(arr3d); diff --git a/Week3/test/step3-bonus.test.js b/Week3/test/step3-bonus.test.js index a53764e06..4fdfb0111 100644 --- a/Week3/test/step3-bonus.test.js +++ b/Week3/test/step3-bonus.test.js @@ -1,8 +1,10 @@ const makeUnique = require(`../homework/step3-bonus`); -test('step4-bonus', () => { - const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; - const expected = ['a', 'b', 'c', 'd', 'e', 'f']; - const result = makeUnique(values); - expect(result).toEqual(expected); +describe('step3-bonus', () => { + test('array should not contain duplicates', () => { + const values = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c']; + const expected = ['a', 'b', 'c', 'd', 'e', 'f']; + const result = makeUnique(values); + expect(result).toEqual(expected); + }); }); diff --git a/Week3/test/step3.test.js b/Week3/test/step3.test.js index 5bdb657ef..c75f489c2 100644 --- a/Week3/test/step3.test.js +++ b/Week3/test/step3.test.js @@ -1,7 +1,15 @@ const createBase = require(`../homework/step3`); -test('step4.js', () => { - const addSix = createBase(6); - const result = addSix(10); - expect(result).toBe(16); +describe('step3', () => { + test('base = 6', () => { + const addSix = createBase(6); + const result = addSix(10); + expect(result).toBe(16); + }); + + test('base = 10', () => { + const addTen = createBase(10); + const result = addTen(10); + expect(result).toBe(20); + }); }); From 8bdc83bdc5f0747fe95f1a6c7a2724c0841a49cd Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Fri, 25 Jan 2019 16:45:53 +0100 Subject: [PATCH 11/98] Fix npm run lint for Window users --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87d91d54a..1f7571946 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "HYF JavaScript2 module", "main": "index.js", "scripts": { - "lint": "eslint **/homework", + "lint": "eslint \"**/homework/**/*.js\"", "test": "npm run lint", "test-week1": "eslint Week1/homework", "test-week2": "eslint Week2/homework && jest Week2", From 102d8a93a8f7ba70524bc3c72d4e4169aad03bdb Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Sat, 26 Jan 2019 18:15:54 +0100 Subject: [PATCH 12/98] Fix ESLint directives --- Week3/homework/step2-3.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Week3/homework/step2-3.js b/Week3/homework/step2-3.js index 5278d64f4..739938dfb 100644 --- a/Week3/homework/step2-3.js +++ b/Week3/homework/step2-3.js @@ -2,7 +2,7 @@ // Use a 'for' loop function repeatStringNumTimesWithFor(str, num) { - // eslint-disable-next-line + // eslint-disable-next-line prefer-const let result = ''; // Replace this comment and the next line with your code @@ -15,7 +15,7 @@ console.log('for', repeatStringNumTimesWithFor('abc', 3)); // Use a 'while' loop function repeatStringNumTimesWithWhile(str, num) { - // eslint-disable-next-line + // eslint-disable-next-line prefer-const let result = ''; // Replace this comment and the next line with your code @@ -28,7 +28,7 @@ console.log('while', repeatStringNumTimesWithWhile('abc', 3)); // Use a 'do...while' loop function repeatStringNumTimesWithDoWhile(str, num) { - // eslint-disable-next-line + // eslint-disable-next-line prefer-const let result = ''; // Replace this comment and the next line with your code From 92d734b4c3f2713df12d3ce01cfbf8ff0d9272bc Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Sat, 26 Jan 2019 18:44:56 +0100 Subject: [PATCH 13/98] Change week 3 step2-6 to flatten an array --- Week3/MAKEME.md | 9 +++++++-- Week3/homework/step2-6.js | 12 ++++++------ Week3/test/step2-6.test.js | 25 +++++++++---------------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/Week3/MAKEME.md b/Week3/MAKEME.md index 05a091a88..289c6c22d 100644 --- a/Week3/MAKEME.md +++ b/Week3/MAKEME.md @@ -112,8 +112,13 @@ const arr2d = [[1, 2], [3, 4], [5, 6]]; (for math people you can think of this as a matrix) -How would you print all the items of an array with 3 dimensions? -How about with _K_ dimensions? +How would you flatten out all the items of an array with 2 dimensions into a one-dimensional array? Flattening out the `arr2d` array above would result in: + +```js +const flattenedArr = [1, 2, 3, 4, 5, 6]; +``` + +How about 3 dimensions? How about with _K_ dimensions? What if you didn't know how deep the array was nested? (You don't have to write code for this but think about it.) **2.7** Here are two functions that look like they do the something similar but they print different results. Please explain what's going on here. diff --git a/Week3/homework/step2-6.js b/Week3/homework/step2-6.js index 76e458e4c..8d674b780 100644 --- a/Week3/homework/step2-6.js +++ b/Week3/homework/step2-6.js @@ -3,21 +3,21 @@ const arr2d = [[1, 2], [3, 4], [5, 6]]; const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; -function printArray2d(arr) { +function flattenArray2d(arr) { // Replace this comment and the next line with your code console.log(arr); } -function printArray3d(arr) { +function flattenArray3d(arr) { // Replace this comment and the next line with your code console.log(arr); } -printArray2d(arr2d); -printArray3d(arr3d); +console.log(flattenArray2d(arr2d)); // -> [1, 2, 3, 4, 5, 6] +console.log(flattenArray3d(arr3d)); // -> [1, 2, 3, 4, 5, 6, 7, 8] // Do not change or remove anything below this line module.exports = { - printArray2d, - printArray3d + flattenArray2d, + flattenArray3d }; diff --git a/Week3/test/step2-6.test.js b/Week3/test/step2-6.test.js index c2ccd55d8..a1be5ed6b 100644 --- a/Week3/test/step2-6.test.js +++ b/Week3/test/step2-6.test.js @@ -1,27 +1,20 @@ /* eslint-disable no-return-assign, dot-notation */ -const { printArray2d, printArray3d } = require('../homework/step2-6'); +const { flattenArray2d, flattenArray3d } = require('../homework/step2-6'); const arr2d = [[1, 2], [3, 4], [5, 6]]; -const expected2d = [1, 2, 3, 4, 5, 6].join(''); +const expected2d = [1, 2, 3, 4, 5, 6]; const arr3d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]; -const expected3d = [1, 2, 3, 4, 5, 6, 7, 8].join(''); +const expected3d = [1, 2, 3, 4, 5, 6, 7, 8]; describe('step2-6', () => { - let outputData; - const storeLog = (...inputs) => (outputData += inputs.join(' ')); - - test('printArray2d -> 1, 2, 3, 4, 5, 6', () => { - outputData = ''; - console['log'] = jest.fn(storeLog); - printArray2d(arr2d); - expect(outputData).toBe(expected2d); + test('flattenArray2d -> [1, 2, 3, 4, 5, 6]', () => { + const result = flattenArray2d(arr2d); + expect(result).toEqual(expected2d); }); - test('printArray3d -> 1, 2, 3, 4, 5, 6, 7, 8', () => { - outputData = ''; - console['log'] = jest.fn(storeLog); - printArray3d(arr3d); - expect(outputData).toBe(expected3d); + test('flattenArray3d -> [1, 2, 3, 4, 5, 6, 7, 8]', () => { + const result = flattenArray3d(arr3d); + expect(result).toEqual(expected3d); }); }); From f402d20d92b9ee258900a5435c7e80de3f916d3f Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Sat, 26 Jan 2019 20:33:52 +0100 Subject: [PATCH 14/98] Prettier: enable trailing comma (es5 option) --- Week1/homework/app.js | 2 +- Week2/homework/maartjes-work.js | 24 ++++++++++++------------ Week2/homework/map-filter.js | 2 +- Week3/homework/step2-3.js | 2 +- Week3/homework/step2-6.js | 2 +- Week3/test/console-test.js | 4 +++- Week3/test/step2-3.test.js | 2 +- prettier.config.js | 4 ++-- 8 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Week1/homework/app.js b/Week1/homework/app.js index 6131f54ea..a9b5f75d8 100644 --- a/Week1/homework/app.js +++ b/Week1/homework/app.js @@ -3,7 +3,7 @@ { const bookTitles = [ // Replace with your own book titles - 'harry_potter_chamber_secrets' + 'harry_potter_chamber_secrets', ]; // Replace with your own code diff --git a/Week2/homework/maartjes-work.js b/Week2/homework/maartjes-work.js index fc8c0e633..49772eb44 100644 --- a/Week2/homework/maartjes-work.js +++ b/Week2/homework/maartjes-work.js @@ -3,43 +3,43 @@ const monday = [ { name: 'Write a summary HTML/CSS', - duration: 180 + duration: 180, }, { name: 'Some web development', - duration: 120 + duration: 120, }, { name: 'Fix homework for class10', - duration: 20 + duration: 20, }, { name: 'Talk to a lot of people', - duration: 200 - } + duration: 200, + }, ]; const tuesday = [ { name: 'Keep writing summary', - duration: 240 + duration: 240, }, { name: 'Some more web development', - duration: 180 + duration: 180, }, { name: 'Staring out the window', - duration: 10 + duration: 10, }, { name: 'Talk to a lot of people', - duration: 200 + duration: 200, }, { name: 'Look at application assignments new students', - duration: 40 - } + duration: 40, + }, ]; const maartjesTasks = monday.concat(tuesday); @@ -61,5 +61,5 @@ console.log(`Maartje has earned €${'replace this string with the earnings roun module.exports = { maartjesTasks, maartjesHourlyRate, - computeEarnings + computeEarnings, }; diff --git a/Week2/homework/map-filter.js b/Week2/homework/map-filter.js index ab3c622d4..c8e8a88c1 100644 --- a/Week2/homework/map-filter.js +++ b/Week2/homework/map-filter.js @@ -11,5 +11,5 @@ console.log(doubleOddNumbers(myNumbers)); // Do not change or remove anything below this line module.exports = { myNumbers, - doubleOddNumbers + doubleOddNumbers, }; diff --git a/Week3/homework/step2-3.js b/Week3/homework/step2-3.js index 739938dfb..00845c5eb 100644 --- a/Week3/homework/step2-3.js +++ b/Week3/homework/step2-3.js @@ -43,5 +43,5 @@ console.log('do-while', repeatStringNumTimesWithDoWhile('abc', 3)); module.exports = { repeatStringNumTimesWithFor, repeatStringNumTimesWithWhile, - repeatStringNumTimesWithDoWhile + repeatStringNumTimesWithDoWhile, }; diff --git a/Week3/homework/step2-6.js b/Week3/homework/step2-6.js index 8d674b780..ffe95b9f7 100644 --- a/Week3/homework/step2-6.js +++ b/Week3/homework/step2-6.js @@ -19,5 +19,5 @@ console.log(flattenArray3d(arr3d)); // -> [1, 2, 3, 4, 5, 6, 7, 8] // Do not change or remove anything below this line module.exports = { flattenArray2d, - flattenArray3d + flattenArray3d, }; diff --git a/Week3/test/console-test.js b/Week3/test/console-test.js index 72d5a84fc..33b78f62c 100644 --- a/Week3/test/console-test.js +++ b/Week3/test/console-test.js @@ -2,10 +2,12 @@ function consoleTest(filename, expectedOutput) { let outputData = ''; + // eslint-disable-next-line no-return-assign const storeLog = (...inputs) => (outputData += inputs.join(' ')); test(filename, () => { - console['log'] = jest.fn(storeLog); + console.log = jest.fn(storeLog); + // eslint-disable-next-line global-require require('../homework/' + filename); expect(outputData).toBe(expectedOutput); }); diff --git a/Week3/test/step2-3.test.js b/Week3/test/step2-3.test.js index 387562660..41454d87f 100644 --- a/Week3/test/step2-3.test.js +++ b/Week3/test/step2-3.test.js @@ -1,7 +1,7 @@ const { repeatStringNumTimesWithFor, repeatStringNumTimesWithWhile, - repeatStringNumTimesWithDoWhile + repeatStringNumTimesWithDoWhile, } = require('../homework/step2-3'); describe('step2-3 with for-loop', () => { diff --git a/prettier.config.js b/prettier.config.js index 1400fac1d..8375d82ab 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -1,9 +1,9 @@ module.exports = { printWidth: 100, singleQuote: true, - trailingComma: 'none', + trailingComma: 'es5', bracketSpacing: true, jsxBracketSameLine: false, tabWidth: 2, - semi: true + semi: true, }; From 8e3d479ae73b52fdce66e1b78904b7cf7c5c66ca Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Sat, 26 Jan 2019 22:55:33 +0100 Subject: [PATCH 15/98] Use prettier.trailingComma: all --- Week1/README.md | 2 +- prettier.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Week1/README.md b/Week1/README.md index a2f5bbd59..b7faf0c20 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -46,7 +46,7 @@ In week one we will discuss the following topics: "files.autoSave": "onFocusChange", "prettier.printWidth": 100, "prettier.singleQuote": true, - "prettier.trailingComma": "es5" + "prettier.trailingComma": "all" } ``` diff --git a/prettier.config.js b/prettier.config.js index 8375d82ab..ee80efd56 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -1,7 +1,7 @@ module.exports = { printWidth: 100, singleQuote: true, - trailingComma: 'es5', + trailingComma: 'all', bracketSpacing: true, jsxBracketSameLine: false, tabWidth: 2, From 29162c393999d07a78fc3bab481c8ab1354cb10d Mon Sep 17 00:00:00 2001 From: Noer Paanakker Date: Wed, 27 Feb 2019 12:56:16 +0100 Subject: [PATCH 16/98] added message on test --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5da260eb1..018e220bb 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,21 @@ Here you can find course content and homework for the JavaScript2 module |Week|Topic|Read|Homework| |----|-----|----|--------| -|1.|• Capturing user input
• [Events](http://javascript.info/introduction-browser-events)
• [Basic DOM manipulations](../../../fundamentals/blob/master/fundamentals/DOM_manipulation.md)
• [Code debugging using the browser](http://javascript.info/debugging-chrome)
• [Code commenting](../../../fundamentals/blob/master/fundamentals/code_commenting.md)
• Structuring code files
• [Code formatting](../../../fundamentals/blob/master/fundamentals/code_formatting.md)
• [Handing in homework via PR](../../..//fundamentals/blob/master/fundamentals/homework_pr.md) |[Reading Week 1](/Week1/README.md)|[Homework Week 1](/Week1/MAKEME.md)| +|1.|• Capturing user input through forms
• [Events](http://javascript.info/introduction-browser-events)
• [Basic DOM manipulations](../../../fundamentals/blob/master/fundamentals/DOM_manipulation.md)
• [Code debugging using the browser](http://javascript.info/debugging-chrome)
• [Code commenting](../../../fundamentals/blob/master/fundamentals/code_commenting.md)
• Structuring code files
• [Code formatting](../../../fundamentals/blob/master/fundamentals/code_formatting.md)
• [Handing in homework via PR](../../..//fundamentals/blob/master/fundamentals/homework_pr.md) |[Reading Week 1](/Week1/README.md)|[Homework Week 1](/Week1/MAKEME.md)| |2.|• Functions + JSON/Arrays
• [Array Manipulations](../../../fundamentals/blob/master/fundamentals/array_manipulation.md)
• JSON
• [Map and filter](../../../fundamentals/blob/master/fundamentals/map_filter.md)
• Arrow functions |[Reading Week 2](/Week2/README.md)|[Homework Week 2](/Week2/MAKEME.md)| |3.|• [Closures](../../../fundamentals/blob/master/fundamentals/scope_closures_this.md)
• Callbacks|[Reading Week 3](/Week3/README.md)|[Homework Week 3](/Week3/MAKEME.md)| -__Kind note:__ +## Test +At the end of this module you'll be doing a formative test. It will be done on **paper** and will consist of **4 exercises** that will test your JavaScript1 and JavaScript2 knowledge. + +Why on paper, you might ask? Fundamental understanding should become intuitive. Only after having learned and mastered a concept deeply will you be able to use it creatively. If you rely too much on others, or Google, you'll make it very hard to cultivate the habit to think for yourself. + +Also important to note: this test is done for 2 reasons only. + +(1) **HackYourFuture wants to know** what skill level you are at. + +(2) The test will **give you an indication** of what skill level you are at. -We expect you to __always__ come prepared to the class on Sunday. ### Overall A good understanding of all the above mentioned topics. Want to check your Knowledge? Go through the [JavaScript Fundamentals README](../../../fundamentals/blob/master/fundamentals/README.md) and research/ ask for help (Slack!) with the concepts that are not entirely clear. From 6d1690429482290ad429d0b4c01030c624a30a8d Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Thu, 21 Mar 2019 14:48:24 +0100 Subject: [PATCH 17/98] Update VSCode settings --- Week1/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Week1/README.md b/Week1/README.md index b7faf0c20..c509afe0a 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -34,15 +34,19 @@ In week one we will discuss the following topics: Then, click on the `{ }` button in the top-right corner of the settings screen to access the settings in JSON format. + ```json /// Place your settings in this file to overwrite the default settings { "editor.detectIndentation": false, "editor.formatOnSave": true, - "editor.formatOnType": true, "editor.minimap.enabled": false, "editor.renderIndentGuides": true, "editor.tabSize": 2, + "editor.codeActionsOnSave": { + "source.fixAll": true + }, + "eslint.autoFixOnSave": true, "files.autoSave": "onFocusChange", "prettier.printWidth": 100, "prettier.singleQuote": true, From 304da26b1d686a146b5b867e3a253441fa386756 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Tue, 26 Mar 2019 11:43:30 +0100 Subject: [PATCH 18/98] Update MAKEME.md --- Week2/MAKEME.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index 0169b7920..b18d95e73 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -44,43 +44,43 @@ Rewrite the above `doubleOddNumbers` function using `map` and `filter`; don't fo const monday = [ { name: 'Write a summary HTML/CSS', - duration: 180 + duration: 180, }, { name: 'Some web development', - duration: 120 + duration: 120, }, { name: 'Fix homework for class10', - duration: 20 + duration: 20, }, { name: 'Talk to a lot of people', - duration: 1.0 - } + duration: 200, + }, ]; const tuesday = [ { name: 'Keep writing summary', - duration: 1.0 + duration: 240, }, { name: 'Some more web development', - duration: 180 + duration: 180, }, { name: 'Staring out the window', - duration: 10 + duration: 10, }, { name: 'Talk to a lot of people', - duration: 1.0 + duration: 200, }, { name: 'Look at application assignments new students', - duration: 40 - } + duration: 40, + }, ]; ``` From c7aa57ce10ad06743dcd910565084e2ed73b9c96 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Mon, 1 Apr 2019 14:48:27 +0200 Subject: [PATCH 19/98] Correct typo --- Week3/MAKEME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week3/MAKEME.md b/Week3/MAKEME.md index 289c6c22d..ea033009b 100644 --- a/Week3/MAKEME.md +++ b/Week3/MAKEME.md @@ -74,7 +74,7 @@ function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { threeFive(10, 15, sayThree, sayFive); -// Should create an array [10,11,12,12.14,15] +// Should create an array [10,11,12,13,14,15] // and call sayFive, sayThree, sayThree, sayFive // please make sure you see why these calls are made before you start coding ``` From 513ace2b0f23ee26ac39a8ee5ce0a9d047585048 Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Mon, 1 Apr 2019 21:44:11 +0200 Subject: [PATCH 20/98] Fix broken link --- Week3/MAKEME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week3/MAKEME.md b/Week3/MAKEME.md index ea033009b..2b1ff0922 100644 --- a/Week3/MAKEME.md +++ b/Week3/MAKEME.md @@ -13,7 +13,7 @@ Topics discussed this week: > Read: -- JavaScript : [Closures](http://conceptf1.blogspot.nl/2012.11/javascript-closures.html) +- JavaScript : [Closures](http://conceptf1.blogspot.com/2013/11/javascript-closures.html) - Everything you wanted to know about [JavaScript scope](https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/) - JavaScript [Scoping and Hoisting](http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) - 5 JavaScript [“Bad” Parts That Are Fixed In ES6](https://medium.freecodecamp.com/5-javascript-bad-parts-that-are-fixed-in-es6-c7c45d44fd81) From a88dec3fd7fbc937a48d5b28f1026a739f7a5660 Mon Sep 17 00:00:00 2001 From: Noer Date: Mon, 27 May 2019 11:36:35 +0200 Subject: [PATCH 21/98] Update MAKEME.md --- Week1/MAKEME.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Week1/MAKEME.md b/Week1/MAKEME.md index 79b197b83..5e378788b 100644 --- a/Week1/MAKEME.md +++ b/Week1/MAKEME.md @@ -28,15 +28,15 @@ Modify the (mostly empty) files in the `Week1/homework` folder for this step. **1.2** Open the empty `index.html` and add the required HTML to load the `app.js` file. Open `index.html` in the browser and confirm that the `console.log` statement shows the array. (Open the Chrome Developer Tools and inspect the console.) -**1.3** Remove the temporary `console.log` from step 1.1. Make a function (or functions) that generate a `ul` with `li` elements for each book ID in the array using a `for` loop. Make sure that the function names you choose are an accurate reflection of what they do. As a reminder, here are the recommended [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). +**1.3** Remove the temporary `console.log` from step 1.1. Make a function (or functions) that generate a `ul` with `li` elements for each book title in the array using a `for` loop. Make sure that the function names you choose are an accurate reflection of what they do. As a reminder, here are the recommended [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). -**1.4** Make an object (_not an array!_) containing information for each book. Each property of this object should be another (i.e., nested) object with the book ID you thought up in step 1.1 as a key, and at least the following properties: `title`, `language` and `author`. +**1.4** Make an object (_not an array!_) containing information for each book. Each property of this object should be another (i.e., nested) object with the book title you thought up in step 1.1 as a key, and at least the following properties: `title`, `language` and `author`. -**1.5** Now change the function from step 1.3 that you used to display the book ID's in a list to take the actual information about the book from the object and display that. Make sure you choose the correct HTML elements for each piece of info, for instance, a heading for the title. +**1.5** Now change the function from step 1.3 that you used to display the book title in a list to take the actual information about the book from the object and display that. Make sure you choose the correct HTML elements for each piece of info, for instance, a heading for the title. **1.6** Beautify your html page with css (use the `style.css` file for that), add sources and alts to each of the images. -**1.7** Find and download book covers for each book and construct a new object which has as keys the book IDs again, and as value the path to the image source (e.g. `{ harry_potter_blabla: './img/harry_potter_blabla.jpg', ... }`). +**1.7** Find and download book covers for each book and construct a new object which has as keys the book titles again, and as value the path to the image source (e.g. `{ harry_potter_blabla: './img/harry_potter_blabla.jpg', ... }`). **1.8** Loop over these entries (_hint: `Object.keys(objectName)` gives you an array containing the keys_). Then write a function which places an image at the corresponding `li` element. Remember that objects are not ordered, so you cannot guarantee that the first key is the first `li` element. (_Hint: you could give each `li` item an `id` tag by modifying the function you made before._) From 90b74a5c264895dc11d83752fbb48dd495f0e0fb Mon Sep 17 00:00:00 2001 From: Jim Cramer Date: Thu, 6 Jun 2019 11:27:32 +0200 Subject: [PATCH 22/98] Removed redundant and erroneous text. --- Week3/MAKEME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week3/MAKEME.md b/Week3/MAKEME.md index 2b1ff0922..b0b01e7fd 100644 --- a/Week3/MAKEME.md +++ b/Week3/MAKEME.md @@ -167,7 +167,7 @@ To run the unit test for the week 3 homework, open a terminal window in the `Jav npm run test-week3 ``` -In case of errors, try and fix them. When done, run the tests again: `npm run test3` +In case of errors, try and fix them. When done, run the tests again. Repeat the previous step until all tests pass. From e366b06bfdd2c0aa080d80ee3ab569328f4b995e Mon Sep 17 00:00:00 2001 From: David Ng Date: Sun, 30 Jun 2019 12:49:02 +0200 Subject: [PATCH 23/98] Use absolute paths so links in forked repos continue to work, fixup formatting --- README.md | 23 ++++++++--------- Week1/README.md | 65 ++++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 018e220bb..d734b9ed9 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,32 @@ > Please help us improve and share your feedback! If you find better tutorials -or links, please share them by [opening a pull request](https://github.com/HackYourFuture/JavaScript2/pulls). +> or links, please share them by [opening a pull request](https://github.com/HackYourFuture/JavaScript2/pulls). # HackYourFuture - JavaScript 2 Here you can find course content and homework for the JavaScript2 module -|Week|Topic|Read|Homework| -|----|-----|----|--------| -|1.|• Capturing user input through forms
• [Events](http://javascript.info/introduction-browser-events)
• [Basic DOM manipulations](../../../fundamentals/blob/master/fundamentals/DOM_manipulation.md)
• [Code debugging using the browser](http://javascript.info/debugging-chrome)
• [Code commenting](../../../fundamentals/blob/master/fundamentals/code_commenting.md)
• Structuring code files
• [Code formatting](../../../fundamentals/blob/master/fundamentals/code_formatting.md)
• [Handing in homework via PR](../../..//fundamentals/blob/master/fundamentals/homework_pr.md) |[Reading Week 1](/Week1/README.md)|[Homework Week 1](/Week1/MAKEME.md)| -|2.|• Functions + JSON/Arrays
• [Array Manipulations](../../../fundamentals/blob/master/fundamentals/array_manipulation.md)
• JSON
• [Map and filter](../../../fundamentals/blob/master/fundamentals/map_filter.md)
• Arrow functions |[Reading Week 2](/Week2/README.md)|[Homework Week 2](/Week2/MAKEME.md)| -|3.|• [Closures](../../../fundamentals/blob/master/fundamentals/scope_closures_this.md)
• Callbacks|[Reading Week 3](/Week3/README.md)|[Homework Week 3](/Week3/MAKEME.md)| +| Week | Topic | Read | Homework | +| ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ----------------------------------- | +| 1. | • Capturing user input through forms
• [Events](http://javascript.info/introduction-browser-events)
• [Basic DOM manipulations](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/DOM_manipulation.md)
• [Code debugging using the browser](http://javascript.info/debugging-chrome)
• [Code commenting](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/code_commenting.md)
• Structuring code files
• [Code formatting](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/code_formatting.md)
• [Handing in homework via PR](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/homework_pr.md) | [Reading Week 1](/Week1/README.md) | [Homework Week 1](/Week1/MAKEME.md) | +| 2. | • Functions + JSON/Arrays
• [Array Manipulations](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/array_manipulation.md)
• JSON
• [Map and filter](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/map_filter.md)
• Arrow functions | [Reading Week 2](/Week2/README.md) | [Homework Week 2](/Week2/MAKEME.md) | +| 3. | • [Closures](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/scope_closures_this.md)
• Callbacks | [Reading Week 3](/Week3/README.md) | [Homework Week 3](/Week3/MAKEME.md) | ## Test -At the end of this module you'll be doing a formative test. It will be done on **paper** and will consist of **4 exercises** that will test your JavaScript1 and JavaScript2 knowledge. + +At the end of this module you'll be doing a formative test. It will be done on **paper** and will consist of **4 exercises** that will test your JavaScript1 and JavaScript2 knowledge. Why on paper, you might ask? Fundamental understanding should become intuitive. Only after having learned and mastered a concept deeply will you be able to use it creatively. If you rely too much on others, or Google, you'll make it very hard to cultivate the habit to think for yourself. Also important to note: this test is done for 2 reasons only. -(1) **HackYourFuture wants to know** what skill level you are at. +(1) **HackYourFuture wants to know** what skill level you are at. (2) The test will **give you an indication** of what skill level you are at. - ### Overall -A good understanding of all the above mentioned topics. Want to check your Knowledge? Go through the [JavaScript Fundamentals README](../../../fundamentals/blob/master/fundamentals/README.md) and research/ ask for help (Slack!) with the concepts that are not entirely clear. -*The HackYourFuture curriculum is subject to CC BY copyright. This means you can freely use our materials, but just make sure to give us credit for it :)* +A good understanding of all the above mentioned topics. Want to check your Knowledge? Go through the [JavaScript Fundamentals README](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/README.md) and research/ ask for help (Slack!) with the concepts that are not entirely clear. + +_The HackYourFuture curriculum is subject to CC BY copyright. This means you can freely use our materials, but just make sure to give us credit for it :)_ Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License. diff --git a/Week1/README.md b/Week1/README.md index c509afe0a..5945ebebd 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -34,25 +34,24 @@ In week one we will discuss the following topics: Then, click on the `{ }` button in the top-right corner of the settings screen to access the settings in JSON format. - - ```json - /// Place your settings in this file to overwrite the default settings - { - "editor.detectIndentation": false, - "editor.formatOnSave": true, - "editor.minimap.enabled": false, - "editor.renderIndentGuides": true, - "editor.tabSize": 2, - "editor.codeActionsOnSave": { - "source.fixAll": true - }, - "eslint.autoFixOnSave": true, - "files.autoSave": "onFocusChange", - "prettier.printWidth": 100, - "prettier.singleQuote": true, - "prettier.trailingComma": "all" - } - ``` +```json +/// Place your settings in this file to overwrite the default settings +{ + "editor.detectIndentation": false, + "editor.formatOnSave": true, + "editor.minimap.enabled": false, + "editor.renderIndentGuides": true, + "editor.tabSize": 2, + "editor.codeActionsOnSave": { + "source.fixAll": true + }, + "eslint.autoFixOnSave": true, + "files.autoSave": "onFocusChange", + "prettier.printWidth": 100, + "prettier.singleQuote": true, + "prettier.trailingComma": "all" +} +``` 3. Install the ESLint CLI tool globally by issuing the following command from the command line: @@ -76,19 +75,19 @@ As a refresher, go through the topics of JavaScript1: ### Week 2 -- [Variables (var, let, const)](./../../../../fundamentals/blob/master/fundamentals/variables.md) -- [Basic Data types (Strings, Numbers, Arrays, Booleans)](./../../../../fundamentals/blob/master/fundamentals/values.md) -- [Operators](./../../../../fundamentals/blob/master/fundamentals/operators.md) -- [Naming conventions](./../../../../fundamentals/blob/master/fundamentals/naming_conventions.md) +- [Variables (var, let, const)](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/variables.md) +- [Basic Data types (Strings, Numbers, Arrays, Booleans)](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/values.md) +- [Operators](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/operators.md) +- [Naming conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md) ### Week 3 -- [Advanced data types (objects)](./../../../../fundamentals/blob/master/fundamentals/objects.md) -- [Conditional execution](./../../../../fundamentals/blob/master/fundamentals/conditional_execution.md)
-- [Statements vs Expressions](./../../../../fundamentals/blob/master/fundamentals/statements_expressions.md)
-- [Loops (for/while)](./../../../../fundamentals/blob/master/fundamentals/loops.md) -- [Functions](./../../../../fundamentals/blob/master/fundamentals/functions.md) -- [Scope](./../../../../fundamentals/blob/master/fundamentals/scope.md) +- [Advanced data types (objects)](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/objects.md) +- [Conditional execution](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/conditional_execution.md)
+- [Statements vs Expressions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/statements_expressions.md)
+- [Loops (for/while)](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/loops.md) +- [Functions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/functions.md) +- [Scope](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/scope.md) ## Required readings for the first lecture @@ -96,11 +95,11 @@ As a refresher, go through the topics of JavaScript1: - ~~Capturing user input~~ - [Events](http://javascript.info/introduction-browser-events) -- [Basic DOM manipulations (img src, innerHTML)](./../../../../fundamentals/blob/master/fundamentals/DOM_manipulation.md) -- [Code Degugging Using the Browser](http://javascript.info/debugging-chrome) -- [Code commenting](./../../../../fundamentals/blob/master/fundamentals/code_commenting.md) +- [Basic DOM manipulations (img src, innerHTML)](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/DOM_manipulation.md) +- [Code Debugging Using the Browser](http://javascript.info/debugging-chrome) +- [Code commenting](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/code_commenting.md) - ~~Structuring code~~ -- [Code formatting](./../../../../fundamentals/blob/master/fundamentals/code_formatting.md) +- [Code formatting](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/code_formatting.md) - [Handing in homework via PR](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/homework_pr.md) Extras: From c95f30017d04650cb6811401419f6f217743570a Mon Sep 17 00:00:00 2001 From: Noer Paanakker Date: Wed, 17 Jul 2019 13:31:18 +0200 Subject: [PATCH 24/98] deciding on topics --- README.md | 60 +++++++++++++++----- Week1/LESSONPLAN.md | 0 Week1/README.md | 121 ++++++++++------------------------------- Week2/LESSONPLAN.md | 0 Week2/README.md | 37 ++++++++----- Week3/LESSONPLAN.md | 0 Week3/README.md | 28 +++++----- assets/javascript2.png | Bin 0 -> 85323 bytes 8 files changed, 111 insertions(+), 135 deletions(-) create mode 100644 Week1/LESSONPLAN.md create mode 100644 Week2/LESSONPLAN.md create mode 100644 Week3/LESSONPLAN.md create mode 100644 assets/javascript2.png diff --git a/README.md b/README.md index 018e220bb..2eff3cdcc 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,61 @@ -> Please help us improve and share your feedback! If you find better tutorials -or links, please share them by [opening a pull request](https://github.com/HackYourFuture/JavaScript2/pulls). +> If you are following the HackYourFuture curriculum we recommend you to start with module 1: [HTML/CSS/GIT](https://github.com/HackYourFuture/HTML-CSS). To get a complete overview of the HackYourFuture curriculum first, click [here](https://github.com/HackYourFuture/curriculum). -# HackYourFuture - JavaScript 2 +> Please help us improve and share your feedback! If you find better tutorials or links, please share them by [opening a pull request](https://github.com/HackYourFuture/JavaScript1/pulls). -Here you can find course content and homework for the JavaScript2 module +# Module #3 - JavaScript 2: DOM Manipulation (Frontend) -|Week|Topic|Read|Homework| -|----|-----|----|--------| -|1.|• Capturing user input through forms
• [Events](http://javascript.info/introduction-browser-events)
• [Basic DOM manipulations](../../../fundamentals/blob/master/fundamentals/DOM_manipulation.md)
• [Code debugging using the browser](http://javascript.info/debugging-chrome)
• [Code commenting](../../../fundamentals/blob/master/fundamentals/code_commenting.md)
• Structuring code files
• [Code formatting](../../../fundamentals/blob/master/fundamentals/code_formatting.md)
• [Handing in homework via PR](../../..//fundamentals/blob/master/fundamentals/homework_pr.md) |[Reading Week 1](/Week1/README.md)|[Homework Week 1](/Week1/MAKEME.md)| -|2.|• Functions + JSON/Arrays
• [Array Manipulations](../../../fundamentals/blob/master/fundamentals/array_manipulation.md)
• JSON
• [Map and filter](../../../fundamentals/blob/master/fundamentals/map_filter.md)
• Arrow functions |[Reading Week 2](/Week2/README.md)|[Homework Week 2](/Week2/MAKEME.md)| -|3.|• [Closures](../../../fundamentals/blob/master/fundamentals/scope_closures_this.md)
• Callbacks|[Reading Week 3](/Week3/README.md)|[Homework Week 3](/Week3/MAKEME.md)| +![JavaScript2](./assets/javascript2.png) + +If you were to ask a random person on the street the question "What is a browser?", you'll most likely get a variety of (incorrect) answers. For proof, check [this](https://www.youtube.com/watch?v=o4MwTvtyrUQ) out. + +You might be one of those people right now, but after this module no more. + +## Learning goals + +In order to successfully complete this module you will need to master the following: + +- + +- Learn how to think like a programmer + +## How to use this repository + +This repository consists of 3 essential parts: + +1. `Reading materials`: this document contains all the required theory you need to know _**while**_ you're coding. It's meant as both study material and as a reference to understand what you're doing. +2. `Homework`: this document contains the instructions for each week's homework. +3. `Lesson Plans`: this part is meant for teachers as a reference. However, as a student don't be shy to take a look at it as well! + +After your first class you should start off with checking the `reading materials` for that week. At the beginning that would be the [Week 1 Reading](/Week1/README.md). Study all the concepts and try to get the gist of everything. After, you can get started with the `homework` for that week. + +If you have any questions or if something is not entirely clear ¯\\\_(ツ)\_/¯, please ask/comment on Slack! + +## Planning + +| Week | Topic | Reading Materials | Homework | Lesson Plan | +| ---- | --------------------------------------------- | ------------------------------ | ------------------------------- | ---------------------------------- | +| 1. | Document-Object Model (DOM), DOM manipulation | [Reading W1](/Week1/README.md) | [Homework W1](/Week1/MAKEME.md) | [Lesson Plan W1](/Week1/MAKEME.md) | +| 2. | , Cookies & Sessions | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/MAKEME.md) | +| 3. | Callbacks, Closures & Scope | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/MAKEME.md) | ## Test -At the end of this module you'll be doing a formative test. It will be done on **paper** and will consist of **4 exercises** that will test your JavaScript1 and JavaScript2 knowledge. -Why on paper, you might ask? Fundamental understanding should become intuitive. Only after having learned and mastered a concept deeply will you be able to use it creatively. If you rely too much on others, or Google, you'll make it very hard to cultivate the habit to think for yourself. +At the end of this module you'll be doing a formative test. It will be done on **paper** and will consist of **4 exercises** that will test your JavaScript1 and JavaScript2 knowledge. + +Why on paper, you might ask? Fundamental understanding should become intuitive. Only after having learned and mastered a concept deeply will you be able to use it creatively. If you rely too much on others, on Google or your code editor to do your thinking you'll make it very hard to cultivate the habit to think for yourself. Also important to note: this test is done for 2 reasons only. -(1) **HackYourFuture wants to know** what skill level you are at. +(1) **HackYourFuture wants to know** what skill level you are at. (2) The test will **give you an indication** of what skill level you are at. +## Finished? + +Did you finish the module? Good job! You're doing great! -### Overall -A good understanding of all the above mentioned topics. Want to check your Knowledge? Go through the [JavaScript Fundamentals README](../../../fundamentals/blob/master/fundamentals/README.md) and research/ ask for help (Slack!) with the concepts that are not entirely clear. +If you feel ready for the next challenge, click [here](https://www.github.com/HackYourFuture/JavaScript3) to go to JavaScript3! -*The HackYourFuture curriculum is subject to CC BY copyright. This means you can freely use our materials, but just make sure to give us credit for it :)* +_The HackYourFuture curriculum is subject to CC BY copyright. This means you can freely use our materials, but just make sure to give us credit for it :)_ Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License. diff --git a/Week1/LESSONPLAN.md b/Week1/LESSONPLAN.md new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/README.md b/Week1/README.md index c509afe0a..965aa92c3 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -1,94 +1,39 @@ -# Reading material for the first lecture: +# Reading Material JavaScript2 Week 1 -``` -In week one we will discuss the following topics: -• Capturing user input -• Basic DOM manipulations[img src, innerHTML] -• Code debugging using the browser -• Events -• Code commenting -• Structuring code files -• Code formatting -• Handing in homework via PR -``` +## Agenda -## Software installation for the JavaScript 2 Module +These are the topics for week 1: -**_To save time, please do these preparations at home before coming to the first lecture._** +1. What is a browser? + - How a browser works + - Different browsers +2. What is the Document-Object Model (DOM)? + - The DOM tree + - JavaScript and the browser + - Traversing the DOM +3. What is DOM Manipulation? + - Browser events + - Event handlers -1. Install the following extensions in VSCode (you may have installed some of them already): +[DOM Crash Course](https://www.youtube.com/playlist?list=PLillGF-RfqbYE6Ik_EuXA2iZFcE082B3s) - - Code Spell Checker - - ESLint - - Prettier - Code formatter - - open in browser - - Live Server - - Bracket Pair Colorizer +## 1. What is a browser? -2. Modify the VSCode User Settings to include the settings listed below. If a particular setting is already present in your User Settings, make sure that the setting value listed below is used and change it if necessary. +A browser is software that allows you to access websites. - To open your user and workspace settings, use the following VS Code menu command: +### How a browser works - - On Windows/Linux - **File** > **Preferences** > **Settings** - - On macOS - **Code** > **Preferences** > **Settings** +[How a web browser functions](https://www.youtube.com/watch?v=z0HN-fG6oT4) - Then, click on the `{ }` button in the top-right corner of the settings screen to access the settings in JSON format. +## 2. What is the Document-Object Model (DOM)? - - ```json - /// Place your settings in this file to overwrite the default settings - { - "editor.detectIndentation": false, - "editor.formatOnSave": true, - "editor.minimap.enabled": false, - "editor.renderIndentGuides": true, - "editor.tabSize": 2, - "editor.codeActionsOnSave": { - "source.fixAll": true - }, - "eslint.autoFixOnSave": true, - "files.autoSave": "onFocusChange", - "prettier.printWidth": 100, - "prettier.singleQuote": true, - "prettier.trailingComma": "all" - } - ``` +### JavaScript and the browser -3. Install the ESLint CLI tool globally by issuing the following command from the command line: +### Traversing the DOM - ``` - npm install -g eslint-cli - ``` +- [Traversing the DOM with JavaScript](https://zellwk.com/blog/dom-traversals/) -4. Fork this repository (i.e., **JavaScript2**) and clone your fork to your laptop. - -5. Open the `JavaScript2` folder from the cloned repository in VSCode. - -6. Open a terminal window in VSCode and type the following command: - - ``` - npm install - ``` - -## Review of JavaScript1 - -As a refresher, go through the topics of JavaScript1: - -### Week 2 - -- [Variables (var, let, const)](./../../../../fundamentals/blob/master/fundamentals/variables.md) -- [Basic Data types (Strings, Numbers, Arrays, Booleans)](./../../../../fundamentals/blob/master/fundamentals/values.md) -- [Operators](./../../../../fundamentals/blob/master/fundamentals/operators.md) -- [Naming conventions](./../../../../fundamentals/blob/master/fundamentals/naming_conventions.md) - -### Week 3 - -- [Advanced data types (objects)](./../../../../fundamentals/blob/master/fundamentals/objects.md) -- [Conditional execution](./../../../../fundamentals/blob/master/fundamentals/conditional_execution.md)
-- [Statements vs Expressions](./../../../../fundamentals/blob/master/fundamentals/statements_expressions.md)
-- [Loops (for/while)](./../../../../fundamentals/blob/master/fundamentals/loops.md) -- [Functions](./../../../../fundamentals/blob/master/fundamentals/functions.md) -- [Scope](./../../../../fundamentals/blob/master/fundamentals/scope.md) +## 3. What is DOM Manipulation? ## Required readings for the first lecture @@ -108,28 +53,18 @@ Extras: - [Strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) - [Chrome DevTools Debugging](https://developers.google.com/web/tools/chrome-devtools/) -### Recommended readings +* Chapter 13: [JavaScript and the Browser](http://eloquentjavascript.net/13_browser.html) -These chapters from _Eloquent JavaScript_ give in-depth explanations of the topics that will be discussed during the lecture. Highly recommended (if time permits). - -- Chapter 13: [JavaScript and the Browser](http://eloquentjavascript.net/13_browser.html) - -- Chapter 14: [The Document Object Model](http://eloquentjavascript.net/14_dom.html) +* Chapter 14: [The Document Object Model](http://eloquentjavascript.net/14_dom.html) _You can skip the following sections:_ - Moving through the tree -- Chapter 15: [Handling Events](http://eloquentjavascript.net/15_event.html) +* Chapter 15: [Handling Events](http://eloquentjavascript.net/15_event.html) Notes: for the lectures and homework you only need to know about these events: `click`, `change`, `keyup` and `load`. - _You can skip the following sections (but come to these sections when doing the React module):_ - - - Touch events - - Scroll events - - Focus events - - Events and the Event Loop - - Debouncing +## Finished? -_Please go through the material and come to class prepared!_ +Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). diff --git a/Week2/LESSONPLAN.md b/Week2/LESSONPLAN.md new file mode 100644 index 000000000..e69de29bb diff --git a/Week2/README.md b/Week2/README.md index c58b21eb5..623c74956 100644 --- a/Week2/README.md +++ b/Week2/README.md @@ -1,35 +1,46 @@ -### Reading Week 2 +# Reading Material JavaScript2 Week 3 -# Reading material for the second lecture: +## Agenda -``` -In week two we will discuss the following topics: -• Functions + JSON/Arrays -• Array Manipulations -• JSON -• Map and filter -• Arrow functions -``` +These are the topics for week 3: -## Here are resources that we like you to read as a preparation for the coming lecture. +1. What is a library? + - Popular libraries + - Library versus framework +2. What is jQuery? + - Difference between 'vanilla' JavaScript and jQuery + - How jQuery works + +## 1. What is a library? + +## 2. What is jQuery? + +## Finished? + +Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). + +## Here are resources that we like you to read as a preparation for the coming lecture. ### JSON + - [JSON](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON) (MDN) ### Map and Filter + - :dizzy: [Fun fun functional](https://www.youtube.com/playlist?list=PL0zVEGEvSaeEd9hlmCXrk5yUyqUag-n84) :dizzy: Check the first 3-4 videos. ### Code conventions + - Code conventions: http://crockford.com/javascript/code.html ### Array cardio + - Wes Bos' awesome free tutorials. Just make a free account and do Array Cardio #1 [here](https://javascript30.com/) ### From _Eloquent JavaScript_ - Objects continued: http://eloquentjavascript.net/06_object.html - ## Recommended readings This chapter from _Eloquent JavaScript_ gives in-depth explanations of the topics that will be discussed during the lecture. Highly recommended (if time permits). @@ -37,4 +48,4 @@ This chapter from _Eloquent JavaScript_ gives in-depth explanations of the topic - Chapter 3 - [Functions](http://eloquentjavascript.net/03_functions.html) - Chapter 5 - [Higher-Order Functions](http://eloquentjavascript.net/05_higher_order.html) -_Please go through the material and come to class prepared!_ \ No newline at end of file +_Please go through the material and come to class prepared!_ diff --git a/Week3/LESSONPLAN.md b/Week3/LESSONPLAN.md new file mode 100644 index 000000000..e69de29bb diff --git a/Week3/README.md b/Week3/README.md index 8904cbcc1..92a137fd4 100644 --- a/Week3/README.md +++ b/Week3/README.md @@ -1,21 +1,21 @@ -# Reading material for the third lecture: +# Reading Material JavaScript2 Week 2 -``` -In week three we will discuss the following topics: -• Closures -• Scope -• Callbacks -``` +## Agenda -## Here are resources that we like you to read as a preparation for the coming lecture: +These are the topics for week 2: -### Closures +1. Callbacks + - sfsdf + - sdf +2. Scope + - sdfsd + - asdas +3. Closures -- [Closures](http://javascriptissexy.com/understand-javascript-closures-with-ease/) -- [MDN Closures](https://developer.mozilla.org/en/docs/Web/JavaScript/Closures) +## 1. What is a library? -### Design patterns +## 2. What is jQuery? -- [Learning JavaScript Design Patterns](https://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailnamespacing) up to and including chapter 3 +## Finished? -_Please go through the material and come to class prepared!_ +Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). diff --git a/assets/javascript2.png b/assets/javascript2.png new file mode 100644 index 0000000000000000000000000000000000000000..c55feb5c5ffa7a8b4a3ca39e3e3904ab0c0ffeb4 GIT binary patch literal 85323 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 Date: Tue, 30 Jul 2019 17:47:13 +0200 Subject: [PATCH 25/98] finished readings week 1 --- README.md | 10 ++-- Week1/README.md | 116 +++++++++++++++++++++++++++++++++++------- Week2/MAKEME.md | 27 ++++------ Week2/README.md | 20 ++++++-- assets/simple-dom.png | Bin 0 -> 13743 bytes 5 files changed, 127 insertions(+), 46 deletions(-) create mode 100644 assets/simple-dom.png diff --git a/README.md b/README.md index 9ff5c0c6c..50237b668 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,11 @@ If you have any questions or if something is not entirely clear ¯\\\_(ツ)\_/¯ ## Planning -| Week | Topic | Reading Materials | Homework | Lesson Plan | -| ---- | --------------------------------------------- | ------------------------------ | ------------------------------- | -------------------------------------- | -| 1. | Document-Object Model (DOM), DOM manipulation | [Reading W1](/Week1/README.md) | [Homework W1](/Week1/MAKEME.md) | [Lesson Plan W1](/Week1/LESSONPLAN.md) | -| 2. | Developer tools, Event Loop, Callbacks | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/LESSONPLAN.md) | -| 3. | SPA vs. MPA, Scope, Closures | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/LESSONPLAN.md) | +| Week | Topic | Reading Materials | Homework | Lesson Plan | +| ---- | --------------------------------------------------- | ------------------------------ | ------------------------------- | -------------------------------------- | +| 1. | Document-Object Model (DOM), DOM manipulation | [Reading W1](/Week1/README.md) | [Homework W1](/Week1/MAKEME.md) | [Lesson Plan W1](/Week1/LESSONPLAN.md) | +| 2. | Developer tools, Web Storage, Event Loop, Callbacks | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/LESSONPLAN.md) | +| 3. | SPA vs. MPA, Scope, Closures | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/LESSONPLAN.md) | ## Test diff --git a/Week1/README.md b/Week1/README.md index a15a2afcd..212705421 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -4,27 +4,59 @@ These are the topics for week 1: -1. What is a browser? +1. What is a web browser? - How a browser works - - Different browsers + - Different browsers work differently 2. What is the Document-Object Model (DOM)? - JavaScript and the browser - The DOM - The Critical Rendering Path - Traversing the DOM 3. What is DOM Manipulation? + - Manipulating elements - Browser events - Event listeners and handlers [DOM Crash Course](https://www.youtube.com/playlist?list=PLillGF-RfqbYE6Ik_EuXA2iZFcE082B3s) -## 1. What is a browser? +## 1. What is a web browser? -A browser is software that allows you to access websites. +A web browser is software that allows you to access websites. ### How a browser works -[How a web browser functions](https://www.youtube.com/watch?v=z0HN-fG6oT4) +In your journey into becomeing a web developer it's important to know the tools you'll be using intimately. One such is the browser, which will be used to display your websites. In the following resources you'll learn about the many parts any web browser consists of and what their use is: + +- [How a web browser functions](https://www.youtube.com/watch?v=z0HN-fG6oT4) +- [How do web browsers work?](https://medium.com/@monica1109/how-does-web-browsers-work-c95ad628a509) + +### Different browsers work differently + +A website, ultimately is a set of instructions describing how a series of webpages should look. It's up to the browser to render it by reading the code from your HTML/CSS and JavaScript files. There are, however, differences in the code interpretation of the different browsers, thus making the output look differently. + +That's why you should check the way your website looks on different browsers during the development of your website. This is called making it **cross browser compatible**> + +You can use the following online tool in order see how your pages look on multiple browsers: + +- [Browsershots](http://browsershots.org) + +A good website should look and function the same in any browser. + +Unfortunately, there is no easy solution for that. You should check the specificities of each browser that fails to display your website correctly and make the necessary adjustments to your code. Such compatibility issues may occur not only in different browsers but because of an old browser version which does not support completely the latest standards. + +This is because browser development doesn't go at the same speed as programming language development. More often than not, the web technologies you're using will have more features you as a developer can make use of than the browser can currently handle. This is important to keep in mind. + +When you do your styling, especially, it's important to know if a certain browser (and browser version) is even able to understand it. A helpful tool in identifying this is a website called **caniuse.com**: + +- [caniuse](https://caniuse.com/) +- [Check HTML5/CSS3 Support with CANIUSE.COM](https://www.youtube.com/watch?v=el7McMP8CB8) + +Generally speaking, you want to support as many browsers (and browser versions) with your code as possible. + +For more research, check out the following resources: + +- [Dealing with Cross Browser Compatibility](https://www.youtube.com/watch?v=9tEixRJ3GeI) +- [Understanding The Stacking Context for Cross Browser Compatibility](https://medium.com/@mattcroak718/understanding-the-stacking-context-for-cross-browser-compatibility-2b21db1cf621) ## 2. What is the Document-Object Model (DOM)? @@ -42,51 +74,97 @@ For our purposes, it's only important to understand that the browser looks at Ja - [JavaScript, the Browser, and the DOM](https://www.youtube.com/watch?v=31ViueuIXGE) -## The DOM +### The DOM + +The Document-Object Model (DOM) is a tree-like representation of the structure of a webpage. The following is a simple example: + +![Simple DOM](./../assets/simple-dom.png) JavaScript is made accessible to the DOM by embedding it into an HTML file. You might've seen the before; well, this is how the browser becomes aware of JavaScript. - [What exactly is the DOM](https://bitsofco.de/what-exactly-is-the-dom/) - [JavaScript and the browser](https://eloquentjavascript.net/13_browser.html) -## The Critical Rendering Path +### The Critical Rendering Path The actual process of transforming HTML, CSS and JavaScript into a user-viewable version of a webpage is called **the Critical Rendering Path**. - [Understanding the Critical Rendering Path](https://bitsofco.de/understanding-the-critical-rendering-path/) -### Traversing the DOM +## 3. What is DOM Manipulation? + +**DOM manipulation** refers to the activity of selecting and modifying DOM elements. The main reason why this is done is that **you want to show the user different things depending their activity**, for example: + +- You click on a [hamburger menu icon](https://bit.ly/2Yr4O7Z) and a navigation menu slides in +- You scroll down and the elements of + +Finding the right elements is called **traversing the DOM**. Traversing the DOM essential means: using JavaScript to select certain elements within the DOM in order to modify them (change color, size or make them disappear, for example). + +### Manipulating elements + +Look at the following code sample: + +```js +const body = document.querySelector('body'); // you can also use 'document.body' +const newParagraph = document.createElement('p'); +newParagraph.innerText = 'This paragraph will be added to the body!'; +newParagraph.style.background = 'red'; +body.appendChild(newParagraph); +``` + +In this example we're executing the following steps: -Traversing the DOM essential means: using JavaScript to select certain elements within the DOM in order to modify them (change color, size or make them disappear, for example). The modification of elements is also known as **DOM manipulation**. +1. We're first selecting the body: this is always necessary, as we can only add or remove elements from the body of the document +2. Secondly, we're creating a new DOM element: a

element +3. Thirdly, we're injecting content into the element +4. Fourthly, we give our element a background color +5. Finally, we add the

element in the body -Learning how to write JavaScript that targets the DOM is an essential part of being a web developer. In the following resources +Test this code out by copying and pasting it in the Developer Console of your browser. After you've pressed the Enter/Return key you will find your new

at the end of the page! + +Learning how to write JavaScript that targets the DOM is an essential part of being a web developer. In the following resources you'll more about how to do that: - [Traversing the DOM with JavaScript](https://zellwk.com/blog/dom-traversals/) - [JavaScript DOM Crash Course - Part 2](https://www.youtube.com/watch?v=mPd2aJXCZ2g) -## 3. What is DOM Manipulation? - ### Browser events -Browser events are very much like real-life events: they are important things that happen. In real-life this could be getting a job, graduating from school or receiving a birthday gift. In terms of the browser, this is much more small scale: user actions like `clicking`, `scrolling` or `typing` are all considered events. +Browser events (also known as DOM events) are very much like real-life events: they are important things that happen. In real-life this could be getting a job, graduating from school or receiving a birthday gift. In terms of the browser, this is much more small scale: user actions like `clicking`, `scrolling` or `typing` are all considered events. + +These events are important to know about, because based on those we manipulate the DOM. For example, user clicks on an image and as a result it increases in size. -These events are important to know about, because based on those we manipulate the DOM. It's cause and effect: user clicks on an image and as a result it, for example, increases in size. +Effectively it's cause and effect. + +Check out the following resources to learn more about what events there are, and what you can do to manipulate elements after an event has happened: - [What are browser events?](https://www.youtube.com/watch?v=LeKKU3a4AQo) +- [Introduction to browser events](https://javascript.info/introduction-browser-events) - [JavaScript DOM Crash Course - Part 3](https://www.youtube.com/watch?v=wK2cBMcDTss) ### Event listeners and handlers -The process of DOM manipulation happens in three steps: +Take a look at this code: + +```js +const body = document.querySelector('body'); +body.addEventListener('click', function() { + body.style.background = 'black'; +}); +``` + +Test this code out by copying and pasting it in the Developer Console of your browser. After you've pressed the Enter/Return click the website. You should see the whole becoming black! + +This is DOM manipulation in its simplest form. It goes in three essential steps: -(1) an event happens ("User clicks on a button") -(2) JavaScript is aware and looking for this specific user action -(3) JavaScript modifies the DOM as a result ("The button disappears and is replaced by an image") +(1) An event happens ("User clicks on the page") +(2) JavaScript is aware and looks for this specific user action (The browser is listening for the event*), in this case a `click` event) +(3) JavaScript modifies the DOM as a result (\_A function that makes the body background color black is executed*) -The second step is called **listening for the event**. We do this by using a by the browser predefined function called `addEventListener()`, which we get from the `document` object. +The second step is called **listening for the event**. We do this by using a by the browser predefined function called `addEventListener()`, which we get from the `document` object in the browser. The browser needs to listen to the event in order to know what it should do ("make the body background color black") in case a certain event (`click`) happens to a certain element (`body`). The third and final step is called **handling the event**. The term "handler" effectively means "taking care of" the event; the response to the event. The handler itself is nothing more than a function that executes more JavaScript code in order to manipulate a particular part of the page (either the element that experienced the event or a totally different part of the page). +- [Events in JavaScript](https://www.youtube.com/watch?v=7UstS0hsHgI) - [JavaScript Events Tutorial](https://www.youtube.com/watch?v=e57ReoUn6kM) ## Finished? diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index 709cc5439..5641a0488 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -11,24 +11,7 @@ ## **2. JavaScript exercises** -## **3. Code along** - -- [Building a Real-World Application](https://www.youtube.com/watch?v=NYq9J-Eur9U) - -## **4. PROJECT:** - -``` -Topics discussed this week: -• Functions + JSON/Arrays -• Array Manipulations -• JSON -• Map and filter -• Arrow functions -``` - -> [Here](/Week3/README.md) you find the readings you have to complete before the third lecture. - -## Step 1: More map, filter and `=>` +# Step 1: More map, filter and `=>` _Deadline Wednesday_ @@ -114,6 +97,14 @@ Follow these steps. Each step should build on the result of the previous step. - Choose variable and parameters names that most accurately describe their contents or purpose. When naming an array, use a plural form, e.g. `durations`. For a single item, use a singular form, e.g. `duration`. For details, see [Naming Conventions](https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/naming_conventions.md). - Don't forget to use `=>`. +## **3. Code along** + +- [Building a Real-World Application](https://www.youtube.com/watch?v=NYq9J-Eur9U) + +## **4. PROJECT:** + +# + ## Step 2: Testing your homework We have provided _unit tests_ in this repo that allow you to verify that your homework produces the expected results. diff --git a/Week2/README.md b/Week2/README.md index 1a7ede07c..d1b23996a 100644 --- a/Week2/README.md +++ b/Week2/README.md @@ -4,13 +4,25 @@ These are the topics for week 3: -1. Web Storage +1. Callbacks 2. Event Loop -3. Callbacks +3. Developer Tools +4. Web Storage -## 1. What is a library? +## 1. Callbacks -## 2. What is jQuery? +## 2. Event Loop + +How does the browser know what to do first? This is where the Event Loop comes in. + +For further study, check out the following resources + +- [What the heck is an event loop?](https://www.youtube.com/watch?v=8aGhZQkoFbQ) +- [JavaScript Event Loop](https://www.youtube.com/watch?v=XzXIMZMN9k4) + +## 3. Developer Tools + +- [Google Chrome Developer Tools Crash Course](https://www.youtube.com/watch?v=8aGhZQkoFbQ) ## Finished? diff --git a/assets/simple-dom.png b/assets/simple-dom.png new file mode 100644 index 0000000000000000000000000000000000000000..2a76607d89908acf31b27609a6643d2f73d9a0c7 GIT binary patch literal 13743 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 R)!hCd<)oFRDkMxp{tq0GG{XP@ literal 0 HcmV?d00001 From ff329e591c169d588e0eb881a5dd65d7016098df Mon Sep 17 00:00:00 2001 From: Noer Paanakker Date: Wed, 7 Aug 2019 11:35:39 +0200 Subject: [PATCH 26/98] added sync vs async content, not finished --- .DS_Store | Bin 0 -> 6148 bytes README.md | 6 +- Week1/MAKEME.md | 6 +- Week1/README.md | 3 +- Week2/MAKEME.md | 67 +------------------ Week2/README.md | 100 +++++++++++++++++++--------- Week3/README.md | 26 +++++--- assets/javascript-sync-vs-async.png | Bin 0 -> 17627 bytes 8 files changed, 94 insertions(+), 114 deletions(-) create mode 100644 .DS_Store create mode 100644 assets/javascript-sync-vs-async.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..15c6b9430e53da8bb440dcfa9acbbb25ca6952a0 GIT binary patch literal 6148 zcmeHKI|>3p3{CuiU}I@HSI`p-q9?GhwNNY+1wrerJeNoF<2f}Fa^D4vJCu#=@f=%x+o4eb zDnJFO02QDDpH?6%>}dSygLxhmpaMUyfZY!TZdenWK)*ULcnbg=Anb;@_Y%Nj0bosR z0ug~}P=P_!Y%w(Gh?mT(iA`Y8MYH+Pe6wbUqW*TAUp!s326ChVRG_UuKb8}#|10>L z{=ZG)iV9GHzfwR4%k^@BPs-Zb`8cb!1-^w_&J%8ixl=HBIR<(;#=^?+)RQ8w*c|&c Vu?ciK;!X$hXTWr!QGstO@B({y6gB_= literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 50237b668..beed10039 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ If you were to ask a random person on the street the question "What is a browser?", you'll most likely get a variety of (incorrect) answers. For proof, check [this](https://www.youtube.com/watch?v=o4MwTvtyrUQ) out. -You might be one of those people right now, but after this module no more. In **JavaScript2** +You might be one of those people right now, but after this module no more. In **JavaScript2** you'll learn all about how to use JavaScript within the browser. ## Learning goals @@ -35,8 +35,8 @@ If you have any questions or if something is not entirely clear ¯\\\_(ツ)\_/¯ | Week | Topic | Reading Materials | Homework | Lesson Plan | | ---- | --------------------------------------------------- | ------------------------------ | ------------------------------- | -------------------------------------- | | 1. | Document-Object Model (DOM), DOM manipulation | [Reading W1](/Week1/README.md) | [Homework W1](/Week1/MAKEME.md) | [Lesson Plan W1](/Week1/LESSONPLAN.md) | -| 2. | Developer tools, Web Storage, Event Loop, Callbacks | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/LESSONPLAN.md) | -| 3. | SPA vs. MPA, Scope, Closures | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/LESSONPLAN.md) | +| 2. | Synchronous vs. asynchronous, Event Loop, Callbacks | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/LESSONPLAN.md) | +| 3. | Scope, Hoisting, Closures | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/LESSONPLAN.md) | ## Test diff --git a/Week1/MAKEME.md b/Week1/MAKEME.md index dd783e00f..fb4a0bfc8 100644 --- a/Week1/MAKEME.md +++ b/Week1/MAKEME.md @@ -9,6 +9,8 @@ ## **1. Practice the concepts** +- [Making webpages interactive](https://www.khanacademy.org/computing/computer-programming/html-css-js) + ## **2. JavaScript exercises** ### 1. The book list @@ -129,9 +131,9 @@ Start with this webpage, which has a single img tag of an animated GIF of a cat ## **SUBMIT YOUR HOMEWORK!** -After you've finished your todo list it's time to show us what you got! Starting from this week you'll be submitting all your homework through GitHub. What you'll be doing is upload all your files to a forked repository (a copy from the original, which in this case is the [JavaScript1](https://www.github.com/HackYourFuture/JavaScript1) repository) using GIT. +After you've finished your todo list it's time to show us what you got! Upload all your files to a forked repository (a copy from the original, which in this case is the [JavaScript2](https://www.github.com/HackYourFuture/JavaScript2) repository) using GIT. Then make a pull request to the original. -Take a look at the following [guide](../hand-in-homework-guide.md) to see how it's done. +If you need a refresher, take a look at the following [guide](../hand-in-homework-guide.md) to see how it's done.§ The homework that needs to be submitted is the following: diff --git a/Week1/README.md b/Week1/README.md index 212705421..1b44fbbe1 100644 --- a/Week1/README.md +++ b/Week1/README.md @@ -17,8 +17,6 @@ These are the topics for week 1: - Browser events - Event listeners and handlers -[DOM Crash Course](https://www.youtube.com/playlist?list=PLillGF-RfqbYE6Ik_EuXA2iZFcE082B3s) - ## 1. What is a web browser? A web browser is software that allows you to access websites. @@ -84,6 +82,7 @@ JavaScript is made accessible to the DOM by embedding it into an HTML file. You - [What exactly is the DOM](https://bitsofco.de/what-exactly-is-the-dom/) - [JavaScript and the browser](https://eloquentjavascript.net/13_browser.html) +- [JavaScript DOM Crash Course - Part 1](https://www.youtube.com/watch?v=0ik6X4DJKCc) ### The Critical Rendering Path diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index 5641a0488..7330f9ebe 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -11,7 +11,7 @@ ## **2. JavaScript exercises** -# Step 1: More map, filter and `=>` +Step 1: More map, filter and _Deadline Wednesday_ @@ -103,70 +103,6 @@ Follow these steps. Each step should build on the result of the previous step. ## **4. PROJECT:** -# - -## Step 2: Testing your homework - -We have provided _unit tests_ in this repo that allow you to verify that your homework produces the expected results. - -> **Unit test**: A _unit test_ is a piece of code (usually a function) that invokes another piece of code and checks the correctness of some assumptions afterwards. If the assumptions turn out to be wrong, the unit test has failed. A 'unit' is a method or function. -> -> Adapted from: Roy Osherove (1.09), The art of Unit Testing. Greenwich, CT: Manning. - -At this point it is not important to understand how unit tests work. The only thing you need to know now is how to run the tests and how to determine whether your homework produces the correct results. - -#### Run the tests - -You can test your week 2 homework by typing this command in the terminal window: - -``` -npm run test-week2 -``` - -You will see some output appearing in the console while the tests run. If all is well (no errors), the last couple of lines will look like this: - -``` -Test Suites: 2 passed, 2 total -Tests: 2 passed, 2 total -Snapshots: 0 total -Time: 1.849s -Ran all test suites matching /Week2\//i. -``` - -In case of unexpected results, say from _Maartjes work_ assignment, you might see something like this (you may need to scroll up a bit): - -``` -Test Suites: 1 failed, 1 passed, 2 total -Tests: 1 failed, 1 passed, 2 total -Snapshots: 0 total -Time: 1.255s -Ran all test suites matching /Week2\//i. -``` - -If that's the case, try and fix the error. When done, run the tests again: `npm run test-week2` - -Repeat the previous step until all (= 2 in this case) tests pass. - -## Step 3: ROVER - -Finish up to chapter 7: JSON on [roverjs.com](http://roverjs.com/)! - -## Step 4: **Some freeCodeCamp challenges:** - -_Deadline Saturday_ - -1. [Comparisons with the Logical And Operator](https://www.freecodecamp.com/challenges/comparisons-with-the-logical-and-operator) - -2. [Record Collection](https://www.freecodecamp.com/challenges/record-collection) - -3. [Use the map Method to Extract Data from an Array](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array) - -## Step 5: Read before next lecture - -_Deadline Sunday morning_ - -Go trough the reading material in the [README.md](/Week3/README.md) to prepare for your next class - ## **SUBMIT YOUR HOMEWORK!** After you've finished your todo list it's time to show us what you got! Starting from this week you'll be submitting all your homework through GitHub. What you'll be doing is upload all your files to a forked repository (a copy from the original, which in this case is the [JavaScript1](https://www.github.com/HackYourFuture/JavaScript1) repository) using GIT. @@ -176,5 +112,6 @@ Take a look at the following [guide](../hand-in-homework-guide.md) to see how it The homework that needs to be submitted is the following: 1. JavaScript exercises +2. PROJECT: _Deadline Saturday 23.59 CET_ diff --git a/Week2/README.md b/Week2/README.md index d1b23996a..1f8ebd754 100644 --- a/Week2/README.md +++ b/Week2/README.md @@ -1,60 +1,96 @@ -# Reading Material JavaScript2 Week 3 +# Reading Material JavaScript2 Week 2 ## Agenda -These are the topics for week 3: +These are the topics for week 2: -1. Callbacks -2. Event Loop -3. Developer Tools -4. Web Storage +1. Synchronous vs. asynchronous + - Synchronous + - Asynchronous +2. Callbacks +3. Event Loop -## 1. Callbacks +## 1. Synchronous vs. asynchronous -## 2. Event Loop +### Synchronous -How does the browser know what to do first? This is where the Event Loop comes in. +In the previous module you've learned about **control flow**. In short: it's the order in which the computer executes statements in a script. In JavaScript this goes from left to right, top to bottom. -For further study, check out the following resources +Let's look at code execution from another angle. The program that executes your code can do it in two basic ways: synchronous or asynchronous. Whenever code blocks are executed line after line (from top to bottom) we call this **synchronous execution**. -- [What the heck is an event loop?](https://www.youtube.com/watch?v=8aGhZQkoFbQ) -- [JavaScript Event Loop](https://www.youtube.com/watch?v=XzXIMZMN9k4) +Imagine the following scenario: -## 3. Developer Tools +> Noer wants to have breakfast but he doesn't have any food at home. He decides he want to eat oatmeal. The ingredients (oats and milk) can be bought at the supermarket. How to do this? First Noer takes a shower. Then he puts on some clothes. Then some shoes. Then he opens the door and goes outside. Then he jumps on the bike and goes to the closest supermarket. After looking for some time he finds the ingredients. Then Noer buys the ingredients. Then he jump back on the bike and go home. Then he mixes the ingredients and makes oatmeal. Then Noer eats and feels amazing! -- [Google Chrome Developer Tools Crash Course](https://www.youtube.com/watch?v=8aGhZQkoFbQ) +In this example, each action could only happen after the previous has been completed. Noer can't put on his shoes and then take a shower. Or, he can't eat oatmeal before he has bought the ingredients. -## Finished? +As you can see, each action is executed in a **synchronous** manner. This is to say: in a logical order sequentially and only one action at a time. -Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). +This is also how JavaScript by default operates. Only one operation can happen at a time. If something else wants to start, it has to wait until the current action has finished. + +### Asynchronous + +Sometimes we want to do multiple things, without them being dependent on each other. Consider the following analogy: + +> Wouter is feeling hungry so he decides to go to a restaurant. He arrives there and gets into the line to order food. After ordering he takes a seat and, while he waits, reads a book. Occassionally he looks around and sees different things happening: new people enter the restaurant, some people get their food served and others are just talking. After a short while Wouter's food arrives and it's time to dig in! + +In this example Wouter reads a book, but that doesn't affect his meal from being prepared. Other + +Take a look at the following diagram: + +![Sync vs. Async](../assets/javascript-sync-vs-async.png) + +```js +function first() { + console.log('this finishes first'); +} +function second() { + console.log('this finishes second'); +} -## Here are resources that we like you to read as a preparation for the coming lecture. +first(); +second(); +``` -### JSON +In this example, only after `first()` has been executed will `second()` be executed. Only one thing happens at a time, and the next thing will ONLY happen after the previous thing has finished. This synchronous execution happens predictably and sequentially, without exception. -- [JSON](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON) (MDN) +On the other hand we have -### Map and Filter +Executing each block of code (whether it's a line or a loop/function/etc.) after each other is called -- :dizzy: [Fun fun functional](https://www.youtube.com/playlist?list=PL0zVEGEvSaeEd9hlmCXrk5yUyqUag-n84) :dizzy: Check the first 3-4 videos. +This method of execution can have undesirable ramifications. Suppose a function is called to start a time consuming process. What if you want to stop the lengthy process? With synchronous execution, your program is “stuck,” waiting for the process to end, with no way out. -### Code conventions +Asynchronous execution avoids this bottleneck. You are essentially saying, “I know this function call is going to take a great deal of time, but my program doesn’t want to wait around while it executes.” -- Code conventions: http://crockford.com/javascript/code.html +## 2. Callbacks -### Array cardio +Imagine the following situation: -- Wes Bos' awesome free tutorials. Just make a free account and do Array Cardio #1 [here](https://javascript30.com/) +> It's 15.00 and you studying at home for an exam on the next day. Suddenly, your phone rings. You pick up and find it's your best friend! They ask if you'd like to hang out later. What do you do? On the one hand, you'd love to hang out have fun. On the other hand, you really should study some more. You don't know so tell your friend that you're going to call back later with your answer. You end the conversation and go back to studying. Maybe you take a short break and -### From _Eloquent JavaScript_ +By default JavaScript works **synchronously**, as we've learned in the previous section. -- Objects continued: http://eloquentjavascript.net/06_object.html +This is why callbacks are important: it allows us to introduce asynchronicity in the control flow of a program. -## Recommended readings +A concrete example for why this might be useful is when you want to -This chapter from _Eloquent JavaScript_ gives in-depth explanations of the topics that will be discussed during the lecture. Highly recommended (if time permits). +Study the following resources to learn more about the importance of callbacks: -- Chapter 3 - [Functions](http://eloquentjavascript.net/03_functions.html) -- Chapter 5 - [Higher-Order Functions](http://eloquentjavascript.net/05_higher_order.html) +- [Asynchronous JavaScript JavaScript](https://www.youtube.com/watch?v=YxWMxJONp7E) +- [Understanding JavaScript Callbacks](https://www.youtube.com/watch?v=Nau-iEEgEoM) +- [Callback Functions](https://www.youtube.com/watch?v=QRq2zMHlBz4) -_Please go through the material and come to class prepared!_ +## 3. Event Loop + +If a webpage contains JavaScript, then the browser knows it has to execute these instructions at some point. But how does the browser know what to do first? This is where the `Event Loop` comes in. + +In layman's terms, the `Event Loop` is + +For further study, check out the following resources + +- [What the heck is an event loop?](https://www.youtube.com/watch?v=8aGhZQkoFbQ) +- [JavaScript Event Loop](https://www.youtube.com/watch?v=XzXIMZMN9k4) + +## Finished? + +Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). diff --git a/Week3/README.md b/Week3/README.md index 7a7eaaf2c..b28c164ab 100644 --- a/Week3/README.md +++ b/Week3/README.md @@ -1,20 +1,26 @@ -# Reading Material JavaScript2 Week 2 +# Reading Material JavaScript2 Week 3 ## Agenda -These are the topics for week 2: +These are the topics for week 3: -1. SPA vs. MPA - - sfsdf - - sdf -2. Scope - - sdfsd - - asdas +1. Scope + + - Global vs. local (function and block) + - Const and let + +2. Hoisting 3. Closures -## 1. What is a library? +## 2. Scope + +## 3. Closures + +- [Understanding Closures](https://www.youtube.com/watch?v=rBBwrBRoOOY) + +## 4. Developer Tools -## 2. What is jQuery? +- [Google Chrome Developer Tools Crash Course](https://www.youtube.com/watch?v=8aGhZQkoFbQ) ## Finished? diff --git a/assets/javascript-sync-vs-async.png b/assets/javascript-sync-vs-async.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ef0325f1d25de9134a531f1850021bb928df15 GIT binary patch literal 17627 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 literal 0 HcmV?d00001 From c5c4bc239ec2038a30d6f748bbb2d556319940cc Mon Sep 17 00:00:00 2001 From: Noer Paanakker Date: Wed, 7 Aug 2019 17:55:06 +0200 Subject: [PATCH 27/98] added some tutorials for the code along --- .DS_Store | Bin 6148 -> 6148 bytes Week1/MAKEME.md | 5 ++--- Week2/MAKEME.md | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.DS_Store b/.DS_Store index 15c6b9430e53da8bb440dcfa9acbbb25ca6952a0..19f35c2d407a08177dbf67c9e46b596ee6108156 100644 GIT binary patch literal 6148 zcmeHK%}&BV5Z;BN3&zO7M2>s$#(^INFD4D*!JA2q9MnLYHqwYKfnuYG>1*g4`2@a> zGrNm|s7GU9rJ$Ka5JHH=0TtnYDGsaxAx*yRy1rY(;i7 z8aC{~1@=zusOu>EEDU=ew(XqzUfj-aAB90=`++wQ&c5rxlFODKxMAD~M}a#O`&e>< zu`J8B^M&!ayk9BuO6_1$lg{n^!}xLX^ekDWa0Ln3QaFVd zFlIu$vj#yg46b1mJw9iuGndzr24DRW{FEY%tH^*lFl=KLgV!-@1~db|GJy932Sqd$ zCKAQf0gWgD0Pz_i1Z=D&(1$BD6($m4282piKLQ=VPAvnyn t9JB+9g6k5A!UYCJzu~2NHo}w@#0|NsP3otMkl?4~&<>cq3Pb}1AWSsn-MRqeM+dsz5 t3LNY#8yg}SH?wo_a{x7N7UcNOJeglamlLG-01z`ww&9W993!%X830+o7S#X% diff --git a/Week1/MAKEME.md b/Week1/MAKEME.md index fb4a0bfc8..1fbdb011c 100644 --- a/Week1/MAKEME.md +++ b/Week1/MAKEME.md @@ -124,8 +124,7 @@ Start with this webpage, which has a single img tag of an animated GIF of a cat ## **3. Code along** -- [Item Lister](https://www.youtube.com/watch?v=wK2cBMcDTss) -- [Building a Real-World Application](https://www.youtube.com/watch?v=NYq9J-Eur9U) +- [Build an Issue Tracker](https://www.youtube.com/watch?v=NYq9J-Eur9U) ## **4. PROJECT: ** @@ -133,7 +132,7 @@ Start with this webpage, which has a single img tag of an animated GIF of a cat After you've finished your todo list it's time to show us what you got! Upload all your files to a forked repository (a copy from the original, which in this case is the [JavaScript2](https://www.github.com/HackYourFuture/JavaScript2) repository) using GIT. Then make a pull request to the original. -If you need a refresher, take a look at the following [guide](../hand-in-homework-guide.md) to see how it's done.§ +If you need a refresher, take a look at the following [guide](../hand-in-homework-guide.md) to see how it's done. The homework that needs to be submitted is the following: diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md index 7330f9ebe..528d19e4c 100644 --- a/Week2/MAKEME.md +++ b/Week2/MAKEME.md @@ -99,7 +99,7 @@ Follow these steps. Each step should build on the result of the previous step. ## **3. Code along** -- [Building a Real-World Application](https://www.youtube.com/watch?v=NYq9J-Eur9U) +- [Build a Rock, Paper, Scissors Game](https://www.youtube.com/watch?v=WR_pWXJZiRY) ## **4. PROJECT:** From d3304aaca44c6c8bca510934f00a5621a1f53999 Mon Sep 17 00:00:00 2001 From: Noer Paanakker Date: Wed, 21 Aug 2019 21:47:33 +0200 Subject: [PATCH 28/98] added homework guide, work on homeworks --- README.md | 26 +++--- Week1/MAKEME.md | 79 +++++++++++-------- Week2/MAKEME.md | 12 +-- Week3/MAKEME.md | 136 +++++++++++++++----------------- Week3/README.md | 59 ++++++++++++-- assets/randomquotegenerator.png | Bin 0 -> 119303 bytes hand-in-homework-guide.md | 39 +++++++++ 7 files changed, 220 insertions(+), 131 deletions(-) create mode 100644 assets/randomquotegenerator.png create mode 100644 hand-in-homework-guide.md diff --git a/README.md b/README.md index beed10039..216fc94db 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,11 @@ You might be one of those people right now, but after this module no more. In ** In order to successfully complete this module you will need to master the following: -- - -- Learn how to think like a programmer +- Understand what the DOM is +- Use the basics of DOM Manipulation +- Differentiate between synchronous and asynchronous operations +- Gain awareness of the inner workings of JavaScript +- Learn to think based on principles, instead of libraries and frameworks ## How to use this repository @@ -32,23 +34,17 @@ If you have any questions or if something is not entirely clear ¯\\\_(ツ)\_/¯ ## Planning -| Week | Topic | Reading Materials | Homework | Lesson Plan | -| ---- | --------------------------------------------------- | ------------------------------ | ------------------------------- | -------------------------------------- | -| 1. | Document-Object Model (DOM), DOM manipulation | [Reading W1](/Week1/README.md) | [Homework W1](/Week1/MAKEME.md) | [Lesson Plan W1](/Week1/LESSONPLAN.md) | -| 2. | Synchronous vs. asynchronous, Event Loop, Callbacks | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/LESSONPLAN.md) | -| 3. | Scope, Hoisting, Closures | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/LESSONPLAN.md) | +| Week | Topic | Reading Materials | Homework | Lesson Plan | +| ---- | -------------------------------------------------------- | ------------------------------ | ------------------------------- | -------------------------------------- | +| 1. | Document-Object Model (DOM), DOM manipulation | [Reading W1](/Week1/README.md) | [Homework W1](/Week1/MAKEME.md) | [Lesson Plan W1](/Week1/LESSONPLAN.md) | +| 2. | Synchronous vs. asynchronous, Event Loop, Callbacks | [Reading W2](/Week2/README.md) | [Homework W2](/Week2/MAKEME.md) | [Lesson Plan W2](/Week1/LESSONPLAN.md) | +| 3. | Scope, Hoisting, Closures, Thinking like a programmer II | [Reading W3](/Week3/README.md) | [Homework W3](/Week3/MAKEME.md) | [Lesson Plan W3](/Week1/LESSONPLAN.md) | ## Test At the end of this module you'll be doing a formative test. It will be done on **paper** and will consist of **4 exercises** that will test your JavaScript1 and JavaScript2 knowledge. -Why on paper, you might ask? Fundamental understanding should become intuitive. Only after having learned and mastered a concept deeply will you be able to use it creatively. If you rely too much on others, on Google or your code editor to do your thinking you'll make it very hard to cultivate the habit to think for yourself. - -Also important to note: this test is done for 2 reasons only. - -(1) **HackYourFuture wants to know** what skill level you are at. - -(2) The test will **give you an indication** of what skill level you are at. +Why on paper? Fundamental understanding should become intuitive. Only after having learned and mastered a concept deeply will you be able to use it creatively. If you rely too much on others, on Google or your code editor to do your thinking you'll make it very hard to cultivate the habit to think for yourself. ## Finished? diff --git a/Week1/MAKEME.md b/Week1/MAKEME.md index 1fbdb011c..8a118a827 100644 --- a/Week1/MAKEME.md +++ b/Week1/MAKEME.md @@ -5,10 +5,12 @@ 1. Practice the concepts 2. JavaScript exercises 3. Code along -4. PROJECT: +4. PROJECT: Random Quote Generator ## **1. Practice the concepts** +Before we head into the exercises, it might be nice to do some interactive exercises first! In the following resource you'll find some exercises that'll teach you the basics of the interaction between JavaScript and the DOM + - [Making webpages interactive](https://www.khanacademy.org/computing/computer-programming/html-css-js) ## **2. JavaScript exercises** @@ -20,7 +22,7 @@ I'd like to display my three favorite books inside a nice webpage! ```js const books = [ { - title: 'The Design of EveryDay Things', + title: 'The Design of Everyday Things', author: 'Don Norman', alreadyRead: false, }, @@ -36,7 +38,7 @@ const books = [ 2. For each book, create a p element with the book title and author and append it to the page. 3. Use an