From 9791dfc7a411d376e3ce4c9e82f0fda69910be66 Mon Sep 17 00:00:00 2001 From: Ruthie Irvin Date: Wed, 14 Jun 2023 17:26:55 -0500 Subject: [PATCH] additional link removed from intro-to-agile and prettier script added to package.json --- CONTRIBUTING.md | 2 +- agile-development/intro-to-agile.md | 1 - api/REST-API.md | 2 - api/apis-and-json.md | 3 +- api/intro-to-http.md | 3 +- career/conflict-resolution.md | 6 +- career/interviewing/negotiating.md | 8 +- career/roles-in-tech/roles-in-tech.md | 2 +- .../chrome-developer-tools.md | 13 +- code-challenges/Objects.md | 48 +- code-challenges/arrays.md | 58 +- code-challenges/string.md | 70 +- coding-interviews/readme.md | 3 +- data-structures/intro-to-data-structures.md | 1 + databases/data-modeling-1.md | 4 +- databases/data-modeling-2.md | 6 +- databases/install-postgres-with-docker.md | 8 +- databases/sql-1.md | 3 +- databases/sql-2.md | 29 +- datetime/datetime.md | 3 +- debugging/debugging.md | 2 - dev-tools/command-line-advanced.md | 3 +- dev-tools/operating-systems.md | 4 +- dev-tools/vscode.md | 2 - diversity-inclusion-bias/inclusion.md | 4 +- functional-programming/FP.md | 6 +- git/git-version-control.md | 1 - git/github-collaboration.md | 42 +- git/github-storage.md | 3 - giving-presentations/giving-presentations.md | 18 +- javascript/first-js-oop-project.md | 2 +- javascript/javascript-5-switch.md | 11 +- javascript/javascript-6-object-literals.md | 3 - javascript/javascript-7-oop.md | 5 +- javascript/javascript-9-async.md | 14 +- javascript/javascript-maps-and-sets.md | 20 +- javascript/javascript-modularity.md | 26 +- javascript/newer-JS-features.md | 178 +- meta/false-dead-links.md | 127 +- networking-computing/README.md | 10 +- networking-computing/intro-to-dns-ip.md | 3 +- node-js/node-js.md | 2 - objectives/week-6-assessment.md | 11 +- onboarding/ergonomics.md | 1 - onboarding/learning-to-learn.md | 4 - onboarding/pair-programming.md | 2 +- onboarding/professionalism.md | 5 +- onboarding/tech-industry-tips.md | 5 +- open-source/hackathon.md | 48 +- package-lock.json | 4521 +++++++++++------ package.json | 5 +- .../client/src/App.test.js | 6 +- .../client/src/index.css | 6 +- .../client/src/index.js | 12 +- .../client/src/reportWebVitals.js | 4 +- .../client/src/setupTests.js | 2 +- personal-brand/personal-branding.md | 10 +- practice/participants.md | 7 +- prework/6_DomExercise.html | 8 +- prework/7_FunctionsChallenges.js | 2 +- prework/8_ObjectsChallenges.js | 6 +- prework/git-udacity-instructions.md | 6 +- program-prep/financial-literacy.md | 6 +- .../client/src/components/Controller.js | 4 +- .../addSightingForm/AddSightingForm.css | 189 +- .../addSightingForm/AddSightingForm.js | 2 +- .../src/components/detail/DetailPage.css | 29 +- .../client/src/components/header/Header.css | 19 +- .../src/components/sighting/SightingList.css | 47 +- .../week-10/sample-code/client/src/index.css | 6 +- .../sample-code/client/src/reportWebVitals.js | 4 +- .../sample-code/client/src/setupTests.js | 2 +- .../server/controller/individuals.js | 2 +- .../server/controller/sightings.js | 4 +- .../server/controller/speciesController.js | 2 +- .../sample-code/server/db/db-connection.js | 2 +- .../sample-code/server/models/individuals.js | 2 +- .../sample-code/server/models/sightings.js | 4 +- .../sample-code/server/models/species.js | 2 +- .../sample-code/server/routes/routes.js | 2 +- .../week-7/weather-forecast/README.md | 2 +- .../weather-forecast/client/src/App.css | 19 +- .../weather-forecast/client/src/index.css | 6 +- .../weather-forecast/client/src/index.js | 12 +- .../client/src/reportWebVitals.js | 4 +- .../weather-forecast/client/src/setupTests.js | 2 +- .../week-7/weather-forecast/server/index.mjs | 2 +- project-example/week-9/eventonica/README.md | 1 - .../client/src/App.test.js | 6 +- .../client/src/components/UserForm.jsx | 2 +- .../client/src/reportWebVitals.js | 4 +- .../client/src/setupTests.js | 2 +- .../server/db/db-connection.js | 2 +- .../eventonica-sample-code/server/index.js | 4 +- .../eventonica/eventonica-test-frontend.md | 2 +- .../week-9/eventonica/eventonica-test-rtl.md | 4 +- .../week-9/eventonica/starter-code/events.js | 21 +- .../eventonica/starter-code/mockEvents.js | 44 +- .../week-9/eventonica/starter-code/users.js | 8 +- projects/2023TemplateWithVite/README.md | 43 +- .../2023TemplateWithVite/client/src/App.css | 7 +- .../2023TemplateWithVite/client/src/App.jsx | 15 +- .../client/src/components/Form.jsx | 224 +- .../client/src/components/ListStudents.jsx | 158 +- .../client/src/components/Navbar.jsx | 42 +- .../client/src/components/Student.jsx | 65 +- .../2023TemplateWithVite/client/src/main.jsx | 14 +- .../client/vite.config.js | 8 +- .../server/db/db-connection.js | 8 +- .../2023TemplateWithVite/server/server.js | 145 +- projects/db-modeling-assignment.md | 1 - projects/eventonica-legacy/README.md | 2 +- projects/full-stack-checklist.md | 119 +- projects/js-html-games.md | 6 +- projects/mern-pern-project.md | 1 - projects/portfolio/portfolio-webpage-1.md | 19 +- projects/portfolio/portfolio-webpage-3.md | 4 +- projects/react-game.md | 7 +- projects/recipe-page/phase-1-html-prompt.md | 2 +- projects/recipe-page/phase-2-css-prompt.md | 2 +- .../recipe-page/phase-3-bootstrap-prompt.md | 1 + .../recipe-page/phase-4-DOM-Manipulation.md | 17 +- projects/rest-api-project.md | 45 +- projects/weather-app.md | 44 +- projects/week-1-worksheet.md | 20 +- projects/week8GameREADME.md | 23 +- .../react-part-1-intro.md | 5 +- .../react-part-2-component-state.md | 143 +- .../react-part-3-component-hierarchies.md | 3 +- react-js/react-hooks.md | 52 +- react-js/react-part-1-intro.md | 25 +- react-js/react-part-2-props.md | 53 +- react-js/react-part-3-state.md | 47 +- .../react-part-4-component-hierarchies.md | 71 +- react-js/react-part-5-full-apps.md | 36 +- react-js/styling-react.md | 263 +- .../documentation.md | 1 - recursion/recursion.md | 10 +- refactoring/refactoring.md | 12 +- runtime-complexity/runtime-complexity.md | 6 +- runtime-complexity/runtime.js | 13 +- seo/seo.md | 1 + .../solving-coding-challenges.md | 1 - testing-and-tdd/jasmine-testing.md | 22 +- testing-and-tdd/jest.md | 56 +- testing-and-tdd/mocking-and-abstraction.md | 4 +- testing-and-tdd/react-testing-jest-and-RTL.md | 73 +- testing-and-tdd/testing-mindset.md | 1 - ui-ux-design/ui-ux-design.md | 2 - web/accessibility.md | 97 +- web/accessibility/aria.md | 87 +- web/ajax.md | 4 +- web/css-part-2.md | 39 +- web/css.md | 47 +- web/html-forms.md | 10 +- web/html.md | 9 +- web/js-dom-methods.md | 31 +- .../writing-readable-code.md | 1 - 158 files changed, 4685 insertions(+), 3487 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c4f9beab2..92b278fca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,4 +57,4 @@ 1. Run `npm run validate-links` to find potentially dead links. 1. Check links against [our list of false positives](./meta/false-dead-links.md) to weed out the real dead links that need fixing. 1. Fix links and submit a pull request. -1. Search & check links from github.com & codepen.io manually. These sites block bots, so we are unable to test them effectively with our tool. +1. Search & check links from github.com & codepen.io manually. These sites block bots, so we are unable to test them effectively with our tool. diff --git a/agile-development/intro-to-agile.md b/agile-development/intro-to-agile.md index 8952f9351..be340f5be 100644 --- a/agile-development/intro-to-agile.md +++ b/agile-development/intro-to-agile.md @@ -120,7 +120,6 @@ The Stacey complexity graph divides tasks into four different categories. Sources / further reading: -- [Complexity Theory Stacey Diagram](https://www.gp-training.net/training/communication_skills/consultation/equipoise/complexity/stacey.htm) - https://www.scrum-tips.com/2016/02/17/stacey-complexity-model/ _Describe step-by-step what needs to be done to prepare a cup of tea. (Baking a cake by following a recipe is another example to use). This should illustrate a defined process. Plot "making a cup of tea" on the Stacey graph._ diff --git a/api/REST-API.md b/api/REST-API.md index 043571558..a08422071 100644 --- a/api/REST-API.md +++ b/api/REST-API.md @@ -6,7 +6,6 @@ - What is a Restful API? - What is JSON? - ### Prerequisites Here are links to lessons that should be completed before this lesson: @@ -701,4 +700,3 @@ Because practice makes perfect, especially with REST APIs, work with you pair on - [Dinesh on Java](https://www.dineshonjava.com/what-is-rest-and-rest-architecture-and-rest-constraints/), to show you APIs can be built with any language but keep their familiarity. - [Future Vision on Medium](https://medium.com/future-vision/what-are-the-constraints-of-rest-and-how-they-saved-the-internet-6fb8503138ab) - [A visual blog post](https://blog.appscrip.com/what-is-restful-api-key-constraints-use-cases/) - diff --git a/api/apis-and-json.md b/api/apis-and-json.md index c81cbd2c6..85db67a16 100644 --- a/api/apis-and-json.md +++ b/api/apis-and-json.md @@ -7,8 +7,7 @@ - What is the syntax and structure of JSON - What is the difference between JSON and a Javascript Object? - What are serialization and deserialization? -- How does one read data from a JSON? - +- How does one read data from a JSON? ### Prerequisites diff --git a/api/intro-to-http.md b/api/intro-to-http.md index 41259598d..1bfe0cd74 100644 --- a/api/intro-to-http.md +++ b/api/intro-to-http.md @@ -83,8 +83,7 @@ Instead of using a browser, let's see what's happening underneath by using `nc`, Extend your Node web server above to console.log which browser the user is uses. Try out mobile browsers to see how they look different. -Hint: Add this line to your server-side Node.js code `console.log(req.headers['user-agent'])` - +Hint: Add this line to your server-side Node.js code `console.log(req.headers['user-agent'])` #### How to know what is required? diff --git a/career/conflict-resolution.md b/career/conflict-resolution.md index 54c6e8306..794bc76e8 100644 --- a/career/conflict-resolution.md +++ b/career/conflict-resolution.md @@ -6,7 +6,6 @@ - Identify common ways to address conflict - What are some ways you can become better at solving conflicts? - ### Motivation Whenever people spend more than a little time together, there will be conflict. We will learn ways to work through it while staying respectful and honest. @@ -51,9 +50,9 @@ There are some ways of handling conflict; some are better than others. Some not The key to conflict resolution is controlling how you can be honest and respectful! -#### Body Language Matters +#### Body Language Matters -How People Interpret Communciation: +How People Interpret Communciation: Word choice = 7% Body language = 55% @@ -63,7 +62,6 @@ Note that 93% of how people interpret communication is through tone and body lan Since body language and tone of voice are so important, there are some tips for how to convey positive body language, such as open arms, eye contact, upright posture, smiling, standing an appropriate distance away, etc. Some negative body language postures are closed arms, a slumped posture, no head movement, etc. - **What's important for dialogue is: Pool of Shared Meaning** - It contains the ideas, theories, feelings, thoughts, and opinions that are openly shared. diff --git a/career/interviewing/negotiating.md b/career/interviewing/negotiating.md index 545a22c08..487dd2e6d 100644 --- a/career/interviewing/negotiating.md +++ b/career/interviewing/negotiating.md @@ -74,10 +74,10 @@ Form small groups and discuss the following questions: - [Article (30 min read): Ten Rules for Negotiating a Job Offer](https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/) - [Article (30 min read): How not to bomb your offer negotation](https://medium.freecodecamp.org/how-not-to-bomb-your-offer-negotiation-c46bb9bc7dea) -- [Exactly what to say when recruiters ask you to name the first number . . . and other negotiation word-for-words](http://blog.interviewing.io/exactly-what-to-say-when-recruiters-ask-you-to-name-the-first-number/) -- [Udacity/Michelle Lai: Negotiating your Engineering Offers (1 hour webinar)](https://youtu.be/jOBbb1ly4vo) -- [How to Start A Job Offer Negotiation WITHOUT LOSING MONEY - 5 Steps!](https://youtu.be/HrLfOBoAhu0) -- [Salary Negotiation: How to Ask When You Don't Have Leverage](https://youtu.be/OHgHX6ULELI) +- [Exactly what to say when recruiters ask you to name the first number . . . and other negotiation word-for-words](http://blog.interviewing.io/exactly-what-to-say-when-recruiters-ask-you-to-name-the-first-number/) +- [Udacity/Michelle Lai: Negotiating your Engineering Offers (1 hour webinar)](https://youtu.be/jOBbb1ly4vo) +- [How to Start A Job Offer Negotiation WITHOUT LOSING MONEY - 5 Steps!](https://youtu.be/HrLfOBoAhu0) +- [Salary Negotiation: How to Ask When You Don't Have Leverage](https://youtu.be/OHgHX6ULELI) - [Top 3 Ways People Fail At Negotiation (and tips on how to fix them!)](https://youtu.be/WWc_xF18FTw) - [Breaking Into Startups Podcast, Episode #81](https://breakingintostartups.com/melissa-hereford-how-to-win-in-salary-negotiations/) - Find Salary Information: - [Triplebyte](https://triplebyte.com/software-engineer-salary) - [Glassdoor](https://www.glassdoor.com/index.htm) - [levels.fyi](https://www.levels.fyi/) - ['Blind' app for iOS/Android](https://play.google.com/store/apps/details?id=com.teamblind.blind&hl=en_US) diff --git a/career/roles-in-tech/roles-in-tech.md b/career/roles-in-tech/roles-in-tech.md index fdb8b8784..da66c6958 100644 --- a/career/roles-in-tech/roles-in-tech.md +++ b/career/roles-in-tech/roles-in-tech.md @@ -36,6 +36,6 @@ - **"Techtonica guarantees me a job as a software engineer after I complete the program."** Though we do our best to match each graduate with a sponsor company by the end of the program, we don't guarantee this outcome. If we aren't able to match you to a sponsor company, we'll mentor you through your job search and do our best to help you land your first role in tech. - **"The only employees at a tech company who really matter are the engineers."** Engineers do get a lot of attention but the engineering department is one of many, and every department is essential in a growing company. The marketing department makes sure the product that the engineers built gets out into the world and brings in revenue. The product management department makes sure good and useful products are being built by the engineers. The HR and recruiting departments make sure the best people are hired into the company and that they're treated well while they're there. It's a whole ecosystem, and every person in it has an important role to play. - ### Thought Activity + Check out some job ads for roles you might be interested in and make a list of the common skills and job responsibilities needed in order to qualify. diff --git a/chrome-developer-tools/chrome-developer-tools.md b/chrome-developer-tools/chrome-developer-tools.md index b593108be..e7fb82ce4 100644 --- a/chrome-developer-tools/chrome-developer-tools.md +++ b/chrome-developer-tools/chrome-developer-tools.md @@ -1,6 +1,5 @@ # Chrome Developer Tools - ### Motivation Chrome Developer Tools help tremendously with front-end development (HTML, CSS & JavaScript) and are also useful for running and debugging JavaScript code. @@ -26,7 +25,7 @@ Chrome Developer Tools help tremendously with front-end development (HTML, CSS & - [Chrome Developer Tools (video walkthrough of slides)](https://drive.google.com/file/d/1LV6lOI0MRKUVSaDlSipiy6JX8EtEaYjH/view?usp=sharing) - [Chrome Developer Tools (slides)](https://docs.google.com/presentation/d/1z8aIzOxV5L-zW3MZmZhX67DgyLq_4ErO4yTS4CIp7R0/edit?usp=sharing) -- [Debug JavaScript](https://developer.chrome.com/docs/devtools/javascript/) - Read on, or watch the video version +- [Debug JavaScript](https://developer.chrome.com/docs/devtools/javascript/) - Read on, or watch the video version ### Common Mistakes / Misconceptions @@ -34,7 +33,6 @@ Chrome Developer Tools help tremendously with front-end development (HTML, CSS & - **"All the source code I'll see using Chrome Dev Tools is good-quality code."** Most of the code you'll see will be good-quality code if you're looking at the website of a reputable or well-known company. There are exceptions, however. - **"I can just copy and paste whatever code I find using Chrome Dev Tools."** You should always 1) Understand the code you want to use before you put it into your own project, and 2) Give proper credit to the company or person who wrote the code. - ### Independent Practice 1. Navigate to one of your favorite websites. @@ -43,16 +41,15 @@ Chrome Developer Tools help tremendously with front-end development (HTML, CSS & 3. Open the Developer Tools pane and navigate to the "Elements" tab. - 3a. Activate the mouseover tool and hover over different elements of the webpage. - What parts of the HTML & CSS code become highlighted when you mouseover certain parts of the webpage? + 3a. Activate the mouseover tool and hover over different elements of the webpage. + What parts of the HTML & CSS code become highlighted when you mouseover certain parts of the webpage? 3b. Deactivate the mouseover tool. Click on the mobile tool and view the webpage - on a variety of screen sizes. Is the webpage responsive (elements change size - and layout based on screen size) or not? + on a variety of screen sizes. Is the webpage responsive (elements change size + and layout based on screen size) or not? 4. Open the JavaScript console. What do you see? - ### Supplemental Materials - [Quick Source Viewer Chrome Extension](https://chrome.google.com/webstore/detail/quick-source-viewer/cfmcghennfbpmhemnnfjhkdmnbidpanb?hl=en-US) diff --git a/code-challenges/Objects.md b/code-challenges/Objects.md index 95ee3e171..bd5a0d47b 100644 --- a/code-challenges/Objects.md +++ b/code-challenges/Objects.md @@ -1,65 +1,69 @@ # Code Challenges using Objects - JavaScript ## Resources: - * [Techtonica Lesson about Objects Literals](https://github.com/Techtonica/curriculum/blob/main/javascript/javascript-6-object-literals.md) + +- [Techtonica Lesson about Objects Literals](https://github.com/Techtonica/curriculum/blob/main/javascript/javascript-6-object-literals.md) ## Motivation + Techtonica's JavaScript lessons set a solid foundation in JavaScript basics so we can use the language in more robust ways in later studies. Nevertheless, you want to practice problems that use objects as a preparation for your technical interview. ## Objectives + Participants will be able to: -* Work each problem as a code challenge -* Work their solutions using functions -* Test their solutions with several test cases + +- Work each problem as a code challenge +- Work their solutions using functions +- Test their solutions with several test cases ## Things to Remember -* If a property name is composed of multiple words, the convention is to use camelCase. -* If a property name with spaces is absolutely required, then you'll only be able to use braket notation to access it's associated value. You won't be able to use dot-notation. -* Accessing the value of an Object Literal's properties with dot-notation makes the code easier to read and requires less typing. But bracket-notation allows for dynamic accessing, like what you do when you use a loop -* An Object Literal's values can be any data type, but its properties can only be strings -* Object Literals can be nested in complex ways -* All Object Literals come with some default methods, such as `.hasOwnProperty()` -* Never use reserved keywords for property names (like `function, var, switch,` etc.) +- If a property name is composed of multiple words, the convention is to use camelCase. +- If a property name with spaces is absolutely required, then you'll only be able to use braket notation to access it's associated value. You won't be able to use dot-notation. +- Accessing the value of an Object Literal's properties with dot-notation makes the code easier to read and requires less typing. But bracket-notation allows for dynamic accessing, like what you do when you use a loop +- An Object Literal's values can be any data type, but its properties can only be strings +- Object Literals can be nested in complex ways +- All Object Literals come with some default methods, such as `.hasOwnProperty()` +- Never use reserved keywords for property names (like `function, var, switch,` etc.) ### Problem Sets Question | Test Cases | Solutions -#### Problem 1 - +#### Problem 1 - -Write a function that deletes the cohortNumber property from the following object. Also print the object after deleting the property. +Write a function that deletes the cohortNumber property from the following object. Also print the object after deleting the property. -Sample object: -let Techtonica = { -studentName : "Your Name", -favoriteLanguage : "Your favorite language", +Sample object: +let Techtonica = { +studentName : "Your Name", +favoriteLanguage : "Your favorite language", cohortNumber : 3 }; Needs sample solution. -#### Problem 2 - +#### Problem 2 - Write a function that returns all the values of an object's values. - let sampleObject = { +let sampleObject = { sampleProp1: “sample value 1”, sampleProp2: “sample value 2”, sampleProp3: “sample value 3” } -objectValues() → “sample value 1”, “sample value 2”, “sample value 3” +objectValues() → “sample value 1”, “sample value 2”, “sample value 3” Needs 2 more test objects Needs sample solution -#### Problem 3 - +#### Problem 3 - Create a grades object that stores a collection of student grades in an object. Provide a function for adding a grade and a function for displaying the student’s grade average. Needs sample solution -#### Problem 4 - +#### Problem 4 - Create an object that stores individual letters in an array and has a function for displaying the letters as a single word. diff --git a/code-challenges/arrays.md b/code-challenges/arrays.md index c70a6fdf9..e3b2b17e7 100644 --- a/code-challenges/arrays.md +++ b/code-challenges/arrays.md @@ -1,49 +1,55 @@ # Code Challenges about Arrays - JavaScript ## Resources: - * [Techtonica Lesson about Arrays](https://github.com/Techtonica/curriculum/blob/main/javascript/javascript-2-array-functions.md) + +- [Techtonica Lesson about Arrays](https://github.com/Techtonica/curriculum/blob/main/javascript/javascript-2-array-functions.md) ## Motivation + Techtonica's JavaScript lessons set a solid foundation in JavaScript basics so we can use the language in more robust ways in later studies. Nevertheless, you want to practice problems that use arrays as a preparation for your technical interview. ## Objectives + Participants will be able to: -* Work each problem as a code challenge -* Work their solutions using functions -* Test their solutions with several test cases + +- Work each problem as a code challenge +- Work their solutions using functions +- Test their solutions with several test cases ## Things to Remember + Make sure that you know the answer to this questions: -* What do the methods push() and pop() do? -* How would you access the first and last item in an array? -* What does arrayName.length do? -* How would you index into the following array to get Cookie? let dessertArray = [ ["Pie", 4], ["Cupcake”, 5], ["Cookie", 12] ]; -* What's the difference and similarities between var, let and const? -* What's the difference between parameters and arguments? Show an example. -* What is the difference between local scope and global scope? + +- What do the methods push() and pop() do? +- How would you access the first and last item in an array? +- What does arrayName.length do? +- How would you index into the following array to get Cookie? let dessertArray = [ ["Pie", 4], ["Cupcake”, 5], ["Cookie", 12] ]; +- What's the difference and similarities between var, let and const? +- What's the difference between parameters and arguments? Show an example. +- What is the difference between local scope and global scope? ### Problem Sets Question | Test Cases | Solutions -#### Problem 1 - +#### Problem 1 - Write a function that takes in an array and joins all elements of the array into a string. arrayToString([“Hello”, “World”, “How”, “Are”, “You”]) → ”Hello World How Are You” -arrayToString([“l”, “Am”, “Learning”, “How”, “To”, “Code”]) → “I Am Learning How To Code” +arrayToString([“l”, “Am”, “Learning”, “How”, “To”, “Code”]) → “I Am Learning How To Code” Needs one additional test case Needs sample solution -#### Problem 2 - +#### Problem 2 - Store a set of words in an array and display the contents both forward and backward. Needs test cases Needs sample solution -#### Problem 3 - +#### Problem 3 - Given an array of ints, return true if one of the first 4 elements in the array is a 9. The array length may be less than 4. @@ -51,7 +57,8 @@ array_front9([1, 2, 9, 3, 4]) → true array_front9([1, 2, 3, 4, 9]) → false array_front9([1, 2, 3, 4, 5]) → false Needs sample solution -#### Problem 4 - + +#### Problem 4 - Given an array of ints, return true if the sequence of numbers 1, 2, 3 appears in the array somewhere. @@ -60,7 +67,8 @@ array123([1, 1, 2, 4, 1]) → false array123([1, 1, 2, 1, 2, 3]) → true Needs sample solution -#### Problem 5 - +#### Problem 5 - + Given an array of ints, return the number of 9's in the array. array_count9([1, 2, 9]) → 1 @@ -69,11 +77,11 @@ array_count9([1, 9, 9, 3, 9]) → 3 Needs sample solution -#### Problem 6 - +#### Problem 6 - Given an array of ints, return true if 6 appears as either the first or last element in the array. The array will be length 1 or more. -You must solve this in O(1) time, which means without looping through the array +You must solve this in O(1) time, which means without looping through the array first_last6([1, 2, 6]) → true first_last6([6, 1, 2, 3]) → true @@ -81,7 +89,7 @@ first_last6([13, 6, 1, 2, 3]) → false Needs sample solution -#### Problem 7 - +#### Problem 7 - Given 2 arrays of ints, a and b, return true if they have the same first element or they have the same last element. Both arrays will be length 1 or more. @@ -91,16 +99,17 @@ common_end([1, 2, 3], [1, 3]) → true Needs sample solution -#### Problem 8 - +#### Problem 8 - + Given an array of ints with a length of 3, return a new array with the elements in reverse order. reverse3([1, 2, 3]) → [3, 2, 1] reverse3([5, 11, 9]) → [9, 11, 5] reverse3([7, 0, 0]) → [0, 0, 7] - Needs sample solution -#### Problem 9 - +#### Problem 9 - + Given 2 int arrays, a and b, each length 3, return a new array length 2 containing their middle elements. middle_way([1, 2, 3], [4, 5, 6]) → [2, 5] @@ -109,7 +118,8 @@ middle_way([5, 2, 9], [1, 4, 5]) → [2, 4] Needs sample solution -#### Problem 10 - +#### Problem 10 - + Given an array of ints, return true if the array is length 1 or more, and the first element and the last element are equal. same_first_last([1, 2, 3]) → false diff --git a/code-challenges/string.md b/code-challenges/string.md index 50fc80447..a1a5dd521 100644 --- a/code-challenges/string.md +++ b/code-challenges/string.md @@ -1,28 +1,32 @@ # Code Challenges about Strings - JavaScript ## Resources: - * [Techtonica Lesson about Strings](https://github.com/Techtonica/curriculum/blob/main/javascript/javascript-1-variables.md) + +- [Techtonica Lesson about Strings](https://github.com/Techtonica/curriculum/blob/main/javascript/javascript-1-variables.md) ## Motivation + Techtonica's JavaScript lessons set a solid foundation in JavaScript basics so we can use the language in more robust ways in later studies. Nevertheless, you want to practice problems that use string as a preparation for your technical interview. ## Objectives + Participants will be able to: -* Work each problem as a code challenge -* Work their solutions using functions -* Test their solutions with several test cases + +- Work each problem as a code challenge +- Work their solutions using functions +- Test their solutions with several test cases ## Things to Remember + Strings are immutable, which means you can't get inside them and change the characters. The only way you can change the string that's associated with a particular variable name is to re-bind that variable name to an entirely new string. ### Problem Sets Question | Test Cases | Solutions -#### Problem 1 - +#### Problem 1 - Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring (i.e., “waterbottle” is a rotation of “erbottlewat”). - Test Cases: Test Case 1: @@ -32,7 +36,6 @@ s2: "erbottlewat" Expected output: true - Test Case 2: s1: "hello" @@ -40,7 +43,6 @@ s2: "oehll" Expected output: false - Test Case 3: s1 = "abcde" @@ -48,8 +50,6 @@ s2 = "cdeab" Expected output: True - - Test Case 4: s1 = "programming" @@ -57,7 +57,6 @@ s2 = "mmingprogra" Expected output: True - Test Case 5: s1 = "goodbye" @@ -65,23 +64,22 @@ s2 = "eygoodb" Expected output: False - Sample Solution: function isRotation(s1, s2) { - if (s1.length !== s2.length) { - return false; - } +if (s1.length !== s2.length) { +return false; +} - const concatenated = s1 + s1; +const concatenated = s1 + s1; - return isSubstring(concatenated, s2); +return isSubstring(concatenated, s2); } function isSubstring(str, substr) { - return str.includes(substr); - // Implementation of the isSubstring method goes here - // Returns true if `substr` is a substring of `str`, false otherwise +return str.includes(substr); +// Implementation of the isSubstring method goes here +// Returns true if `substr` is a substring of `str`, false otherwise } // Testing the isRotation function @@ -90,9 +88,8 @@ const s2 = "eygoodb"; console.log(isRotation(s1, s2)); // Output: false // Fixed a mistake here +#### Problem 2 - - -#### Problem 2 - Given a string, return a new string where "not" has been added as the first word in the string. However, if the string already begins with "not", return the string unchanged. Test Cases @@ -102,7 +99,8 @@ not_string('not bad') → 'not bad' Needs sample solution -#### Problem 3 - +#### Problem 3 - + Given a string and a non-negative int n, we'll say that the front of the string is the first 3 chars, or whatever is there if the string is less than length 3. Return n copies of the front; front_times('Chocolate', 2) → 'ChoCho' @@ -111,7 +109,8 @@ front_times('Ok', 4) → 'OkOkOkOk' Needs sample solution -#### Problem 4 - +#### Problem 4 - + Given a string and a non-negative int n, return a larger string that is n copies of the original string. string_times('Hi', 2) → 'HiHi' @@ -120,7 +119,8 @@ string_times('Hi', 1) → 'Hi' Needs sample solution -#### Problem 5 - +#### Problem 5 - + Given a non-empty string like "Code" return a string like "CCoCodCode". string_splosion('Code') → 'CCoCodCode' @@ -129,7 +129,7 @@ string_splosion('ab') → 'aab' Needs sample solution -#### Problem 6 - +#### Problem 6 - Given a string, return the count of the number of times that a substring length 2 appears in the string and also as the last 2 chars of the string, so "hixxxhi" yields 1 (we won't count the end substring). @@ -139,7 +139,8 @@ last2('axxxaaxx') → 2 Needs sample solution -#### Problem 7 - +#### Problem 7 - + Given a string, return a new string made of every other char starting with the first, so "Hello" yields "Hlo". string_bits('Hello') → 'Hlo' @@ -148,7 +149,7 @@ string_bits('Heeololeo') → 'Hello' Needs sample solution -#### Problem 8 - +#### Problem 8 - Given 2 strings, a and b, return the number of the positions where they contain the same length 2 substring. So "xxcaazz" and "xxbaaz" yields 3, since the "xx", "aa", and "az" substrings appear in the same place in both strings. @@ -158,7 +159,8 @@ string_match('abc', 'axc') → 0 Needs sample solution -#### Problem 9 - +#### Problem 9 - + Given a string representing a name, e.g. "Bob", return a greeting of the form "Hello Bob!" hello_name('Bob') → 'Hello Bob!' @@ -167,18 +169,10 @@ hello_name('X') → 'Hello X!' Needs sample solution -#### Problem 10 - +#### Problem 10 - Given an "out" string length 4, such as "<<>>", and a word, return a new string where the word is in the middle of the out string, e.g. "<>". make_out_word('<<>>', 'Yay') → '<>' make_out_word('<<>>', 'WooHoo') → '<>' make_out_word('[[]]', 'word') → '[[word]]' - - - - - - - - diff --git a/coding-interviews/readme.md b/coding-interviews/readme.md index 131b580a4..736449d69 100644 --- a/coding-interviews/readme.md +++ b/coding-interviews/readme.md @@ -1,6 +1,7 @@ # Coding Interviews This section should be used as additional material after you have already gone through the following curriculum: + - [algorithms](../algorithms/intro-to-algorithms.md) - [data-structures](../data-structures/intro-to-data-structures.md) @@ -10,7 +11,7 @@ Advisory Board Member Krys Flores wrote an entire page on her website about who _Varies_ -## Data Structures and Algorithms +## Data Structures and Algorithms ### Leetcode Style Problems diff --git a/data-structures/intro-to-data-structures.md b/data-structures/intro-to-data-structures.md index cf50bcee8..cf2096cbe 100644 --- a/data-structures/intro-to-data-structures.md +++ b/data-structures/intro-to-data-structures.md @@ -53,6 +53,7 @@ Example of people getting hired having data structure knowledge: - Classic use cases for each data structure ### Materials + - [10 Common Data Structures Explained with Videos + Exercises (20 min read. Just this page - glance at the linked content on the page, but no need to work through any of it.)](https://www.freecodecamp.org/news/10-common-data-structures-explained-with-videos-exercises-aaff6c06fb2b/) - [The top data structures you should know for your next coding interview (20 min read)](https://www.freecodecamp.org/news/the-top-data-structures-you-should-know-for-your-next-coding-interview-36af0831f5e3/) - [Article: https://www.tutorialspoint.com/data_structures_algorithms/data_structures_basics.htm](https://www.tutorialspoint.com/data_structures_algorithms/data_structures_basics.htm) diff --git a/databases/data-modeling-1.md b/databases/data-modeling-1.md index 07cfd9cdf..796c45fc4 100644 --- a/databases/data-modeling-1.md +++ b/databases/data-modeling-1.md @@ -7,12 +7,11 @@ - What is an Attribute? - What are the Data types in a DB? - What is a Primary key? -- What is a Schema? +- What is a Schema? - How do you model your data in the database? - How do you set up and use a database? - How do you query data from a database? - ### Motivation Data modeling refers to how you organize the data within your database. Data modeling is the first step to creating a database. Having incorrect data models can cause your application to have inconsistent or inaccurate data, so it's important to come up with data models that will represent your data well. @@ -176,7 +175,6 @@ Read https://www.vertabelo.com/blog/technical-articles/how-to-create-a-database- ### Independent Practice (only if time permits, day doc is key!) - Imagine you are creating a website to organize your personal recipe collection. You want to be able to: - See the recipe name and description diff --git a/databases/data-modeling-2.md b/databases/data-modeling-2.md index 3a21943f3..601fc57da 100644 --- a/databases/data-modeling-2.md +++ b/databases/data-modeling-2.md @@ -2,16 +2,15 @@ ### Week 6 Keywords and Questions -- What is a Schema? +- What is a Schema? - Give me an example of the 3 types of data relationships: - One-to-one + One-to-one One-to-many Many-to-many. - What are primary keys? - What are foreign keys? - What is database normalization? - ### Prerequisites - Data Modeling Part 1 @@ -157,7 +156,6 @@ In your own words, define the following term: What are the 3 types of database relationships? Briefly explain each one. For each one, come up with an example schema that uses the relationship. - ### Supplemental Materials - [Basic Concept of Database Normalization](https://www.youtube.com/watch?v=xoTyrdT9SZI) - 8min video diff --git a/databases/install-postgres-with-docker.md b/databases/install-postgres-with-docker.md index 225b6b218..f8be86907 100644 --- a/databases/install-postgres-with-docker.md +++ b/databases/install-postgres-with-docker.md @@ -135,7 +135,7 @@ The parameters that we are passing to the docker run command are: - -d: This parameters tells docker to start the container in detached mode dpage/pgadmin4: This parameter tells docker to use the image that we have previously downloaded -> __PS:__ If the command fails to run due with error `port is already allocated`, Open docker dashboard and stop the container that is running on port 80. +> **PS:** If the command fails to run due with error `port is already allocated`, Open docker dashboard and stop the container that is running on port 80. Let’s check that the container is up and running, @@ -149,9 +149,9 @@ To look for the IP address of the PostgreSQL container on our host, you can run $ docker inspect dev-postgres -f "{{json .NetworkSettings.Networks }}" ``` -- docker inspect: return low-level information of Docker objects, in this case, the ‘dev-postgres’ instance’s IP Adress. -- -f: parameter is to format the output as a JSON given a Go template. - +- docker inspect: return low-level information of Docker objects, in this case, the ‘dev-postgres’ instance’s IP Adress. +- -f: parameter is to format the output as a JSON given a Go template. + The output should look like this: ```json diff --git a/databases/sql-1.md b/databases/sql-1.md index 275c8cd51..1bb5798ac 100644 --- a/databases/sql-1.md +++ b/databases/sql-1.md @@ -9,7 +9,7 @@ - Update - Delete -TIP: Keep in mind you don't have to complete every exercise. There are multiple resources on each topic to make sure that people with different learning styles and paces all have access to materials that work best for them. If you understand the basics, can answer all the questions on the day doc, and have done the other assignments from Monday.com, go ahead and move on to other content. There's plenty of time to continue practicing during your projects. +TIP: Keep in mind you don't have to complete every exercise. There are multiple resources on each topic to make sure that people with different learning styles and paces all have access to materials that work best for them. If you understand the basics, can answer all the questions on the day doc, and have done the other assignments from Monday.com, go ahead and move on to other content. There's plenty of time to continue practicing during your projects. ### Prerequisites @@ -54,6 +54,7 @@ Most software applications store data of some sort -- user data, content, etc. D 1. Work through the [Codecademy SQL Tutorial](https://www.codecademy.com/learn/learn-sql) **Section 1 (Manipulation)**: 2. PostgreSQL is a popular, open-source version of SQL. Try it out: + - In Terminal, type `psql` to use PostgreSQL. - Try adding a table with the command `CREATE TABLE food (id INTEGER, name TEXT, calories INTEGER);` - See that the table was created by typing `.\dt` to see the list of all existing tables. diff --git a/databases/sql-2.md b/databases/sql-2.md index 885396d04..76a3c3941 100644 --- a/databases/sql-2.md +++ b/databases/sql-2.md @@ -7,7 +7,6 @@ - What is a query? - What are the keywords to find, remove, and change data? - ### Prerequisites - [Data Modeling 1](./data-modeling-1.md) @@ -46,26 +45,26 @@ Here's a sample schema: 1. Now enter the PostgreSQL command line program using the terminal command `psql`. Once there, use SQL statements to create two tables according to the spec for the two tables in step 0. -1. Once you have your two tables set up, compare your table set-up with someone else's. +1. Once you have your two tables set up, compare your table set-up with someone else's. -1. Add sample data to the tables yourself (make up some users and posts). +1. Add sample data to the tables yourself (make up some users and posts). -1. Try writing queries that get data such as: +1. Try writing queries that get data such as: - - All the tweets by a given user - - The 10 most recent tweets by any user - - Use a join to get a user's info along with their tweets - - Make up your own! + - All the tweets by a given user + - The 10 most recent tweets by any user + - Use a join to get a user's info along with their tweets + - Make up your own! -1. Now let's perform a database migration. We will add a new column to an existing table in our database. Add a text field named: `bio` to your existing `users` table! +1. Now let's perform a database migration. We will add a new column to an existing table in our database. Add a text field named: `bio` to your existing `users` table! -1. Add some sample data to your new `bio` fields, but not for every user (leave some of their bios blank). +1. Add some sample data to your new `bio` fields, but not for every user (leave some of their bios blank). -1. Try writing queries that get data such as: - - Just the bios of all users in the databases - - A list of users that have no bio - - Just the names of those users that have no bio - - Make up your own! +1. Try writing queries that get data such as: + - Just the bios of all users in the databases + - A list of users that have no bio + - Just the names of those users that have no bio + - Make up your own! ### Extra Challenge diff --git a/datetime/datetime.md b/datetime/datetime.md index 5cf379cc8..334c9a535 100644 --- a/datetime/datetime.md +++ b/datetime/datetime.md @@ -5,7 +5,7 @@ - What is the Date Object? - What day corresponds to 0 in Date()? - What month corresponds to 0 in Date()? -- What are the advantages of using numerical dates (milliseconds) vs. using object dates (`new Date()`)? +- What are the advantages of using numerical dates (milliseconds) vs. using object dates (`new Date()`)? - How do you add and subtract dates? ### Motivation @@ -36,7 +36,6 @@ - [Recommended alternatives](https://momentjs.com/docs/#/-project-status/recommendations/) - [Temporal](https://tc39.es/proposal-temporal/docs/) is a _very_ new API to deal with Dates in JavaScript. - ### Independent Practice if time permits - Create some dates in JavaScript. - Create your Birthday - Can you format/print a date in different formats? diff --git a/debugging/debugging.md b/debugging/debugging.md index 12132baad..c51cd2376 100644 --- a/debugging/debugging.md +++ b/debugging/debugging.md @@ -84,9 +84,7 @@ 2. Writes a program of your choosing using [REPL.it](http://www.repl.it) and place at least 1 bug in it. - ### Supplemental Resources - https://dzone.com - if StackOverflow & medium had a baby - basically a really well-organized library of technical resources, in-depth subject guides, ref cards/cheat sheets and more. The key is that they bring a teaching + journalistic approach which is fantastic. - [Debugging Tips and Tricks by Sarah Drasner](https://css-tricks.com/debugging-tips-tricks/) - diff --git a/dev-tools/command-line-advanced.md b/dev-tools/command-line-advanced.md index 8fd4450ff..3bb252dd4 100644 --- a/dev-tools/command-line-advanced.md +++ b/dev-tools/command-line-advanced.md @@ -1,4 +1,5 @@ # Advanced Command Line + # Note: I do not expect you to remember or fully understand all of these commands right now. I just want you to get exposed to the power of the command line and see what is possible. Feel free to skim this material but don't worry about a deep dive right now. ### Week 2 Keywords and Questions @@ -11,7 +12,6 @@ - How do I check what version of a program I am using? - What do the following do: grep, |, history, ls -a - ### Prerequisites [Basic command line](command-line-interface.md). @@ -363,4 +363,3 @@ description, Read through this `sed` introduction: [sed Introduction and Tutorial](http://www.grymoire.com/Unix/Sed.html#uh-10a). Then try this hacker rank problem: [Sed challenge #1](https://www.hackerrank.com/challenges/text-processing-in-linux-the-sed-command-1/problem) - diff --git a/dev-tools/operating-systems.md b/dev-tools/operating-systems.md index 56d6d5e54..94ae637c9 100644 --- a/dev-tools/operating-systems.md +++ b/dev-tools/operating-systems.md @@ -3,7 +3,7 @@ ### Week 2 Keywords and Questions - What is an operating system? (see slides) -- What operating systems do you know (see slides) +- What operating systems do you know (see slides) - How does it differ from a “normal program” (such as word) (see lesson section) - What is Linux, why do people LOOOOVVVEE it? (see supplemental materials) @@ -30,7 +30,7 @@ Whether you interact with it via the command line or through a GUI, the operatin ### Lesson - Read through lesson slides [Operating Systems](https://docs.google.com/presentation/d/1lHxgrmb1M58f7ww51_xJT8ZeB0izVfMEeZnSLsH2YmU/edit?usp=sharing) -- [From the Understanding Operating Systems resource in the slides](https://edu.gcfglobal.org/en/computerbasics/understanding-operating-systems/1/#) "Your computer's operating system (OS) manages all of the software and hardware on the computer. Most of the time, there are several different computer programs running at the same time, and they all need to access your computer's central processing unit (CPU), memory, and storage. The operating system coordinates all of this to make sure each program gets what it needs." +- [From the Understanding Operating Systems resource in the slides](https://edu.gcfglobal.org/en/computerbasics/understanding-operating-systems/1/#) "Your computer's operating system (OS) manages all of the software and hardware on the computer. Most of the time, there are several different computer programs running at the same time, and they all need to access your computer's central processing unit (CPU), memory, and storage. The operating system coordinates all of this to make sure each program gets what it needs." ### Common Mistakes / Misconceptions diff --git a/dev-tools/vscode.md b/dev-tools/vscode.md index b9af042aa..9c2f496c6 100644 --- a/dev-tools/vscode.md +++ b/dev-tools/vscode.md @@ -1,6 +1,5 @@ # VS Code - Setup and Local Development - ### Prerequisites - [Command Line Interface lesson](command-line-interface.md) @@ -60,7 +59,6 @@ Read through lesson slides [Local Development with VS Code](https://docs.google. - **"VS Code has a lot of bells and whistles, how will I ever pick them all up?"** VS Code gives you, the developer, a lot of control over your space. Some keyboard shortcuts will become second nature, while some things like setting your themes will only happen once in while -- with practice (and reference materials) everything will become second nature. - ### Independent Practice 1. Follow the instructions in the slides for downloading and installing VS Code if it is not already downloaded to your machine. diff --git a/diversity-inclusion-bias/inclusion.md b/diversity-inclusion-bias/inclusion.md index c5517d2d9..96ed78c40 100644 --- a/diversity-inclusion-bias/inclusion.md +++ b/diversity-inclusion-bias/inclusion.md @@ -4,7 +4,7 @@ Keyword: microaggression -Take *at least three* Implicit Association Test (IAT) here (https://implicit.harvard.edu/implicit/takeatest.html) to identify what your unconscious biases are. Be ready to discuss in Soft Skills. +Take _at least three_ Implicit Association Test (IAT) here (https://implicit.harvard.edu/implicit/takeatest.html) to identify what your unconscious biases are. Be ready to discuss in Soft Skills. There are multiple topics to choose from: Age, Gender, Sexuality, Skin-tone, Ethnicity, etc. @@ -69,8 +69,6 @@ From each of the concepts from the lesson, imagine where you stand (can be the c Think of when you are stressed, feeling tired, rushed, as these situations tend to activate our biases. How may these feelings influence your behavior when working with a group? Or with someone who works under you? - - ### Supplemental Materials - [Video About Unconscious Bias](https://www.youtube.com/watch?v=dloCJq8shZE) diff --git a/functional-programming/FP.md b/functional-programming/FP.md index 0d7546bf7..fecc149b8 100644 --- a/functional-programming/FP.md +++ b/functional-programming/FP.md @@ -2,10 +2,10 @@ ### Week 4 Keywords and Questions -- What is data mutation? What should I keep in mind about it? -- What do the functions map, filter, and reduce do, when would be a good example of when to use them? Does this mutate my data? +- What is data mutation? What should I keep in mind about it? +- What do the functions map, filter, and reduce do, when would be a good example of when to use them? Does this mutate my data? -#### Tip: Spend a good amount of time on this curriculum page. Map, Filter, and Reduce are important. +#### Tip: Spend a good amount of time on this curriculum page. Map, Filter, and Reduce are important. ### Prerequisites diff --git a/git/git-version-control.md b/git/git-version-control.md index d484e8bae..6d7c42a8f 100644 --- a/git/git-version-control.md +++ b/git/git-version-control.md @@ -103,7 +103,6 @@ Spend just 30 minutes working through [Git Immersion: A guided tour that walks t 2. Play through [githug](https://github.com/Gazler/githug), a command-line game for learning git. After installing it, type `githug` in your command-line prompt to play. When you think you've solved a level, type `githug` again to check your work. You'll get feedback and hints. Please complete at least up to `#32: checkout` and return to the game throughout the program to practice things like `merge` and `rebase`. - ### Extensions If you have time, continue the [Git Immersion](http://gitimmersion.com/lab_01.html) and [githug](https://github.com/Gazler/githug) tutorials if you aren't finished. Also try looking through the supplemental materials below. diff --git a/git/github-collaboration.md b/git/github-collaboration.md index 905abfd51..f78f501e4 100644 --- a/git/github-collaboration.md +++ b/git/github-collaboration.md @@ -1,6 +1,5 @@ # GitHub Collaboration - ### Prerequisite - Git version control lesson @@ -66,7 +65,7 @@ In 2020, Techtonica/curriculum renamed its default branch from `master` to `main PRO TIP: First, ask yourself, "Have I gotten through everything I need to know on a broad level in accordance with the day doc?" -- save guided practice for when you have extra time, don't prioritize it over other tasks. -0. Send your GitHub username to your program manager or an admin, and ask them to give you "Triage" access to Techtonica/curriculum. (Not Read, not Write, Triage.) +0. Send your GitHub username to your program manager or an admin, and ask them to give you "Triage" access to Techtonica/curriculum. (Not Read, not Write, Triage.) 1. Fork a GitHub repo - Navigate to https://github.com/Techtonica/curriculum/ - Click the button on the top right of the screen that says "fork" @@ -100,21 +99,16 @@ PRO TIP: First, ask yourself, "Have I gotten through everything I need to know o - Ask everyone else to pair up and do the same, then switch who is reviewing and who is making the PR & merging. - Surprise! Everyone after this should have a merge conflict. Click on the grey "resolve conflicts" button and adjust things to preserve all the names on the list so far. Click 'commit merge'. If you return to the conversation and there are no more merge conflicts, go ahead and click 'merge', then 'delete branch'. - Look at Techtonica/curriculum/practice/participants.md again. You all just collaborated on this file! -1. Practice pulling - - Add Techtonica/curriculum as a remote: - - Run `git remote -v`. You should see an output like this: - `origin https://github.com//curriculum.git (fetch) - origin https://github.com//curriculum.git (push)` - - If you do not see the URL `https://github.com/techtonica/curriculum.git` with "techtonica" in the name, which is pretty likely, you'll need to add it as a remote repo so you can pull it to keep your clone up to date. If you do have it, you can skip the adding step and go straight to pulling. - - To add it, run `git remote add techtonica https://github.com/techtonica/curriculum.git`. - - You could have also named it `upstream` by running `git remote add upstream https://github.com/techtonica/curriculum.git`, but let's stick with "techtonica" to keep it clear. For more on what's going on here, see the next section about "Adding a new remote repo". - - Check that it worked by running `git remote -v` again. You should now see: ` - origin https://github.com/alodahl/curriculum.git (fetch) - origin https://github.com/alodahl/curriculum.git (push) - techtonica https://github.com/techtonica/curriculum.git (fetch) - techtonica https://github.com/techtonica/curriculum.git (push)`. - - Now you can pull Techtonica's version of the curriculum repo: - - `git pull techtonica main` (or the name you have instead of "techtonica") +1. Practice pulling + - Add Techtonica/curriculum as a remote: - Run `git remote -v`. You should see an output like this: + `origin https://github.com//curriculum.git (fetch) + origin https://github.com//curriculum.git (push)` - If you do not see the URL `https://github.com/techtonica/curriculum.git` with "techtonica" in the name, which is pretty likely, you'll need to add it as a remote repo so you can pull it to keep your clone up to date. If you do have it, you can skip the adding step and go straight to pulling. - To add it, run `git remote add techtonica https://github.com/techtonica/curriculum.git`. - You could have also named it `upstream` by running `git remote add upstream https://github.com/techtonica/curriculum.git`, but let's stick with "techtonica" to keep it clear. For more on what's going on here, see the next section about "Adding a new remote repo". - Check that it worked by running `git remote -v` again. You should now see: ` + origin https://github.com/alodahl/curriculum.git (fetch) +origin https://github.com/alodahl/curriculum.git (push) + techtonica https://github.com/techtonica/curriculum.git (fetch) + techtonica https://github.com/techtonica/curriculum.git (push)`. + - Now you can pull Techtonica's version of the curriculum repo: + - `git pull techtonica main` (or the name you have instead of "techtonica") - Your command line may print that the merge was successful, but it is more likely that you have merge conflicts. The message will tell you which files to fix conflicts in, but of course it will be in practice/participants.md this time. - Navigate to that file, click 'their changes', then save. - Back in your command line, enter: @@ -159,10 +153,10 @@ Make another PR by checking out a new branch ### Check for Understanding - - Why do you think forks and new branches would be good tools in a team project? - - How do you keep your fork up-to-date with the shared project? - - What is the first thing you should do before working on a issue/project? - - What is the git command to create a new branch? - - Why is a good commit message important? - - What things should you check when creating a new pull request? - - How would you resolve merge conflicts? +- Why do you think forks and new branches would be good tools in a team project? +- How do you keep your fork up-to-date with the shared project? +- What is the first thing you should do before working on a issue/project? +- What is the git command to create a new branch? +- Why is a good commit message important? +- What things should you check when creating a new pull request? +- How would you resolve merge conflicts? diff --git a/git/github-storage.md b/git/github-storage.md index f15072b55..480e3b025 100644 --- a/git/github-storage.md +++ b/git/github-storage.md @@ -14,7 +14,6 @@ - What are the steps needed to get my code from my local computer up to GitHub? - Why is it important to have a .gitignore file in your project folder? - ### Prerequisites - [Command Line Interface lesson](/command-line/command-line-interface.md) @@ -78,7 +77,6 @@ GitHub is a widely-used code storage and code collaboration tool. In this lesson In the video walkthrough, the instructor demonstrates the proper GitHub workflow for creating and pushing to repos. - ### Supplemental Materials - [GitHub "Hello, World!"](https://guides.github.com/activities/hello-world/) @@ -88,4 +86,3 @@ In the video walkthrough, the instructor demonstrates the proper GitHub workflow ### Challenge Work through [this Git and GitHub tutorial for Beginners](http://product.hubspot.com/blog/git-and-github-tutorial-for-beginners), which reinforces all of the concepts we covered in this lesson, plus some more advanced topics such as branching, merging and pull requests. Fun! - diff --git a/giving-presentations/giving-presentations.md b/giving-presentations/giving-presentations.md index 121ac1ba9..080c75821 100644 --- a/giving-presentations/giving-presentations.md +++ b/giving-presentations/giving-presentations.md @@ -1,6 +1,5 @@ # Giving Presentations - ### Prerequisites - Basic comfort with Google Slides, Powerpoint, Keynote, or other presentation software of your choice. @@ -76,22 +75,22 @@ Try creating a 3-minute presentation about, say, paper cups (pick another common ### Creating slides: -- Slides help tell your story with visual clues. Listening alone can be hard for an audience; your slides help them follow along with what you're saying. - Google Slides is a web-accessible tool for creating a slide deck. -- There are other tools as well, through a web browser or locally on a computer. Google Slides also offers pre-made templates to keep formatting consistent and font size/color that's easy for your audience to see on any size screen. -- Keep it simple. No hard rules on this, but try to make 2-4 slides per minute of speech, with roughly a one-sentence maximum. Slides should enhance and support what you're saying, not replace what you're saying (slides full of text are better for reading and are often distracting or illegible to a live presentation audience). -- Visual representations help make your slides snazzy, too. Be as creative or simple as you prefer. For this example, a picture of a paper cup somewhere would be a good start, and maybe other images will help share your story +- Slides help tell your story with visual clues. Listening alone can be hard for an audience; your slides help them follow along with what you're saying. - Google Slides is a web-accessible tool for creating a slide deck. +- There are other tools as well, through a web browser or locally on a computer. Google Slides also offers pre-made templates to keep formatting consistent and font size/color that's easy for your audience to see on any size screen. +- Keep it simple. No hard rules on this, but try to make 2-4 slides per minute of speech, with roughly a one-sentence maximum. Slides should enhance and support what you're saying, not replace what you're saying (slides full of text are better for reading and are often distracting or illegible to a live presentation audience). +- Visual representations help make your slides snazzy, too. Be as creative or simple as you prefer. For this example, a picture of a paper cup somewhere would be a good start, and maybe other images will help share your story - Note: depending on where you are presenting (such as at a public event), some images found on the web (like through a Google image search) are subject to copyright restrictions. Wikimedia Commons is a common resource for free, unrestricted or attribution-only images. -- Speaker Notes: Google Slides (other tools have similar features) allows you to write notes underneath each slide that only you can see. These can help you keep track of what you plan to talk about during each slide or reminders. You can also use a physical notepad or piece of paper if you prefer. +- Speaker Notes: Google Slides (other tools have similar features) allows you to write notes underneath each slide that only you can see. These can help you keep track of what you plan to talk about during each slide or reminders. You can also use a physical notepad or piece of paper if you prefer. Presenting: -- Stand and deliver! Every venue has different setups. Practicing in as many different environments as you can help you prepare for anything that comes your way. No podium? No problem! A conference room may expect you and the audience to be seated. If you have any physical limitations or other needs, make sure you ask questions of the venue to make sure it will work for you before you arrive. +- Stand and deliver! Every venue has different setups. Practicing in as many different environments as you can help you prepare for anything that comes your way. No podium? No problem! A conference room may expect you and the audience to be seated. If you have any physical limitations or other needs, make sure you ask questions of the venue to make sure it will work for you before you arrive. - Practicing: Talking to a wall, empty room, or inanimate objects may seem silly, but they are your most neutral audience. They let you focus on your content and delivery. Plan not to read as that is very boring for audiences. If you need absolutely need some kind of notes, use a simple list with topics next to bullet points as reminders and then talk naturally about each one. -- Timing: Time usually flies or freezes while you're speaking, but definitely does not feel like normal time! Having a stopwatch or using a timer will help your practice sessions. Know whether you "run fast" (if time flies for you) or if you "run slow" (if time goes more slowly for you) while speaking. +- Timing: Time usually flies or freezes while you're speaking, but definitely does not feel like normal time! Having a stopwatch or using a timer will help your practice sessions. Know whether you "run fast" (if time flies for you) or if you "run slow" (if time goes more slowly for you) while speaking. - Water: keep a water bottle that is not difficult to open or easily spillable near you while presenting in case you need to take a sip (and make sure not to be oo noisy about sipping, especially if you have a microphone on you or nearby. - Physical movements: Not every space will allow, nor will every speaker find this helpful, but choreographing your movements during your speech can also help guide your audience and help you expend nervous energy without distracting the audience. Try taking 1-2 steps in one direction (always in front or to the side-- not backwards) while transitioning between points. While walking, say the first sentence of the next point. Stop and stay planted while delivering the rest of that section. Then, step another step or two the opposite or in another direction. See if that helps—-if it does, keep doing it! - Eye contact: it's good to make 3eye contact with different audience members when speaking in person. When on Zoom, try to look directly at the camera as much as possible. -- Tone: again, do NOT read while presenting. It is very boring and shows a lack of confidence. Bullet points as reminders are fine. Varied tones while speaking are part of what makes a speaker engaging. That variation shows that you are excited about a topic and helps others feel excited as well. Practice saying sentences with different tone variations and choose the one that sounds the most excited or as if there's an exclamation point at the end, especially if you will be presenting virtually as what feels like over-the-top cheesiness to you will seem normal to viewers. +- Tone: again, do NOT read while presenting. It is very boring and shows a lack of confidence. Bullet points as reminders are fine. Varied tones while speaking are part of what makes a speaker engaging. That variation shows that you are excited about a topic and helps others feel excited as well. Practice saying sentences with different tone variations and choose the one that sounds the most excited or as if there's an exclamation point at the end, especially if you will be presenting virtually as what feels like over-the-top cheesiness to you will seem normal to viewers. ### Common Mistakes / Misconceptions @@ -107,7 +106,6 @@ How to help avoid these: - Practice in front of a mirror, record yourself, or ask a friend to watch and take notes. This is often cringeworthy but valuable to become aware of what happens to you when you're nervous (or if you aren't nervous, how your audience perceives your behavior in a public speaking setting). Practicing 1) helps build awareness of these behaviors and 2) builds confidence and reduces nervousness. - Arrive early, if possible, to check all your computer/display settings. If you're bringing your own computer, know what ports you have in it (i.e. HDMI, VGA, Thunderbolt, etc) so you can ask for help plugging in if available. If you sent your presentation ahead of time for someone to project for you, use this time to get aquainted with the technology provided to advance your slides. - ### Challenge Try crafting a 5-minute technical presentation about a homework assignment or problem you solved recently. Technical presentations aren't that different from any other presentation, except you may find the range of visual aids to be larger—instead of just random images, you might find a screenshot of code or a dashboard you used. diff --git a/javascript/first-js-oop-project.md b/javascript/first-js-oop-project.md index 14824ebd5..23c02b34d 100644 --- a/javascript/first-js-oop-project.md +++ b/javascript/first-js-oop-project.md @@ -1,6 +1,6 @@ # Mini Project: Object Oriented Programming in JS -#### Due by 12:00pm PST the day after assigned +#### Due by 12:00pm PST the day after assigned ### Prerequisites diff --git a/javascript/javascript-5-switch.md b/javascript/javascript-5-switch.md index d1fd93490..d3c394cc5 100644 --- a/javascript/javascript-5-switch.md +++ b/javascript/javascript-5-switch.md @@ -4,11 +4,10 @@ (refer to slides and MDN article) -- What is a switch statement, when would I use one? -- Why a switch statement over an if/else? -- What is the syntax of a switch statement? -- What is the “break” part of a switch statement, and what will happen if no break statement is used? - +- What is a switch statement, when would I use one? +- Why a switch statement over an if/else? +- What is the syntax of a switch statement? +- What is the “break” part of a switch statement, and what will happen if no break statement is used? ### Prerequisites @@ -18,7 +17,6 @@ JavaScript is used on the frontend of almost every website. It's also a widely-used scripting language that be used on the backend as well. The JavaScript lessons set a solid foundation in JavaScript basics so we can use the language in more robust ways in later lessons. - ### Specific Things to Learn - when to use a switch statement @@ -36,7 +34,6 @@ JavaScript is used on the frontend of almost every website. It's also a widely-u - **There is no comparison operator in a switch statement, but there is one in the if/else statement** - ### Supplemental Materials - [JavaScript switch statements (video)](https://www.youtube.com/watch?v=7rc8aDtVFvE) diff --git a/javascript/javascript-6-object-literals.md b/javascript/javascript-6-object-literals.md index 79b3993b2..6b4653469 100644 --- a/javascript/javascript-6-object-literals.md +++ b/javascript/javascript-6-object-literals.md @@ -11,7 +11,6 @@ - Differentiate between dot and bracket notation. - How do you access nested object inside an array? - ### Prerequisites - [JavaScript 1 - Variables, Strings, Numbers Lesson](/javascript/javascript-1-variables.md) @@ -131,5 +130,3 @@ let loan = { - [JavaScript property names (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames) - [Code.org video tutorial](https://www.youtube.com/watch?v=ZunUF_WGMb4) - [Eloquent JavaScript, The Secret Life of Objects ](https://eloquentjavascript.net/06_object.html) - - diff --git a/javascript/javascript-7-oop.md b/javascript/javascript-7-oop.md index 2606686d3..db0b79f9e 100644 --- a/javascript/javascript-7-oop.md +++ b/javascript/javascript-7-oop.md @@ -1,8 +1,8 @@ # JavaScript 7 - Object-Oriented Programming -### Week 4 Tip: +### Week 4 Tip: -- There's a lot of content and links in this piece of curriculum. Don't get carried away reading every single link. Make sure you understand what's necessary, bookmark the ones that could be helpful later (or this whole currulum page), and move forward. +- There's a lot of content and links in this piece of curriculum. Don't get carried away reading every single link. Make sure you understand what's necessary, bookmark the ones that could be helpful later (or this whole currulum page), and move forward. ### Prerequisites @@ -389,7 +389,6 @@ For an extra challenge, add the following functions to the `Borrower` class and 1. `favoriteAuthor()` returns the author that the Borrower has borrowed the most books from 2. `returnBook(bookId)` removes the book with the given ID from the Borrower's list of books - ### Supplemental Resources - [Video: What is Object-Oriented Programming? (19 mins - start at 0:37 to skip intro, and 2x video speed recommended)](https://youtu.be/rlLuL3jYLvA) diff --git a/javascript/javascript-9-async.md b/javascript/javascript-9-async.md index 61d775cf3..009acc614 100644 --- a/javascript/javascript-9-async.md +++ b/javascript/javascript-9-async.md @@ -4,11 +4,10 @@ - What is a callback function? - Why do we use callbacks? -- How many things can be returned from a callback? +- How many things can be returned from a callback? - How do I get data out of a callback? - Define a promise in your own words. - ### Prerequisites - Know how to create a JavaScript function, named and anonymous. @@ -90,6 +89,7 @@ There's got to be an easier way to write things that depend on each other, right 4. Create a `Promise` and pass a callback to its `then` method. Create callback that uses `setTimeout` to mimic latency (network/database delay). The callback passed to `setTimeout` will resolve the promise (use the parameter). 5. Chain another `then` with a callback that console.logs something to show the flow of execution. + ```js // Create a variable boolean const isPersonHappy = true; @@ -100,12 +100,12 @@ const willIGetNewPhone = new Promise((resolve, reject) => { // Our code is only inside the executor. if (isPersonHappy) { const phone = { - brand: "Pixel", - color: "black", + brand: 'Pixel', + color: 'black' }; resolve(phone); } else { - const reason = new Error("The person is not happy"); + const reason = new Error('The person is not happy'); reject(reason); } }); @@ -113,7 +113,7 @@ const willIGetNewPhone = new Promise((resolve, reject) => { // This a function that returns a Promise. That Promise is constructed using a static method. const showOff = function (phone) { const message = - "Hey friend, I have a new " + phone.color + " " + phone.brand + " phone"; + 'Hey friend, I have a new ' + phone.color + ' ' + phone.brand + ' phone'; return Promise.resolve(message); // This is equivalent to using this constructor for the Promise Object @@ -132,7 +132,6 @@ const askPerson = function () { askPerson(); ``` - In general, you don't create promises. You work with promises while doing asynchronous tasks. ```js @@ -174,7 +173,6 @@ Play around in your favorite browser's dev console using the fetch method to und - Look at the object returned by creating a promise. What properties does it have? Look for its `status`. - Check its `status` again, has it changed? - ### Supplemental Materials - [Using Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) diff --git a/javascript/javascript-maps-and-sets.md b/javascript/javascript-maps-and-sets.md index 08ae41371..9edf10668 100644 --- a/javascript/javascript-maps-and-sets.md +++ b/javascript/javascript-maps-and-sets.md @@ -17,16 +17,17 @@ ES6 brought with it some powerful upgrades, and the inclusion of Maps and Sets are two of them. -A Map is a collection of elements where each element is stored as a Key, value pair. -- Map object can hold both objects and primitive values as either key or value. -- You can use objects of all kinds as map keys. +A Map is a collection of elements where each element is stored as a Key, value pair. + +- Map object can hold both objects and primitive values as either key or value. +- You can use objects of all kinds as map keys. - The system will not automatically convert the keys to strings as it does for object literals. -- Unlike with objects, map keys can be of any type, even objects or functions. +- Unlike with objects, map keys can be of any type, even objects or functions. - With maps we can iterate in the order in which the values were added, unlike objects where there’s no guarantee about the order. A Set is a special type collection – “set of values” (without keys), where each value may occur only once. -- The values in a set can be either simple primitives like strings or integers, or more complex object types like object literals or arrays +- The values in a set can be either simple primitives like strings or integers, or more complex object types like object literals or arrays ## Materials @@ -37,13 +38,10 @@ A Set is a special type collection – “set of values” (without keys), where - [Let's Learn ES6 - Map & Set (20 min video)](https://www.youtube.com/watch?v=4B4Q0EZVPU8) - A simple video demonstrating maps & sets. - Reference: [geeksforgeeks.org](https://www.geeksforgeeks.org/map-in-javascript/) - ### When to use map? And when to use object? - - Object is the great choice for scenarios when we only need simple structure to store data and knew that all the keys are either strings or integers, because creating plain object and accessing object’s property with a specific key is much faster than creating a map. - - - Map preserves the order of its keys unlike object, and map was built with iteration in mind, so in case iteration or elements order are highly significant, consider map — it will ensure stable iteration performance in all browsers. - - - Map tends to perform better in storing large set of data, especially when keys are unknown until run time, and when all keys are the same type and all values are the same type. +- Object is the great choice for scenarios when we only need simple structure to store data and knew that all the keys are either strings or integers, because creating plain object and accessing object’s property with a specific key is much faster than creating a map. +- Map preserves the order of its keys unlike object, and map was built with iteration in mind, so in case iteration or elements order are highly significant, consider map — it will ensure stable iteration performance in all browsers. +- Map tends to perform better in storing large set of data, especially when keys are unknown until run time, and when all keys are the same type and all values are the same type. diff --git a/javascript/javascript-modularity.md b/javascript/javascript-modularity.md index 4ccf7ea3e..1fd75e9c7 100644 --- a/javascript/javascript-modularity.md +++ b/javascript/javascript-modularity.md @@ -50,7 +50,7 @@ This leads to an application structure that looks more like: └── Modal.jsx ``` -You will see both of these structures in use in real-world applications, and you might even see them both used in one application. +You will see both of these structures in use in real-world applications, and you might even see them both used in one application. ### Guided Practice @@ -64,11 +64,9 @@ const App = () => { setUserInput(event.target.value)} value={userInput} - type='number' + type="number" /> -
- Your value plus one is {userInput + 1} -
+
Your value plus one is {userInput + 1}
); }; @@ -94,13 +92,15 @@ So given those three things, you could break your application up like this: `operations.js` would only be concerned with manipulating data: ```js -export function addOne(n) { return n+1; } +export function addOne(n) { + return n + 1; +} ``` `Input.jsx` would collect user input: ```jsx -import {addOne} from './operations'; +import { addOne } from './operations'; const Input = () => { const [userInput, setUserInput] = React.useState(0); @@ -109,11 +109,9 @@ const Input = () => { setUserInput(event.target.value)} value={userInput} - type='number' + type="number" /> -
- Your value plus one is {addOne(userInput)} -
+
Your value plus one is {addOne(userInput)}
); }; @@ -125,7 +123,11 @@ export default Input; ```jsx import Input from './Input'; -const App = () =>
; +const App = () => ( +
+ +
+); root.render(); ``` diff --git a/javascript/newer-JS-features.md b/javascript/newer-JS-features.md index 74a95e8a1..59233fd45 100644 --- a/javascript/newer-JS-features.md +++ b/javascript/newer-JS-features.md @@ -13,10 +13,9 @@ About 2 hours - Techtonica's JS workshop - [Basic JS practice](https://github.com/Techtonica/curriculum/blob/main/javascript/basic-js-practice.md) - ### Motivation -ECMAScript 2015, or ES6 introduced many important and useful features that modernized the JavaScript language and helps us to speed the development process. +ECMAScript 2015, or ES6 introduced many important and useful features that modernized the JavaScript language and helps us to speed the development process. ### Objectives @@ -24,145 +23,180 @@ ECMAScript 2015, or ES6 introduced many important and useful features that moder - Take advantage of ES6's new default params. - Use spread operator with arrays, functions and objects. -- Know the difference between spread and rest operator. +- Know the difference between spread and rest operator. - Use of Destructuring Assignment - - ## Lesson [Modern JS Features slides](https://docs.google.com/presentation/d/138TkIVXTaRS3ciGYZ8A62q1QVaoA0ACcTmqVDjFv8-4/edit#slide=id.gced263eb5d_0_167) -### Things to Remember -- **No browser fully supports ES6**, to check browser support [Can I Use](https://caniuse.com/) is a great resource. +### Things to Remember +- **No browser fully supports ES6**, to check browser support [Can I Use](https://caniuse.com/) is a great resource. ### Default Params -The default param is a way to set default values when the function parameter has undefined values. + +The default param is a way to set default values when the function parameter has undefined values. #### Example + Let's look at a function multiply, which takes a and b as parameters. //old javascript + ```javascript -function multiply(a,b) { - return a * b; +function multiply(a, b) { + return a * b; } -multiply(5, 6) // 30 +multiply(5, 6); // 30 ``` + What if, we forget to pass value for b? We'll get NaN. -To avoid getting NaN, we can have a default value set for b. +To avoid getting NaN, we can have a default value set for b. + ```javascript -function multiply(a,b) { - b = typeof b !== 'undefined' ? b:2; - return a * b; +function multiply(a, b) { + b = typeof b !== 'undefined' ? b : 2; + return a * b; } -multiply(5) // 10 +multiply(5); // 10 ``` -Here, I've used JS ternary operator to check the condition for b. If b has an undefined value, then the default value of 2 is assigned to b. When we call the function with 5, we'll get 10. -##### Same Code With ES6 +Here, I've used JS ternary operator to check the condition for b. If b has an undefined value, then the default value of 2 is assigned to b. When we call the function with 5, we'll get 10. + +##### Same Code With ES6 + ```javascript const multiply = (a, b = 10) => { - return a * b; -} -multiply(5) // 50. + return a * b; +}; +multiply(5); // 50. ``` -In the example above, if no value is passed for b, i.e if b is undefined, it'll get a default value of 10. This is a much nicer and shorter syntax. + +In the example above, if no value is passed for b, i.e if b is undefined, it'll get a default value of 10. This is a much nicer and shorter syntax. ### Spread Operator + The Spread (...) operator is a useful and newer syntax for adding items to arrays, combining arrays or objects, and spreading an array out into a function’s arguments. **Some scenarios where Spread is useful:** + - Copying an array - Concatenating or combining arrays - Merge two objects #### Examples + ##### Spread in Function Calls + We can use Math.max to get the greatest number from a list. + ```javascript -Math.max(2,3,4,5,6) // 6 +Math.max(2, 3, 4, 5, 6); // 6 ``` + Here, Math.max is expecting separate arguments to be passed in and it'll give us the maximum value. But, what if we use Math.max on an array? + ```javascript -Math.max([2,3,4,5]); // Nan +Math.max([2, 3, 4, 5]); // Nan ``` + Here, we got NaN because Math.max is expecting seperate values each one being a number. Luckily we have Spread to the rescue. Spread syntax uses three dots ... to spread the array as seperate arguments. ```javascript -Math.max(...[2,3,4]); // 4 (spread expands array into seperate arguments) +Math.max(...[2, 3, 4]); // 4 (spread expands array into seperate arguments) ``` + ##### Spread with Arrays + Spread in array literals creates a new array using an existing array. It basically spreads the elements from one array into a new array. Let's look an example - -Here, I've 2 arrays primaryColors and secondaryColors. allColors array contain all the elemnts from primaryColors and secondaryColors. ... spread the values into seperate arguments. allColors contains copy of primaryColors and secondarycolors but the original arrays remains unchanged! +Here, I've 2 arrays primaryColors and secondaryColors. allColors array contain all the elemnts from primaryColors and secondaryColors. ... spread the values into seperate arguments. allColors contains copy of primaryColors and secondarycolors but the original arrays remains unchanged! + ```javascript const primaryColors = ['red', 'green', 'blue']; -const secondaryColors = ['purple','pink', 'crimson']; -const allColors = [...primaryColors, ...secondaryColors] // (6)["red", "green", "blue", "purple", "pink", "crimson"] +const secondaryColors = ['purple', 'pink', 'crimson']; +const allColors = [...primaryColors, ...secondaryColors]; // (6)["red", "green", "blue", "purple", "pink", "crimson"] ``` + ##### Spread with objects + Spread in object literal copies properties from one object into another object. In past, we've used Object.assign to copy properties from one object to another. Spread makes copying more easy! + ```javascript const personA = { - favColor:"pink" -} + favColor: 'pink' +}; const personB = { - favFood:"pasta" -} -const info = {...personA, ...personB} + favFood: 'pasta' +}; +const info = { ...personA, ...personB }; console.log(info); // {favColor: "pink", favFood: "pasta"} ``` -In case of conflict where both objects have similar properties, order matters! + +In case of conflict where both objects have similar properties, order matters! + ```javascript const personC = { - favColor:"pink", - favPet:"cat" -} + favColor: 'pink', + favPet: 'cat' +}; const personD = { - favFood:"pasta", - favPet:"dog" -} -const anotherInfo = {...personA, ...personB } // {favColor: "pink", favPet: "dog", favFood: "pasta"} + favFood: 'pasta', + favPet: 'dog' +}; +const anotherInfo = { ...personA, ...personB }; // {favColor: "pink", favPet: "dog", favFood: "pasta"} ``` + ### Rest parameters -`rest` parameters allows a function to accept an indefinite numbers of arguments as an array. `rest` looks like spread, but it’s NOT spread. Before taking a look at `rest`, let's take a look at [`arguments` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) which is an array like an object but it doesn't have access to array like methods like `map()` and `reduce()`. Also, it's not available with an _arrow function_. It automatically holds all the values passed to the function. + +`rest` parameters allows a function to accept an indefinite numbers of arguments as an array. `rest` looks like spread, but it’s NOT spread. Before taking a look at `rest`, let's take a look at [`arguments` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) which is an array like an object but it doesn't have access to array like methods like `map()` and `reduce()`. Also, it's not available with an _arrow function_. It automatically holds all the values passed to the function. + #### Examples + ```javascript function sum() { - console.log(arguments) // collects all arguments passed to the function. + console.log(arguments); // collects all arguments passed to the function. } -sum(2,3,4,5) // Arguments(3) [2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ] +sum(2, 3, 4, 5); // Arguments(3) [2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ] ``` + It contains all values that we passed into the function by order, but we can't use array like methods like `reduce`. Here, let's write a function that will give sum of all the elements in the array. + ```javascript function sum() { - return arguments.reduce((total, acc) => total + acc); -} -sum(2,3,4,5,6) // arguments.reduce is not a function + return arguments.reduce((total, acc) => total + acc); +} +sum(2, 3, 4, 5, 6); // arguments.reduce is not a function ``` -This is where `rest` comes in. `rest` collects all remaining arguments, or the _rest_ of the arguments, and puts them into an array. The dots mean "gather the rest of the parameters into an array", so the `rest` parameters must be at the end. `rest` is the opposite of _spread_. In _spread_, we're spreading things out, but in `rest` we're collecting all things into a single parameter. + +This is where `rest` comes in. `rest` collects all remaining arguments, or the _rest_ of the arguments, and puts them into an array. The dots mean "gather the rest of the parameters into an array", so the `rest` parameters must be at the end. `rest` is the opposite of _spread_. In _spread_, we're spreading things out, but in `rest` we're collecting all things into a single parameter. ```javascript -function sumOfAllArray (...arr) { - let total = 0; - for (let i of arr) total +=i; - return total; +function sumOfAllArray(...arr) { + let total = 0; + for (let i of arr) total += i; + return total; } -console.log("The sum of array is: ", sumOfAllArray(3,4,5)); // 12 +console.log('The sum of array is: ', sumOfAllArray(3, 4, 5)); // 12 ``` ### Destructuring Assignment + Destructuring assignment syntax allows us to unpack or extract or single out values from arrays, properties from objects into distinct variables. With array destructuring, we can copy items into variables without modifying the original array. #### Examples + ##### Array destructuring -Let's look at numbers array. Variable `max` contains the first element of the array and `secondMax` contains the second element of the array and so on. Old way of doing it would be: + +Let's look at numbers array. Variable `max` contains the first element of the array and `secondMax` contains the second element of the array and so on. Old way of doing it would be: + ```javascript -let numbers = [6, 5, 4, 3]; +let numbers = [6, 5, 4, 3]; let max = numbers[0]; let secondMax = numbers[1]; ``` + With ES6 new syntax, extracting or singling out values becomes much easier. Instead of doing `arr[0]` or `arr[1]` we can do: + ```javscript const [max, secondMax, ...lowerNumbers] = numbers; console.log(max); // Here max is holding the value of numbers[0]; @@ -170,45 +204,55 @@ console.log(secondMax); // 5 console.log(lowerNumbers); // We've used spread to singling out the remaining values [4,3] console.log(numbers); // numbers is unchanged. ``` + ##### Object destructuring -Object destructuring is the most powerful and useful syntax as in object order doesn't matter but in array order matters. + +Object destructuring is the most powerful and useful syntax as in object order doesn't matter but in array order matters. + ```javascript const user = { - email:"johndoe@gmail.com", - password:"12345", - firstName:"John", - lastName:"Doe" -} + email: 'johndoe@gmail.com', + password: '12345', + firstName: 'John', + lastName: 'Doe' +}; ``` + Here, I want to extract few properties from user object. Old way of doing it + ```javascript const email = user.email; const lastName = user.lastName; ``` + It is quite time consuming to do the same thing over and over again for all the properties. An easier way is to destructure is. Here we didn't change the original object in any ways, we just extracted the values from the user object. + ```javascript -const {email, password} = user; //equivalent to saying const email = user.email; -console.log(email) // renunikhilp@gmail.com +const { email, password } = user; //equivalent to saying const email = user.email; +console.log(email); // renunikhilp@gmail.com ``` + ## Test your knowledge + What do you expect to be the value of `second` after running the following code? ```javascript let students = ['Tom', 'Jerry', 'Goofy', 'Felix']; let [first, second, third] = students; ``` + 1. Tom 2. Goofy -3. **Jerry** +3. **Jerry** 4. Felix - **Instructions:** Use the spread operator to combine the `fruits` and `vegetables` arrays into the `produce` array. **The Starter Code:** + ```javascript -const fruits = ["apples", "bananas", "peach"]; -const vegetables = ["corn", "spinach", "carrots"]; +const fruits = ['apples', 'bananas', 'peach']; +const vegetables = ['corn', 'spinach', 'carrots']; const produce = []; console.log(produce); ``` diff --git a/meta/false-dead-links.md b/meta/false-dead-links.md index d300aa757..11a24976d 100644 --- a/meta/false-dead-links.md +++ b/meta/false-dead-links.md @@ -1,111 +1,112 @@ # List of false "dead links" + > The following may appear in our `validate-links` script, but they are likely false positives whose URLs work fine: api\http-request-practice.md - 213:3-213:42 warning Link to https://github.com/axios/axios is dead +213:3-213:42 warning Link to https://github.com/axios/axios is dead career\interviewing\negotiating.md - 81:13-81:101 warning Link to https://github.com/jlevy/og-equity-compensation is dead +81:13-81:101 warning Link to https://github.com/jlevy/og-equity-compensation is dead career\roles-in-tech\data-science.md - 79:3-79:63 warning Link to https://www.datacamp.com is dead +79:3-79:63 warning Link to https://www.datacamp.com is dead career\roles-in-tech\security.md - 152:76-152:173 warning Link to https://www.cloudflare.com/learning/security/glossary/what-is-penetration-testing/ is dead - 194:3-194:51 warning Link to https://www.linkedin.com/in/whsaito/ is dead +152:76-152:173 warning Link to https://www.cloudflare.com/learning/security/glossary/what-is-penetration-testing/ is dead +194:3-194:51 warning Link to https://www.linkedin.com/in/whsaito/ is dead career\roles-in-tech\technical-program-manager.md - 123:3-123:121 warning Link to https://www.pmi.org/learning/library/roles-responsibilities-skills-program-management-6799 is dead +123:3-123:121 warning Link to https://www.pmi.org/learning/library/roles-responsibilities-skills-program-management-6799 is dead databases\relational-databases.md - 146:11-146:105 warning Link to https://github.com/JNOSQL/artemis-demo/tree/master/artemis-demo-java-se/graph-neo4j is dead +146:11-146:105 warning Link to https://github.com/JNOSQL/artemis-demo/tree/master/artemis-demo-java-se/graph-neo4j is dead deploying\deploying-to-heroku.md - 190:117-190:183 warning Link to https://github.com/FTraian/node-express-postgresql-heroku-tutorial is dead +190:117-190:183 warning Link to https://github.com/FTraian/node-express-postgresql-heroku-tutorial is dead electives\data-visualization.md - 59:16-59:79 warning Link to https://github.com/d3/d3/blob/master/CHANGES.md is dead - 269:3-269:58 warning Link to https://github.com/d3/d3/wiki/Tutorials is dead +59:16-59:79 warning Link to https://github.com/d3/d3/blob/master/CHANGES.md is dead +269:3-269:58 warning Link to https://github.com/d3/d3/wiki/Tutorials is dead electives\mobile-development.md - 83:3-83:80 warning Link to https://github.com/BohdanOrlov/iOS-Developer-Roadmap is dead +83:3-83:80 warning Link to https://github.com/BohdanOrlov/iOS-Developer-Roadmap is dead electives\mocha-testing.md - 285:8-285:66 warning Link to https://github.com/mochajs/mocha/tree/master/test is dead - 285:71-285:126 warning Link to https://github.com/chaijs/chai/tree/master/test is dead - 296:43-296:95 warning Link to https://github.com/webdevjourneyWDJ/Todo-API is dead +285:8-285:66 warning Link to https://github.com/mochajs/mocha/tree/master/test is dead +285:71-285:126 warning Link to https://github.com/chaijs/chai/tree/master/test is dead +296:43-296:95 warning Link to https://github.com/webdevjourneyWDJ/Todo-API is dead electives\optimization\optimizing-your-react-node-project.md - 116:12-116:73 warning Link to https://github.com/facebook/react-devtools is dead +116:12-116:73 warning Link to https://github.com/facebook/react-devtools is dead git\github-collaboration.md - 75:18-75:59 warning Link to https://github.com/Techtonica/curriculum/ is dead +75:18-75:59 warning Link to https://github.com/Techtonica/curriculum/ is dead git\github-storage.md - 48:4-48:107 warning Link to https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 is dead - ***Doesn't always load in time, but is not dead*** - ***I put a ticket into Github. There are so many comments on this page that it keeps it from loading properly a lot of the time. - I put notes in the learning material mentioning to keep trying the link if it doesn't load*** +48:4-48:107 warning Link to https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 is dead +**_Doesn't always load in time, but is not dead_** +**_I put a ticket into Github. There are so many comments on this page that it keeps it from loading properly a lot of the time. +I put notes in the learning material mentioning to keep trying the link if it doesn't load_** node-js\node-lab-exercise-part-2.md - 170:186-170:207 warning Link to http://127.0.0.1:3000 is dead - 170:264-170:285 warning Link to http://localhost:3000 is dead - 268:48-268:69 warning Link to http://localhost:3000 is dead - ***Localhost Links*** +170:186-170:207 warning Link to http://127.0.0.1:3000 is dead +170:264-170:285 warning Link to http://localhost:3000 is dead +268:48-268:69 warning Link to http://localhost:3000 is dead +**_Localhost Links_** onboarding\pair-programming.md - 79:143-79:218 warning Link to https://codepen.io/ulfiw/pen/YQoQgx is dead +79:143-79:218 warning Link to https://codepen.io/ulfiw/pen/YQoQgx is dead open-source\open-source.md - 71:29-71:117 warning Link to https://github.com/Growstuff/growstuff is dead - 71:184-71:260 warning Link to https://github.com/freeCodeCamp/freeCodeCamp is dead - 71:304-71:390 warning Link to https://github.com/OperationCode/operationcode_frontend is dead - 80:1-80:74 warning Link to https://github.com/OperationCode/operationcode_frontend is dead +71:29-71:117 warning Link to https://github.com/Growstuff/growstuff is dead +71:184-71:260 warning Link to https://github.com/freeCodeCamp/freeCodeCamp is dead +71:304-71:390 warning Link to https://github.com/OperationCode/operationcode_frontend is dead +80:1-80:74 warning Link to https://github.com/OperationCode/operationcode_frontend is dead projects\eventonica\eventonica-part3-jquery-ui.md - 101:143-101:199 warning Link to https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 is dead - ***Doesn't always load in time, but is not dead*** - ***I put a ticket into Github. There are so many comments on this page that it keeps it from loading properly a lot of the time. - I put notes in the learning material mentioning to keep trying the link if it doesn't load*** +101:143-101:199 warning Link to https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 is dead +**_Doesn't always load in time, but is not dead_** +**_I put a ticket into Github. There are so many comments on this page that it keeps it from loading properly a lot of the time. +I put notes in the learning material mentioning to keep trying the link if it doesn't load_** projects\node-http-exercise\node-http-exercise.md - 280:32-280:54 warning Link to http://localhost:5000/ is dead - 281:32-281:58 warning Link to http://localhost:5000/test is dead - 282:32-282:58 warning Link to http://localhost:5000/spin is dead - 283:32-283:60 warning Link to http://localhost:5000/hangup is dead - 284:32-284:58 warning Link to http://localhost:5000/head is dead - 285:32-285:59 warning Link to http://localhost:5000/hello is dead - 286:32-286:79 warning Link to http://localhost:5000/echo?message=Node_is_cool is dead - 287:32-287:59 warning Link to http://localhost:5000/error is dead - 288:32-288:63 warning Link to http://localhost:5000/time.json is dead - 289:32-289:60 warning Link to http://localhost:5000/github is dead - 290:32-290:67 warning Link to http://localhost:5000/anything_else is dead - ***Localhost Links*** +280:32-280:54 warning Link to http://localhost:5000/ is dead +281:32-281:58 warning Link to http://localhost:5000/test is dead +282:32-282:58 warning Link to http://localhost:5000/spin is dead +283:32-283:60 warning Link to http://localhost:5000/hangup is dead +284:32-284:58 warning Link to http://localhost:5000/head is dead +285:32-285:59 warning Link to http://localhost:5000/hello is dead +286:32-286:79 warning Link to http://localhost:5000/echo?message=Node*is_cool is dead +287:32-287:59 warning Link to http://localhost:5000/error is dead +288:32-288:63 warning Link to http://localhost:5000/time.json is dead +289:32-289:60 warning Link to http://localhost:5000/github is dead +290:32-290:67 warning Link to http://localhost:5000/anything_else is dead +\*\*\_Localhost Links*\*\* projects\submitting-work.md - 17:75-17:126 warning Link to https://github.com/YOUR-NAME/techtonica-assignments is dead - 18:86-18:142 warning Link to https://github.com/SEAM/techtonica-assignments-YOUR-NAME is dead - ***Example links*** +17:75-17:126 warning Link to https://github.com/YOUR-NAME/techtonica-assignments is dead +18:86-18:142 warning Link to https://github.com/SEAM/techtonica-assignments-YOUR-NAME is dead +**_Example links_** react-js\react-part-1-intro.md - 50:4-50:76 warning Link to http://codepen.io/marcacyr/pen/NAyqgX is dead - 51:4-51:80 warning Link to http://codepen.io/marcacyr/pen/bZLVbj is dead - 52:4-52:72 warning Link to http://codepen.io/marcacyr/pen/rLJVqR is dead - 53:4-53:95 warning Link to http://codepen.io/marcacyr/pen/KrQpYb is dead - 67:1-67:67 warning Link to https://codepen.io/jamesjose03/pen/ExVjYBM is dead - 73:1-73:67 warning Link to https://codepen.io/jamesjose03/pen/xxwGKvN is dead - 79:1-79:67 warning Link to https://codepen.io/jamesjose03/pen/PoPqoqp is dead - 90:3-90:75 warning Link to https://codepen.io/jamesjose03/pen/jOPRwVm is dead - 91:14-91:67 warning Link to https://codepen.io/jamesjose03/pen/jOPRwVm is dead - 106:3-106:75 warning Link to https://codepen.io/jamesjose03/pen/jOPRwVm is dead +50:4-50:76 warning Link to http://codepen.io/marcacyr/pen/NAyqgX is dead +51:4-51:80 warning Link to http://codepen.io/marcacyr/pen/bZLVbj is dead +52:4-52:72 warning Link to http://codepen.io/marcacyr/pen/rLJVqR is dead +53:4-53:95 warning Link to http://codepen.io/marcacyr/pen/KrQpYb is dead +67:1-67:67 warning Link to https://codepen.io/jamesjose03/pen/ExVjYBM is dead +73:1-73:67 warning Link to https://codepen.io/jamesjose03/pen/xxwGKvN is dead +79:1-79:67 warning Link to https://codepen.io/jamesjose03/pen/PoPqoqp is dead +90:3-90:75 warning Link to https://codepen.io/jamesjose03/pen/jOPRwVm is dead +91:14-91:67 warning Link to https://codepen.io/jamesjose03/pen/jOPRwVm is dead +106:3-106:75 warning Link to https://codepen.io/jamesjose03/pen/jOPRwVm is dead react-js\react-part-2-component-state.md - 188:106-188:163 warning Link to https://codepen.io/ashish24_nagpal/pen/jObzXzM is dead - 276:26-276:96 warning Link to https://codepen.io/ashish24_nagpal/pen/oNjyeeo?editors=1111 is dead +188:106-188:163 warning Link to https://codepen.io/ashish24_nagpal/pen/jObzXzM is dead +276:26-276:96 warning Link to https://codepen.io/ashish24_nagpal/pen/oNjyeeo?editors=1111 is dead react-js\react-part-3-component-hierarchies.md - 282:1-282:66 warning Link to https://codepen.io/annu12340/pen/dyYvVWB?editors=1010 is dead - 400:4-400:57 warning Link to https://codepen.io/CandiceL/pen/MQwyYp is dead +282:1-282:66 warning Link to https://codepen.io/annu12340/pen/dyYvVWB?editors=1010 is dead +400:4-400:57 warning Link to https://codepen.io/CandiceL/pen/MQwyYp is dead web\ajax.md - 128:50-128:107 warning Link to https://codepen.io/ashish24_nagpal/pen/NWqXjWN is dead +128:50-128:107 warning Link to https://codepen.io/ashish24_nagpal/pen/NWqXjWN is dead diff --git a/networking-computing/README.md b/networking-computing/README.md index 6113d8db6..12fabe0cb 100644 --- a/networking-computing/README.md +++ b/networking-computing/README.md @@ -2,16 +2,16 @@ ### Week 2 Keywords and Questions -- What is an IP address? (Can you figure out what is your IP address? )Your device +- What is an IP address? (Can you figure out what is your IP address? )Your device - Can you figure out your device's IP address? - Can you find the IP address of every website? - What is a domain name? - What is a domain name server? - What is a port? -- What is a server? -- What is a server request? +- What is a server? +- What is a server request? - Can you explain in your own words, to a non-technical person, how the internet works? See [How the Internet Works](./how-the-internet-works.md) - - Client + - Client - HTTP request to a server - A server is a big central computer that holds the physical data for a website. - Domain name - human readable. @@ -24,7 +24,6 @@ - What is a server? - What is a request handler? - ## Introduction Networking is a fundamental skill to have as an engineer that transcends frameworks, languages, and even devices. Smart lightbulbs use networking, so this is something that applies to almost any hardware or software project you will ever work on. @@ -50,4 +49,3 @@ Networking is a huge topic. Time learning what's underneath all of the tools you - What is a request handler? - e.g. the function called `requestHandler` in [this simple Node server example](https://blog.risingstack.com/your-first-node-js-http-server/) - The list of instructions you give the person you paid to answer the phone, e.g. if someone calls asking for "Alice", take a message. If someone asks for "Alex," tell the caller they no longer work there anymore and give them their new work phone number. - diff --git a/networking-computing/intro-to-dns-ip.md b/networking-computing/intro-to-dns-ip.md index 415c1e67d..d6a615f71 100644 --- a/networking-computing/intro-to-dns-ip.md +++ b/networking-computing/intro-to-dns-ip.md @@ -5,8 +5,7 @@ - What is a DNS? - What happens behind the scenes when you enter a URL? -PRO-TIP: The activities in this curriculum are here for your continous reference, and won't disappear, so you don't have to dive deeply if the content and activities presented are not necessary to your day doc level understanding. Take a mental note and move on if you need time for other day doc priorities. - +PRO-TIP: The activities in this curriculum are here for your continous reference, and won't disappear, so you don't have to dive deeply if the content and activities presented are not necessary to your day doc level understanding. Take a mental note and move on if you need time for other day doc priorities. ### Prerequisites diff --git a/node-js/node-js.md b/node-js/node-js.md index 0b6b2ac7b..41f626882 100644 --- a/node-js/node-js.md +++ b/node-js/node-js.md @@ -6,7 +6,6 @@ - What is a runtime environment? - What is the difference between NPM and Node? - ### Prerequisites - [How the Internet Works](/networking-computing/how-the-internet-works.md) @@ -38,7 +37,6 @@ This lab exercise will introduce Node.js, a powerful tool that lets you run Java - [Node.js lab exercise, Part 1](/node-js/node-lab-exercise-part-1.md) - ### Supplemental Materials - Be aware of how to find [Node's API docs](https://nodejs.org/api/), and briefly familiarize yourself with its structure. You don't need to read it all now! diff --git a/objectives/week-6-assessment.md b/objectives/week-6-assessment.md index 6ab40b046..f59248850 100644 --- a/objectives/week-6-assessment.md +++ b/objectives/week-6-assessment.md @@ -115,7 +115,6 @@ class FilesystemItem { isFile() { return false; } - } class Folder extends FilesystemItem { @@ -158,12 +157,10 @@ const dotProfile = new File('.profile', homeFolder); const raccoonPic = new File('raccoon.jpg', desktopFolder); - -homeFolder.containsFile('raccoon.jpg') // => true (since it's in desktop folder, which is part of home folder) -homeFolder.containsFile('nonexistent') // => false -desktopFolder.containsFile('raccoon.jpg') // => true -desktopFolder.containsFile('.profile') // => false (since it's not in desktop, only its parent) - +homeFolder.containsFile('raccoon.jpg'); // => true (since it's in desktop folder, which is part of home folder) +homeFolder.containsFile('nonexistent'); // => false +desktopFolder.containsFile('raccoon.jpg'); // => true +desktopFolder.containsFile('.profile'); // => false (since it's not in desktop, only its parent) ``` Write a function `containsFileNamed(folder, name)` diff --git a/onboarding/ergonomics.md b/onboarding/ergonomics.md index d6a4047a7..7371342c2 100644 --- a/onboarding/ergonomics.md +++ b/onboarding/ergonomics.md @@ -82,7 +82,6 @@ Set 3 alarms or reminders for yourself for the remainder of the workday. When th - [7 Ways to Be A Healthier Programmer](https://successfulsoftware.net/2008/10/26/7-ways-to-be-a-healthier-programmer/) - [Why Sitting is Killing You](https://www.lifehack.org/articles/lifestyle/why-sitting-is-killing-you.html) - ### Check for Understanding Explore the exercises in the [10 Exercises for Software Engineers](https://www.linkedin.com/pulse/10-must-do-exercises-ergonomics-software-developers-designers-wang/) article. Also, determine your optimal chair height and your optimal screen height based on the guidelines given in the slides. diff --git a/onboarding/learning-to-learn.md b/onboarding/learning-to-learn.md index b2961dcbd..527d09b4b 100644 --- a/onboarding/learning-to-learn.md +++ b/onboarding/learning-to-learn.md @@ -4,7 +4,6 @@ - [Expectations While at Techtonica](https://docs.google.com/document/d/1IWny-IXB-XDWW21l3JODwPuh1QOVBFQbii_DjvF0g00/edit?usp=sharing) - ### Motivation Techtonica is an intensive learning program whose format puts emphasis on participant-led learning, unlike a traditional classroom setting that emphasizes instructor-led learning. It's important that participants understand some common limiting beliefs about learning, and work to free themselves of these beliefs to be more successful at Techtonica. @@ -56,7 +55,6 @@ https://www.youtube.com/watch?v=-71zdXCMU6A - **"I'm not good at learning new things because I didn't get good grades in school."** Ability to learn and grades earned in school are not strongly correlated. Grades reflect other things in addition to learning (persistence, ability to obtain help, ability to spend time on assignments, support at home, etc.) - **"As long as I have a growth mindset, learning new things will be easy."** A growth mindset allows you to be kinder to and more patient with yourself when learning new things. Learning new things is often quite challenging, regardless of your mindset. - ### Independent Practice Write down some positive, affirmative things to say to yourself that fall under the framework of the growth mindset. @@ -67,7 +65,6 @@ Take the [Learning Style Quiz](http://www.educationplanner.org/students/self-ass Take the [Growth Mindset Self-Assessment](https://www.positivityguides.net/test-your-mindset-quiz/) - ### Check for Understanding Write a self-reflective journal entry covering: @@ -76,7 +73,6 @@ Write a self-reflective journal entry covering: 2. What felt challenging about this lesson? 3. What do you want to practice now after learning about this? - ### Supplemental Resources - [Growth Mindset (video)](https://www.youtube.com/watch?v=EyIF5VUOJc0) - This is summary of a book Growth Mindset by Carol Dweck, which depends on her research how do kids tackle with difficult problems. diff --git a/onboarding/pair-programming.md b/onboarding/pair-programming.md index 167af40e1..10a2c50ed 100644 --- a/onboarding/pair-programming.md +++ b/onboarding/pair-programming.md @@ -1,6 +1,7 @@ # How to Pair Program ### Week 1 Keywords and Questions + - Driver - Navigator - What is something you need to keep in mind when pair programming? @@ -55,7 +56,6 @@ Pair programming is a very common way to write code and to solve software engine - **"Real programmers do not program in pairs."** Some companies exclusively use pair programming ([Pivotal Labs](https://pivotal.io/labs) is one such example). Many companies use pair programming at certain times or in certain situations. Some companies don't practice pair programming at all. - **"I don't know what's going on or what my pair is doing, so I'm just going to sit back and watch them."** Pair programming is not pair programming when only one person is doing the work. Speak up and advocate for yourself. Ask questions and stay involved! If you need a break to reset your mind, ask for one. - ### Additional Resources - Video: [Pair Programming: 7 Habits of Highly Effective Coders](https://www.youtube.com/watch?v=5ySLQ5_cQ34) diff --git a/onboarding/professionalism.md b/onboarding/professionalism.md index 681e8cfce..c5d0c6de6 100644 --- a/onboarding/professionalism.md +++ b/onboarding/professionalism.md @@ -1,6 +1,5 @@ # Professionalism - ### Prerequisites - [Expectations While at Techtonica](https://docs.google.com/document/d/1v54bB6ntRovJaGx-7SyFyE3aBJ3wQJMg9RvAOt5yqsk/edit#heading=h.iphtc37h7abi) @@ -13,7 +12,7 @@ When speaking about professionalism, is it important to acknowledge that many as We use 'professionalism' as a way to explain what is expected of you during your time at Techtonica and what will be expected once you start your career in tech. Please feel free to reach out to any staff member if you would like to discuss why each of these topics are considered important traits for employees. -Techtonica is a simulated work environment representative of common tech industry offices. Program participants are expected to behave and interact with everyone associated with Techtonica in a way that matches what is expected in the tech workspace. +Techtonica is a simulated work environment representative of common tech industry offices. Program participants are expected to behave and interact with everyone associated with Techtonica in a way that matches what is expected in the tech workspace. Importance to professionalism in workplace: @@ -117,7 +116,6 @@ The slides and video walkthrough follow along with this lesson. Be sure to view - **"I cannot be my authentic self and behave professionally."** Being yourself and behaving professionally are not mutually exclusive. Sometimes, the "professional" you is one part of your true self who gets to come out at work, while other parts of your true self get to come out at other times. - **"It won't matter what I do or how I act because I'll just be a junior software engineer after Techtonica."** Junior software engineers are valued team members and are held to the same standard of professionalism as everyone else at the company. Behaving professionally demonstrates that you value your role, your team, your employer and are conscientious. Start your reputation off on good footing. - ### Independent Practice (if time permits) 1. Find a partner. Take turns role playing the following scenario: One of you is a team member and you need to tell your manager in person that you'll be missing a week of work next month. The other person is the manager and should express disappointment that the team member will be gone, but also express that you understand. Be sure to switch roles. @@ -129,5 +127,6 @@ The slides and video walkthrough follow along with this lesson. Be sure to view Write your reflections about this lesson. What, if any, of the concepts presented were new to you? Is there anything you disagree with? What did it feel like to deliver potentially bad news during the role play? Was this practice useful? Feel free to share other thoughts you have. ### Extra Lessons + - [Interpersonal Conflict Resolution](/career/conflict-resolution.md) - [Diversity, Inclusion & Implicit Bias](../diversity-inclusion-bias/inclusion.md) diff --git a/onboarding/tech-industry-tips.md b/onboarding/tech-industry-tips.md index 63303815b..95d312368 100644 --- a/onboarding/tech-industry-tips.md +++ b/onboarding/tech-industry-tips.md @@ -28,7 +28,7 @@ ### Constructive Tone - Anything you write in an email or Slack, assume it will be forwarded to everyone in the company, and quoted in the New York Times. If you have something to say and you don't want it to be used against you, find the person and say it in person out of the office such as on a walk. One of our volunteers has seen at least one set of people be fired for their private chat messages sent to each other, complaining about others on their team in an unprofessional way. -- While we're on that subject, aside from protecting yourself against your employer, it is also beneficial to your own well-being to try to stay positive and constructive, and avoid gossip. Take the time to discern the difference between a fact and a story. +- While we're on that subject, aside from protecting yourself against your employer, it is also beneficial to your own well-being to try to stay positive and constructive, and avoid gossip. Take the time to discern the difference between a fact and a story. ### Slack @@ -39,7 +39,7 @@ ### Twitter -- Twitter can be a great place to build your tech network, but there are trolls. Know that you can always block someone. +- Twitter can be a great place to build your tech network, but there are trolls. Know that you can always block someone. - Starting a tweet with someone's user name will create a public message to that account rather than creating a really public tweet. If you want a tweet to be public but want to start with a user name, just put a . in front. ### Technologies @@ -77,4 +77,3 @@ - Remember to use [the feedback formula](https://techtonica.org/conduct/) to ask for and give both negative and positive feedback often. - There will be frustrations! [Empower Work](https://www.empowerwork.org/) is a service you can text to get confidential help with work issues. - diff --git a/open-source/hackathon.md b/open-source/hackathon.md index f981e6f5d..70f7c7656 100644 --- a/open-source/hackathon.md +++ b/open-source/hackathon.md @@ -1,55 +1,69 @@ # Techtonica Hackathon - Template ### Projected Time + 2 days ### Prerequisites - - ["Git and version control" lesson](../git/git-version-control.md) + +- ["Git and version control" lesson](../git/git-version-control.md) + ### Motivation + Working in a Hackathon introduces participants to the world of intense collaboration. Here are some motivating factors that might inspire you to take part in a hackathon: + - Learning opportunities - Problem-Solving - Team Work and Collaboration - Portfolio Building ## How to Plan a Hackathon - - Find a Purpose - - Find at least two objectives. - - Give the participants some examples of Focus Areas. A focus area will help participants narrow the problems to create project ideas. They answer the question: How can we improve this situation through technology? - - Select Dates and Times - - Organize the Teams - - Organize the judges, the judge criteria, and the prizes + +- Find a Purpose +- Find at least two objectives. +- Give the participants some examples of Focus Areas. A focus area will help participants narrow the problems to create project ideas. They answer the question: How can we improve this situation through technology? +- Select Dates and Times +- Organize the Teams +- Organize the judges, the judge criteria, and the prizes ### Participants will be able to: - - Understand what a Hackathon is - - Work in a fast-paced environment to develop a project from scratch to launch - - Break from the routine and immerse themself in a dynamic and creative atmosphere. - - Hackathons often require participants to work in teams, fostering collaboration and teamwork. +- Understand what a Hackathon is +- Work in a fast-paced environment to develop a project from scratch to launch +- Break from the routine and immerse themself in a dynamic and creative atmosphere. +- Hackathons often require participants to work in teams, fostering collaboration and teamwork. ### Specific Things to Learn + - How to set up a GitHub for a group project - How to work with local gits on branches and collective merges -- How to plan a project in a group +- How to plan a project in a group - How to search for a useful API fast - How to present a launch prospect ### Supplemental Materials + - https://www.firsttimersonly.com/ - [The Ultimate Github Collaboration Guide](https://medium.com/@jonathanmines/the-ultimate-github-collaboration-guide-df816e98fb67#:~:text=Step%202%3A%20Setup%20Your%20Team) - [Practicing using GitHub to contribute to an Open Source project](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github) - [Up for Grabs: Explore Open Source Projects and Jump In](https://up-for-grabs.net/) ### Suggested Links: + - [Women Who Code](http://womenwhocode.github.io/#project_reviewers) (See 'Featured Repos' and 'How do we contribute to a project?' Sections) ### Common Mistakes / Misconceptions + While hackathons are valuable and exciting events, there are some common mistakes and misconceptions that participants may have. Here are a few to be aware of: -- Focusing too much on winning: While winning a hackathon can be rewarding, it's important not to lose sight of the primary goals: learning, collaboration, and innovation. -- Underestimating the importance of teamwork: Hackathons often involve teamwork and collaboration. Some participants make the mistake of trying to do everything on their own, which can lead to burnout, missed opportunities for learning, and suboptimal outcomes. -- Overlooking planning and time management: Time is usually limited during a hackathon, so it's crucial to plan and manage your time effectively. + +- Focusing too much on winning: While winning a hackathon can be rewarding, it's important not to lose sight of the primary goals: learning, collaboration, and innovation. +- Underestimating the importance of teamwork: Hackathons often involve teamwork and collaboration. Some participants make the mistake of trying to do everything on their own, which can lead to burnout, missed opportunities for learning, and suboptimal outcomes. +- Overlooking planning and time management: Time is usually limited during a hackathon, so it's crucial to plan and manage your time effectively. + ### Guided Slides for Planning -[First Techtonica Hackathon could be an exciting place to start](https://drive.google.com/file/d/1EFwkbXH_lX5w6HgDRyky_EKE6IHMvkPD/view?usp=share_link) + +[First Techtonica Hackathon could be an exciting place to start](https://drive.google.com/file/d/1EFwkbXH_lX5w6HgDRyky_EKE6IHMvkPD/view?usp=share_link) ### Challenge -Try picking an interesting problem to solve for each edition of your Hackathon. \ No newline at end of file + +Try picking an interesting problem to solve for each edition of your Hackathon. diff --git a/package-lock.json b/package-lock.json index 9ed298436..7d808f39f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,279 +1,362 @@ { "name": "curriculum", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { + "packages": { + "": { + "name": "curriculum", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "git-format-staged": "^2.1.0", + "mrm": "^2.1.1", + "precise-commits": "^1.0.2", + "pretty-quick": "^2.0.1" + }, + "devDependencies": { + "husky": "^4.2.3", + "lint-staged": "^10.0.8", + "pre-commit": "^1.2.2", + "prettier": "^2.8.8", + "remark-cli": "^7.0.1", + "remark-lint": "^6.0.5", + "remark-lint-no-dead-urls": "^1.1.0", + "remark-validate-links": "^9.0.1" + } + }, + "node_modules/@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.8.3" } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/runtime": { + "node_modules/@babel/runtime": { "version": "7.9.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", "dev": true, - "requires": { + "dependencies": { "regenerator-runtime": "^0.13.4" } }, - "@leichtgewicht/ip-codec": { + "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", "dev": true }, - "@samverschueren/stream-to-observable": { + "node_modules/@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", "dev": true, - "requires": { + "dependencies": { "any-observable": "^0.3.0" + }, + "engines": { + "node": ">=6" } }, - "@sindresorhus/is": { + "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } }, - "@szmarczak/http-timer": { + "node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { + "dependencies": { "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" } }, - "@types/color-name": { + "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/minimatch": { + "node_modules/@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, - "@types/parse-json": { + "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/unist": { + "node_modules/@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", "dev": true }, - "aggregate-error": { + "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "requires": { + "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "ansi-align": { + "node_modules/ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "requires": { + "dependencies": { "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/ansi-align/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "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=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-escapes": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/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==", - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "any-observable": { + "node_modules/any-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "argparse": { + "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { + "dependencies": { "sprintf-js": "~1.0.2" } }, - "array-differ": { + "node_modules/array-differ": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==" + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "engines": { + "node": ">=8" + } }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } }, - "arrify": { + "node_modules/arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } }, - "babel-code-frame": { + "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { + "dependencies": { "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "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" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "bail": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bail": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", "dev": true }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "boxen": { + "node_modules/boxen": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "requires": { + "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^5.3.1", "chalk": "^2.4.2", @@ -283,71 +366,87 @@ "type-fest": "^0.3.0", "widest-line": "^2.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/boxen/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "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=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "brace-expansion": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "buffer-from": { + "node_modules/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 }, - "cacheable-request": { + "node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { + "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", @@ -356,484 +455,597 @@ "normalize-url": "^4.1.0", "responselike": "^1.0.2" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "callsites": { + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } }, - "ccount": { + "node_modules/ccount": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", "dev": true }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "character-entities": { + "node_modules/character-entities": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", "dev": true }, - "character-entities-html4": { + "node_modules/character-entities-html4": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz", "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==", "dev": true }, - "character-entities-legacy": { + "node_modules/character-entities-legacy": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", "dev": true }, - "character-reference-invalid": { + "node_modules/character-reference-invalid": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", "dev": true }, - "chardet": { + "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, - "check-links": { + "node_modules/check-links": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/check-links/-/check-links-1.1.8.tgz", "integrity": "sha512-lxt1EeQ1CVkmiZzPfbPufperYK0t7MvhdLs3zlRH9areA6NVT1tcGymAdJONolNWQBdCFU/sek59RpeLmVHCnw==", "dev": true, - "requires": { + "dependencies": { "got": "^9.6.0", "is-relative-url": "^2.0.0", "p-map": "^2.0.0", "p-memoize": "^2.1.0" + }, + "engines": { + "node": ">=8" } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.3.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" } }, - "ci-info": { + "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, - "clean-stack": { + "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "cli-boxes": { + "node_modules/cli-boxes": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "engines": { + "node": ">=6" + } }, - "cli-cursor": { + "node_modules/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=", - "requires": { + "dependencies": { "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "cli-spinners": { + "node_modules/cli-spinners": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==" + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "engines": { + "node": ">=4" + } }, - "cli-truncate": { + "node_modules/cli-truncate": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", "dev": true, - "requires": { + "dependencies": { "slice-ansi": "0.0.4", "string-width": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/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, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "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", - "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": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "cli-width": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, - "clone-response": { + "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { + "dependencies": { "mimic-response": "^1.0.0" } }, - "co": { + "node_modules/co": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", "dev": true }, - "code-point-at": { + "node_modules/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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "collapse-white-space": { + "node_modules/collapse-white-space": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", "dev": true }, - "color-convert": { + "node_modules/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==", - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "commander": { + "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "comment-json": { + "node_modules/comment-json": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.2.tgz", "integrity": "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA==", - "requires": { + "dependencies": { "core-util-is": "^1.0.2", "esprima": "^4.0.1", "has-own-prop": "^2.0.0", "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" } }, - "compare-versions": { + "node_modules/compare-versions": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { + "node_modules/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, - "requires": { + "engines": [ + "node >= 6.0" + ], + "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, - "configstore": { + "node_modules/configstore": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "requires": { + "dependencies": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "core-util-is": { + "node_modules/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=" }, - "cosmiconfig": { + "node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, - "requires": { + "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, "dependencies": { - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - } + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "crypto-random-string": { + "node_modules/crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "engines": { + "node": ">=4" + } }, - "date-fns": { + "node_modules/date-fns": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, - "debug": { + "node_modules/debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, - "requires": { + "dependencies": { "ms": "^2.1.1" } }, - "decompress-response": { + "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { + "dependencies": { "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "dedent": { + "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "deep-extend": { + "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } }, - "defer-to-connect": { + "node_modules/defer-to-connect": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==" }, - "detect-indent": { + "node_modules/detect-indent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "engines": { + "node": ">=8" + } }, - "diff-match-patch": { + "node_modules/diff-match-patch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" }, - "dns-packet": { + "node_modules/dns-packet": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.0.tgz", "integrity": "sha512-Nce7YLu6YCgWRvOmDBsJMo9M5/jV3lEZ5vUWnWXYmwURvPylHvq7nkDWhNmk1ZQoZZOP7oQh/S0lSxbisKOfHg==", "dev": true, - "requires": { + "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, - "dns-socket": { + "node_modules/dns-socket": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/dns-socket/-/dns-socket-4.2.2.tgz", "integrity": "sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==", "dev": true, - "requires": { + "dependencies": { "dns-packet": "^5.2.4" + }, + "engines": { + "node": ">=6" } }, - "dot-prop": { + "node_modules/dot-prop": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "requires": { + "dependencies": { "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "duplexer3": { + "node_modules/duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "editorconfig": { + "node_modules/editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "requires": { + "dependencies": { "commander": "^2.19.0", "lru-cache": "^4.1.5", "semver": "^5.6.0", "sigmund": "^1.0.1" }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "bin": { + "editorconfig": "bin/editorconfig" } }, - "editorconfig-to-prettier": { + "node_modules/editorconfig-to-prettier": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/editorconfig-to-prettier/-/editorconfig-to-prettier-0.1.1.tgz", "integrity": "sha512-MMadSSVRDb4uKdxV6bCXXN4cTsxIsXYtV4XdPu6FOCSAw6zsCIDA+QEktEU+u6h+c/mTrul5NR+pwFpPxwetiQ==" }, - "elegant-spinner": { + "node_modules/editorconfig/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", "dev": true }, - "end-of-stream": { + "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { + "dependencies": { "once": "^1.4.0" } }, - "error-ex": { + "node_modules/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": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escape-string-regexp": { + "node_modules/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=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } }, - "execa": { + "node_modules/execa": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", @@ -845,212 +1057,281 @@ "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - } - } - }, - "extend": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "extend-shallow": { + "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { + "dependencies": { "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "external-editor": { + "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { + "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" } }, - "fault": { + "node_modules/fault": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.3.tgz", "integrity": "sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA==", "dev": true, - "requires": { + "dependencies": { "format": "^0.2.2" } }, - "figures": { + "node_modules/figures": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "find-versions": { + "node_modules/find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", "dev": true, - "requires": { + "dependencies": { "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "fn-name": { + "node_modules/fn-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "format": { + "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.x" + } }, - "fs-exists-sync": { + "node_modules/fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "engines": { + "node": ">=0.10.0" + } }, - "fs-extra": { + "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { + "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { + "node_modules/fsevents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "get-own-enumerable-property-symbols": { + "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, - "get-stream": { + "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { + "dependencies": { "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "git-config-path": { + "node_modules/git-config-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "fs-exists-sync": "^0.1.0", "homedir-polyfill": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "git-format-staged": { + "node_modules/git-format-staged": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/git-format-staged/-/git-format-staged-2.1.0.tgz", - "integrity": "sha512-Ih3EVablJ1Xj/JPMzbXY3Nl0W6NQ9YrA+mad3c9yobODzq9zfOBHMi0h3AScRprm4XtBbIo1oGfwO3cZ4vmg6Q==" + "integrity": "sha512-Ih3EVablJ1Xj/JPMzbXY3Nl0W6NQ9YrA+mad3c9yobODzq9zfOBHMi0h3AScRprm4XtBbIo1oGfwO3cZ4vmg6Q==", + "bin": { + "git-format-staged": "git-format-staged" + } }, - "git-username": { + "node_modules/git-username": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/git-username/-/git-username-1.0.0.tgz", "integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ==", - "requires": { + "dependencies": { "parse-github-url": "^1.0.2", "remote-origin-url": "^1.0.0" + }, + "engines": { + "node": ">=0.8" } }, - "github-slugger": { + "node_modules/github-slugger": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz", "integrity": "sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": ">=6.0.0 <=6.1.1" } }, - "glob": { + "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "global-dirs": { + "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { + "dependencies": { "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" } }, - "got": { + "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { + "dependencies": { "@sindresorhus/is": "^0.14.0", "@szmarczak/http-timer": "^1.1.2", "cacheable-request": "^6.0.0", @@ -1062,74 +1343,97 @@ "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, - "has-ansi": { + "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { + "dependencies": { "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=" - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" } }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } }, - "has-own-prop": { + "node_modules/has-own-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==" + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "engines": { + "node": ">=8" + } }, - "has-yarn": { + "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } }, - "homedir-polyfill": { + "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { + "dependencies": { "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "hosted-git-info": { + "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "http-cache-semantics": { + "node_modules/http-cache-semantics": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" }, - "human-signals": { + "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.12.0" + } }, - "husky": { + "node_modules/husky": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", "dev": true, - "requires": { + "hasInstallScript": true, + "dependencies": { "chalk": "^3.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.5.1", @@ -1141,130 +1445,176 @@ "slash": "^3.0.0", "which-pm-runs": "^1.0.0" }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "node_modules/husky/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/husky/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/husky/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/husky/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "iconv-lite": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ignore": { + "node_modules/ignore": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "engines": { + "node": ">= 4" + } }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" } }, - "import-lazy": { + "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } }, - "indent-string": { + "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { + "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "inquirer": { + "node_modules/inquirer": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "requires": { + "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "cli-cursor": "^3.1.0", @@ -1279,410 +1629,537 @@ "strip-ansi": "^6.0.0", "through": "^2.3.6" }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ip-regex": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-absolute-url": { + "node_modules/is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-alphabetical": { + "node_modules/is-alphabetical": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", "dev": true }, - "is-alphanumeric": { + "node_modules/is-alphanumeric": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-alphanumerical": { + "node_modules/is-alphanumerical": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", "dev": true, - "requires": { + "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-buffer": { + "node_modules/is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "is-ci": { + "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { + "dependencies": { "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "is-decimal": { + "node_modules/is-decimal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", "dev": true }, - "is-directory": { + "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } }, - "is-empty": { + "node_modules/is-empty": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", "integrity": "sha1-3pu1snhzigWgsJpX4ftNSjQan2s=", "dev": true }, - "is-extendable": { + "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-hexadecimal": { + "node_modules/is-hexadecimal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", "dev": true }, - "is-hidden": { + "node_modules/is-hidden": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-hidden/-/is-hidden-1.1.2.tgz", "integrity": "sha512-kytBeNVW2QTIqZdJBDKIjP+EkUTzDT07rsc111w/gxqR6wK3ODkOswcpxgED6HU6t7fEhOxqojVZ2a2kU9rj+A==", "dev": true }, - "is-installed-globally": { + "node_modules/is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { + "dependencies": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "is-ip": { + "node_modules/is-ip": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", "dev": true, - "requires": { + "dependencies": { "ip-regex": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-npm": { + "node_modules/is-npm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==" + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", + "engines": { + "node": ">=8" + } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-obj": { + "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } }, - "is-object": { + "node_modules/is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-observable": { + "node_modules/is-observable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, - "requires": { + "dependencies": { "symbol-observable": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "is-online": { + "node_modules/is-online": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/is-online/-/is-online-8.5.1.tgz", "integrity": "sha512-RKyTQx/rJqw2QOXHwy7TmXdlkpe0Hhj7GBsr6TQJaj4ebNOfameZCMspU5vYbwBBzJ2brWArdSvNVox6T6oCTQ==", "dev": true, - "requires": { + "dependencies": { "got": "^9.6.0", "p-any": "^2.0.0", "p-timeout": "^3.0.0", "public-ip": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-path-inside": { + "node_modules/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=", - "requires": { + "dependencies": { "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz", "integrity": "sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-promise": { + "node_modules/is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, - "is-regexp": { + "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-relative-url": { + "node_modules/is-relative-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-2.0.0.tgz", "integrity": "sha1-cpAtf+BLPUeS59sV+duEtyBMnO8=", "dev": true, - "requires": { + "dependencies": { "is-absolute-url": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } }, - "is-whitespace-character": { + "node_modules/is-whitespace-character": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", "dev": true }, - "is-word-character": { + "node_modules/is-word-character": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", "dev": true }, - "is-yarn-global": { + "node_modules/is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "js-tokens": { + "node_modules/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 }, - "js-yaml": { + "node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "json-buffer": { + "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, - "json-parse-better-errors": { + "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "jsonfile": { + "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { + "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "keyv": { + "node_modules/keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { + "dependencies": { "json-buffer": "3.0.0" } }, - "kleur": { + "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } }, - "latest-version": { + "node_modules/latest-version": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { + "dependencies": { "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "levenshtein-edit-distance": { + "node_modules/levenshtein-edit-distance": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-1.0.0.tgz", "integrity": "sha1-iVuvR4zOi1waDSfkXXwdl4pmHkk=", - "dev": true + "dev": true, + "bin": { + "levenshtein-edit-distance": "cli.js" + } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "lint-staged": { + "node_modules/lint-staged": { "version": "10.0.8", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.0.8.tgz", "integrity": "sha512-Oa9eS4DJqvQMVdywXfEor6F4vP+21fPHF8LUXgBbVWUSWBddjqsvO6Bv1LwMChmgQZZqwUvgJSHlu8HFHAPZmA==", "dev": true, - "requires": { + "dependencies": { "chalk": "^3.0.0", "commander": "^4.0.1", "cosmiconfig": "^6.0.0", @@ -1697,70 +2174,95 @@ "string-argv": "0.3.1", "stringify-object": "^3.3.0" }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/lint-staged/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/lint-staged/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "listify": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/listify/-/listify-1.0.0.tgz", - "integrity": "sha1-A8p7otFQ1CZ3c/dOV1WNEFPSvuM=" + "integrity": "sha1-A8p7otFQ1CZ3c/dOV1WNEFPSvuM=", + "engines": { + "node": ">= 0.4" + } }, - "listr": { + "node_modules/listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", "dev": true, - "requires": { + "dependencies": { "@samverschueren/stream-to-observable": "^0.3.0", "is-observable": "^1.1.0", "is-promise": "^2.1.0", @@ -1771,27 +2273,25 @@ "p-map": "^2.0.0", "rxjs": "^6.3.3" }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - } + "engines": { + "node": ">=6" } }, - "listr-silent-renderer": { + "node_modules/listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "listr-update-renderer": { + "node_modules/listr-update-renderer": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", "dev": true, - "requires": { + "dependencies": { "chalk": "^1.1.3", "cli-truncate": "^0.2.1", "elegant-spinner": "^1.0.1", @@ -1801,296 +2301,388 @@ "log-update": "^2.3.0", "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 - }, - "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": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "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 - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" + "engines": { + "node": ">=6" }, - "dependencies": { - "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" - } - } + "peerDependencies": { + "listr": "^0.14.2" } }, - "load-plugin": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-2.3.1.tgz", - "integrity": "sha512-dYB1lbwqHgPTrruy9glukCu8Ya9vzj6TMfouCtj2H/GuJ+8syioisgKTBPxnCi6m8K8jINKfTOxOHngFkUYqHw==", + "node_modules/listr-update-renderer/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, - "requires": { - "npm-prefix": "^1.2.0", - "resolve-from": "^5.0.0" + "engines": { + "node": ">=0.10.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" + "node_modules/listr-update-renderer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "node_modules/listr-update-renderer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "requires": { - "chalk": "^2.4.2" + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" } }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "node_modules/listr-update-renderer/node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=" + "node_modules/listr-update-renderer/node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "longest-streak": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz", + "node_modules/listr-update-renderer/node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-plugin": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-2.3.1.tgz", + "integrity": "sha512-dYB1lbwqHgPTrruy9glukCu8Ya9vzj6TMfouCtj2H/GuJ+8syioisgKTBPxnCi6m8K8jINKfTOxOHngFkUYqHw==", + "dev": true, + "dependencies": { + "npm-prefix": "^1.2.0", + "resolve-from": "^5.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest-streak": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz", "integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw==", "dev": true }, - "lowercase-keys": { + "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { + "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { + "dependencies": { "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "map-age-cleaner": { + "node_modules/map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, - "requires": { + "dependencies": { "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "markdown-escapes": { + "node_modules/markdown-escapes": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", "dev": true }, - "markdown-extensions": { + "node_modules/markdown-extensions": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "markdown-table": { + "node_modules/markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true }, - "mdast-comment-marker": { + "node_modules/mdast-comment-marker": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-1.1.1.tgz", "integrity": "sha512-TWZDaUtPLwKX1pzDIY48MkSUQRDwX/HqbTB4m3iYdL/zosi/Z6Xqfdv0C0hNVKvzrPjZENrpWDt4p4odeVO0Iw==", "dev": true }, - "mdast-util-compact": { + "node_modules/mdast-util-compact": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", "dev": true, - "requires": { + "dependencies": { "unist-util-visit": "^1.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "mdast-util-to-string": { + "node_modules/mdast-util-to-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.7.tgz", "integrity": "sha512-P+gdtssCoHOX+eJUrrC30Sixqao86ZPlVjR5NEAoy0U79Pfxb1Y0Gntei0+GrnQD4T04X9xA8tcugp90cSmNow==", - "dev": true + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "mem": { + "node_modules/mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, - "requires": { + "dependencies": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } + "engines": { + "node": ">=6" } }, - "merge-stream": { + "node_modules/mem/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.1", "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "middleearth-names": { + "node_modules/middleearth-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/middleearth-names/-/middleearth-names-1.1.0.tgz", "integrity": "sha1-wdXuSN77NoEo+66/686IR80Y3f8=", - "requires": { + "dependencies": { "unique-random-array": "1.0.0" } }, - "mimic-fn": { + "node_modules/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==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } }, - "mimic-response": { + "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, - "mri": { + "node_modules/mri": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "engines": { + "node": ">=4" + } }, - "mrm": { + "node_modules/mrm": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mrm/-/mrm-2.1.1.tgz", "integrity": "sha512-X+vvjY+X/1mm62f2x3UWaCFJh1+B3TsCEbnhT4hBOad2ocxatzKNiPsq6l+3ImmSK1+SbUjyEOEexE+ccucnmQ==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "glob": "^7.1.6", "inquirer": "^7.0.4", @@ -2108,13 +2700,19 @@ "update-notifier": "^3.0.1", "user-home": "^2.0.0", "user-meta": "^1.0.0" + }, + "bin": { + "mrm": "bin/mrm.js" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-core": { + "node_modules/mrm-core": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/mrm-core/-/mrm-core-4.0.3.tgz", "integrity": "sha512-lCQbpUVD6kmh2/u1CZ7ClxIt2+n+4EAGBqss6C3y9T9ql0iwWFUrNOCpa1qt0L5A8qh2VgBYKQe2TK8GbRN9Ww==", - "requires": { + "dependencies": { "babel-code-frame": "^6.26.0", "comment-json": "^2.2.0", "detect-indent": "^6.0.0", @@ -2133,13 +2731,16 @@ "split-lines": "^2.0.0", "strip-bom": "^4.0.0", "webpack-merge": "^4.2.2" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-preset-default": { + "node_modules/mrm-preset-default": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mrm-preset-default/-/mrm-preset-default-2.0.4.tgz", "integrity": "sha512-c6zWMHPEObgz8YQ7i3zgaKtlpx/Qwqi0oFFhRmRZoKFI7vx7nzPBmjwBejohALs5N5oVowuSo59ZdW8xfxRkew==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3", "mrm-task-codecov": "^2.0.3", "mrm-task-contributing": "^2.0.4", @@ -2157,418 +2758,554 @@ "mrm-task-stylelint": "^3.0.3", "mrm-task-travis": "^2.0.3", "mrm-task-typescript": "^2.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-codecov": { + "node_modules/mrm-task-codecov": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-codecov/-/mrm-task-codecov-2.0.3.tgz", "integrity": "sha512-/jNLLLVL3u7H/WmpMlPG8JK6mRlCMV9/OiJTUPVIJ5+WbF89PnIggPRqM0ufD/FjbeqcpIN/Z5Z/U0Ulm/R3QQ==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-contributing": { + "node_modules/mrm-task-contributing": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mrm-task-contributing/-/mrm-task-contributing-2.0.4.tgz", "integrity": "sha512-1JQwx7+EG6qyikVHrctFhx12XCL7M132FuswUnLFa2SAG4ztKKBIy3bNUG6OpoP0EcFwCgmEt7vkIjlRx9uQwA==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-editorconfig": { + "node_modules/mrm-task-editorconfig": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-editorconfig/-/mrm-task-editorconfig-2.0.3.tgz", "integrity": "sha512-g6t55rKW6LrY8KQ81ELBYxhONtCSSj7XGrJXEDcPbY8QnIIdoSnZ01BGNvHjUocUaOXXtrIHJ45BuQCLJuZEjA==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-eslint": { + "node_modules/mrm-task-eslint": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-eslint/-/mrm-task-eslint-2.0.3.tgz", "integrity": "sha512-9SN/68vzmSXhfqZuo2BKRy5iM3+PM9mHM0X7VKCf6fsGyjW6XiM6DKdEShK75CQcZKuiPioyL/UhtthoUjhcEA==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-gitignore": { + "node_modules/mrm-task-gitignore": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-gitignore/-/mrm-task-gitignore-2.0.3.tgz", "integrity": "sha512-vdBkyZjS5AGevhuB2hkOB3vrf0ldkXZL0etTESMoDO3ktl9mFn4JIjrp6d0fN+NNLMWdEAaIaUfxiSfoTleoEQ==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-jest": { + "node_modules/mrm-task-jest": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-jest/-/mrm-task-jest-2.0.3.tgz", "integrity": "sha512-JeH7LGV9Ihc1CwmFqh7/84VwFe3H0bdOdrmJDzsPAn+oWVXnACp42ggTEuBCxa1QcPIwaJ3kccrjAjG4/CRPJw==", - "requires": { + "dependencies": { "lodash": "^4.17.15", "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-license": { + "node_modules/mrm-task-license": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mrm-task-license/-/mrm-task-license-3.0.2.tgz", "integrity": "sha512-9S2K08pot9QZtwUyJhVcnTz2I+9FO0QcZ2n64EBvKVsZ4JxcHMcLmxzlyYi+SlRiN6mi66PfkmPGFXLGvhZNDg==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3", "user-meta": "^1.0.0" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-lint-staged": { + "node_modules/mrm-task-lint-staged": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mrm-task-lint-staged/-/mrm-task-lint-staged-3.0.2.tgz", "integrity": "sha512-7bovp6nl0tri7haL33CYymJA3fkHvglgmDsQ2Iewa/L6x0taBvBhkftcMb5T6ewrVMN3aDGM5oykXeJOUR7cPQ==", - "requires": { + "dependencies": { "lodash": "^4.17.15", "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-package": { + "node_modules/mrm-task-package": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-package/-/mrm-task-package-2.0.3.tgz", "integrity": "sha512-nZmOGLqhqotjmd+Po9QLz8vR1CRXaJjz62BtenK0j5vodPOmEiY/QXSHm7CH/D0AlkqCajcIzJMkKgaDx1laIg==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "mrm-core": "^4.0.3", "user-meta": "^1.0.0" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-prettier": { + "node_modules/mrm-task-prettier": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-prettier/-/mrm-task-prettier-2.0.3.tgz", "integrity": "sha512-CP9le0bDyG8U/kwpyz57+dmO4zrWtjaj5bZK4NpWRI/iJyW7LugmBCms+18Qw6thgIW60Nr4azOAJLoOx6N/tQ==", - "requires": { + "dependencies": { "editorconfig-to-prettier": "0.1.1", "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-readme": { + "node_modules/mrm-task-readme": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-readme/-/mrm-task-readme-2.0.3.tgz", "integrity": "sha512-eJYMWZzuuHeTA6Lqq3jokyfGD70Wl6Kmb53NY6DO8jeD3+Htx3qSPisCOD3tcUhbOHBAbFj4U4iFaPtlKXp6CQ==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "mrm-core": "^4.0.3", "user-meta": "^1.0.0" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-semantic-release": { + "node_modules/mrm-task-semantic-release": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/mrm-task-semantic-release/-/mrm-task-semantic-release-3.0.3.tgz", "integrity": "sha512-a88Yr/vp4sPKfElgQzn+xVmQJtUPXvFGKBQ2v3xv3zrN5glQLvs7GeehVVQ6Z4aSILpy1SPqmsQzMa/CT7/DKw==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-styleguidist": { + "node_modules/mrm-task-styleguidist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-styleguidist/-/mrm-task-styleguidist-2.0.3.tgz", "integrity": "sha512-ZQBqdwo4fTd3FadZSl9n9LeS9Cwrqw767F/Mta19kxLKBtLf3zNmbkOAEYrh8wjRQbjWrVnu9jglG5R0ozl8rw==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-stylelint": { + "node_modules/mrm-task-stylelint": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/mrm-task-stylelint/-/mrm-task-stylelint-3.0.3.tgz", "integrity": "sha512-qm//EuoCmXPombChT1oZ4PY6jF8m7SjCioZzY6WLmaNKaWTuertQP1AZ13dmY/npaE/ABdgKqWoKNpbnnqvdTA==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-travis": { + "node_modules/mrm-task-travis": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-travis/-/mrm-task-travis-2.0.3.tgz", "integrity": "sha512-Jq/2jWFGefez6Bn15f/lmMi0QAkqXsMg5ihvCCaUQhs2NhmH4AGi/ca0p8GsYqAQ4B4o9WOtEGaHEDG4eRKAzg==", - "requires": { + "dependencies": { "git-username": "^1.0.0", "lodash": "^4.17.15", "mrm-core": "^4.0.3", "semver-utils": "^1.1.4" + }, + "engines": { + "node": ">=8.9" } }, - "mrm-task-typescript": { + "node_modules/mrm-task-typescript": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/mrm-task-typescript/-/mrm-task-typescript-2.0.3.tgz", "integrity": "sha512-IyNXnGRe2Wx8O2vjTT3w/kNW0AmbKnyVvqMZlwVT1aH96ETlbCxHtQQ/+NH4mriBhLCGmhujtPiPFQ2bh50uiw==", - "requires": { + "dependencies": { "mrm-core": "^4.0.3" + }, + "engines": { + "node": ">=8.9" } }, - "ms": { + "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "multimatch": { + "node_modules/multimatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "requires": { + "dependencies": { "@types/minimatch": "^3.0.3", "array-differ": "^3.0.0", "array-union": "^2.1.0", "arrify": "^2.0.1", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "mute-stream": { + "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "nested-error-stacks": { + "node_modules/nested-error-stacks": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==" }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "normalize-url": { + "node_modules/normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } }, - "npm-prefix": { + "node_modules/npm-prefix": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/npm-prefix/-/npm-prefix-1.2.0.tgz", "integrity": "sha1-5hlFX3B0ulTMZtbQ033Z8b5ry8A=", "dev": true, - "requires": { + "dependencies": { "rc": "^1.1.0", "shellsubstitute": "^1.1.0", "untildify": "^2.1.0" } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "number-is-nan": { + "node_modules/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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "object-assign": { + "node_modules/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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } + "engines": { + "node": ">=6" } }, - "opencollective-postinstall": { + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/opencollective-postinstall": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", - "dev": true + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } }, - "ora": { + "node_modules/ora": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", - "requires": { + "dependencies": { "chalk": "^2.1.0", "cli-cursor": "^2.1.0", "cli-spinners": "^1.0.1", "log-symbols": "^2.1.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dependencies": { - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - } + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "os-homedir": { + "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } }, - "os-shim": { + "node_modules/os-shim": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, - "os-tmpdir": { + "node_modules/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=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } }, - "p-any": { + "node_modules/p-any": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-any/-/p-any-2.1.0.tgz", "integrity": "sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg==", "dev": true, - "requires": { + "dependencies": { "p-cancelable": "^2.0.0", "p-some": "^4.0.0", "type-fest": "^0.3.0" }, - "dependencies": { - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - } + "engines": { + "node": ">=8" + } + }, + "node_modules/p-any/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" } }, - "p-cancelable": { + "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } }, - "p-defer": { + "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-finally": { + "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } }, - "p-is-promise": { + "node_modules/p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { + "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "p-map": { + "node_modules/p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "p-memoize": { + "node_modules/p-memoize": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-2.1.0.tgz", "integrity": "sha512-c6+a2iV4JyX0r4+i2IBJYO0r6LZAT2fg/tcB6GQbv1uzZsfsmKT7Ej5DRT1G6Wi7XUJSV2ZiP9+YEtluvhCmkg==", "dev": true, - "requires": { + "dependencies": { "mem": "^4.0.0", "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-some": { + "node_modules/p-some": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-some/-/p-some-4.1.0.tgz", "integrity": "sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g==", "dev": true, - "requires": { + "dependencies": { "aggregate-error": "^3.0.0", "p-cancelable": "^2.0.0" }, - "dependencies": { - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "p-timeout": { + "node_modules/p-some/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, - "requires": { + "dependencies": { "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } }, - "package-json": { + "node_modules/package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { + "dependencies": { "got": "^9.6.0", "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-entities": { + "node_modules/parse-entities": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", "dev": true, - "requires": { + "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", @@ -2577,150 +3314,197 @@ "is-hexadecimal": "^1.0.0" } }, - "parse-git-config": { + "node_modules/parse-git-config": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "fs-exists-sync": "^0.1.0", "git-config-path": "^1.0.1", "ini": "^1.3.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "parse-github-url": { + "node_modules/parse-github-url": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==" + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } }, - "parse-json": { + "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": { + "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "parse-passwd": { + "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "engines": { + "node": ">=0.10.0" + } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/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=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } }, - "path-is-inside": { + "node_modules/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=" }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picomatch": { + "node_modules/picomatch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "please-upgrade-node": { + "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, - "requires": { + "dependencies": { "semver-compare": "^1.0.0" } }, - "pre-commit": { + "node_modules/pre-commit": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", "dev": true, - "requires": { + "hasInstallScript": true, + "dependencies": { "cross-spawn": "^5.0.1", "spawn-sync": "^1.0.15", "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/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, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, "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" - } - }, - "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 - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "precise-commits": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/precise-commits": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/precise-commits/-/precise-commits-1.0.2.tgz", "integrity": "sha512-PYkoNTFXVvZRzJTDxdgzmPanhSNGj5Wtj2NgSo7IhwNXGcKktX+L4DJhyIrhFSLsWWAvd+cYyyU2eXlaX5QxzA==", - "requires": { + "dependencies": { "diff-match-patch": "^1.0.0", "execa": "^0.9.0", "find-up": "^2.1.0", @@ -2729,141 +3513,198 @@ "mri": "^1.1.0", "ora": "^1.3.0" }, + "bin": { + "precise-commits": "bin/index.js" + }, + "peerDependencies": { + "prettier": ">=1.8.0" + } + }, + "node_modules/precise-commits/node_modules/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=", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/precise-commits/node_modules/execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "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=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", - "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", - "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" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "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=", - "requires": { - "path-key": "^2.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "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=", - "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=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "prepend-http": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "node_modules/precise-commits/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/precise-commits/node_modules/locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "prettier": { + "node_modules/precise-commits/node_modules/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.1.tgz", - "integrity": "sha512-piXGBcY1zoFOG0MvHpNE5reAGseLmaCRifQ/fmfF49BcYkInEs/naD/unxGNAeOKFA5+JxVrPyMvMlpzcd20UA==", - "dev": true + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/precise-commits/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/precise-commits/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/precise-commits/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } }, - "pretty-quick": { + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-quick": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-2.0.1.tgz", "integrity": "sha512-y7bJt77XadjUr+P1uKqZxFWLddvj3SKY6EU4BuQtMxmmEFSMpbN132pUWdSG1g1mtUfO0noBvn7wBf0BVeomHg==", - "requires": { + "dependencies": { "chalk": "^2.4.2", "execa": "^2.1.0", "find-up": "^4.1.0", @@ -2871,244 +3712,308 @@ "mri": "^1.1.4", "multimatch": "^4.0.0" }, + "bin": { + "pretty-quick": "bin/pretty-quick.js" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "prettier": ">=1.8.0" + } + }, + "node_modules/pretty-quick/node_modules/execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/pretty-quick/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dependencies": { - "execa": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", - "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", - "requires": { - "path-key": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - } - } - }, - "process-nextick-args": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "prop-ini": { + "node_modules/prop-ini": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/prop-ini/-/prop-ini-0.0.2.tgz", "integrity": "sha1-ZzOny1JCrKsr5C5gdYPYEksXKls=", - "requires": { + "dependencies": { "extend": "^3.0.0" } }, - "propose": { + "node_modules/propose": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/propose/-/propose-0.0.5.tgz", "integrity": "sha1-SKBl2ex9TIZn9AULFcSi2F28pWs=", "dev": true, - "requires": { + "dependencies": { "levenshtein-edit-distance": "^1.0.0" } }, - "pseudomap": { + "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "public-ip": { + "node_modules/public-ip": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/public-ip/-/public-ip-4.0.4.tgz", "integrity": "sha512-EJ0VMV2vF6Cu7BIPo3IMW1Maq6ME+fbR0NcPmqDfpfNGIRPue1X8QrGjrg/rfjDkOsIkKHIf2S5FlEa48hFMTA==", "dev": true, - "requires": { + "dependencies": { "dns-socket": "^4.2.2", "got": "^9.6.0", "is-ip": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "pump": { + "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "rc": { + "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { + "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.0.7" + }, + "engines": { + "node": ">=8.10.0" } }, - "readme-badger": { + "node_modules/readme-badger": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/readme-badger/-/readme-badger-0.3.0.tgz", "integrity": "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0" } }, - "regenerator-runtime": { + "node_modules/regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, - "registry-auth-token": { + "node_modules/registry-auth-token": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", - "requires": { + "dependencies": { "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" } }, - "registry-url": { + "node_modules/registry-url": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { + "dependencies": { "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" } }, - "remark": { + "node_modules/remark": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/remark/-/remark-11.0.2.tgz", "integrity": "sha512-bh+eJgn8wgmbHmIBOuwJFdTVRVpl3fcVP6HxmpPWO0ULGP9Qkh6INJh0N5Uy7GqlV7DQYGoqaKiEIpM5LLvJ8w==", "dev": true, - "requires": { + "dependencies": { "remark-parse": "^7.0.0", "remark-stringify": "^7.0.0", "unified": "^8.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-cli": { + "node_modules/remark-cli": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-7.0.1.tgz", "integrity": "sha512-CUjBLLSbEay0mNwOO+pptnLIoS8UB6cHlhZVpTRKbtbIcw6YEzEfD7jGjW1HCA8lZK87IfY3/DuWE6DlXu+hfg==", "dev": true, - "requires": { + "dependencies": { "markdown-extensions": "^1.1.0", "remark": "^11.0.0", "unified-args": "^7.0.0" + }, + "bin": { + "remark": "cli.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-lint": { + "node_modules/remark-lint": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-6.0.5.tgz", "integrity": "sha512-o1I3ddm+KNsTxk60wWGI+p2yU1jB1gcm8jo2Sy6VhJ4ab2TrQIp1oQbp5xeLoFXYSh/NAqCpKjHkCM/BYpkFdQ==", "dev": true, - "requires": { + "dependencies": { "remark-message-control": "^4.0.0" } }, - "remark-lint-no-dead-urls": { + "node_modules/remark-lint-no-dead-urls": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remark-lint-no-dead-urls/-/remark-lint-no-dead-urls-1.1.0.tgz", "integrity": "sha512-it3EZmMQ+hwGhUf60NkXN0mMIFuFkS0cxdbgEbhZ/Fj1PlUBpe3gDBtWJ/sqNwSNvQlNSzpvMQkNHSoAhlsVjA==", "dev": true, - "requires": { + "dependencies": { "check-links": "^1.1.8", "is-online": "^8.2.1", "unified-lint-rule": "^1.0.4", "unist-util-visit": "^2.0.1" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/remark-lint-no-dead-urls/node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-dead-urls/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-dead-urls/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, "dependencies": { - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - } - } - }, - "remark-message-control": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-message-control": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-4.2.0.tgz", "integrity": "sha512-WXH2t5ljTyhsXlK1zPBLF3iPHbXl58R94phPMreS1xcHWBZJt6Oiu8RtNjy1poZFb3PqKnbYLJeR/CWcZ1bTFw==", "dev": true, - "requires": { + "dependencies": { "mdast-comment-marker": "^1.0.0", "unified-message-control": "^1.0.0", "xtend": "^4.0.1" } }, - "remark-parse": { + "node_modules/remark-parse": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==", "dev": true, - "requires": { + "dependencies": { "collapse-white-space": "^1.0.2", "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0", @@ -3124,14 +4029,18 @@ "unist-util-remove-position": "^1.0.0", "vfile-location": "^2.0.0", "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-stringify": { + "node_modules/remark-stringify": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-7.0.4.tgz", "integrity": "sha512-qck+8NeA1D0utk1ttKcWAoHRrJxERYQzkHDyn+pF5Z4whX1ug98uCNPPSeFgLSaNERRxnD6oxIug6DzZQth6Pg==", "dev": true, - "requires": { + "dependencies": { "ccount": "^1.0.0", "is-alphanumeric": "^1.0.0", "is-decimal": "^1.0.0", @@ -3146,14 +4055,18 @@ "stringify-entities": "^2.0.0", "unherit": "^1.0.4", "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-validate-links": { + "node_modules/remark-validate-links": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/remark-validate-links/-/remark-validate-links-9.0.1.tgz", "integrity": "sha512-+ZW2xzqDEujM+oPkutHm5LiTkMXeE7ldzruwi1xYVYq5xOE+zbPf0UMpc14ek2yn10T9Vvc+xLF5njZILqyAFw==", "dev": true, - "requires": { + "dependencies": { "github-slugger": "^1.2.0", "hosted-git-info": "^2.5.0", "mdast-util-to-string": "^1.0.4", @@ -3164,303 +4077,362 @@ "xtend": "^4.0.0" } }, - "remote-origin-url": { + "node_modules/remote-origin-url": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-1.0.0.tgz", "integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA==", - "requires": { + "dependencies": { "parse-git-config": "^1.1.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } }, - "replace-ext": { + "node_modules/replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "requireg": { + "node_modules/requireg": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "requires": { + "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" } }, - "resolve": { + "node_modules/resolve": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "requires": { + "dependencies": { "path-parse": "^1.0.5" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "responselike": { + "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { + "dependencies": { "lowercase-keys": "^1.0.0" } }, - "restore-cursor": { + "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { + "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dependencies": { - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - } + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "run-async": { + "node_modules/run-async": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "requires": { + "dependencies": { "is-promise": "^2.1.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "rxjs": { + "node_modules/rxjs": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "requires": { + "dependencies": { "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "semver": { + "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } }, - "semver-compare": { + "node_modules/semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "semver-diff": { + "node_modules/semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { + "dependencies": { "semver": "^5.0.3" }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "engines": { + "node": ">=0.10.0" } }, - "semver-regex": { + "node_modules/semver-diff/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "semver-utils": { + "node_modules/semver-utils": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } }, - "shellsubstitute": { + "node_modules/shellsubstitute": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shellsubstitute/-/shellsubstitute-1.2.0.tgz", "integrity": "sha1-5PcCpQxRiw9v6YRRiQ1wWvKba3A=", "dev": true }, - "sigmund": { + "node_modules/sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "slice-ansi": { + "node_modules/slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "sliced": { + "node_modules/sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=", "dev": true }, - "smpltmpl": { + "node_modules/smpltmpl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz", "integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==", - "requires": { + "dependencies": { "babel-code-frame": "^6.26.0" + }, + "engines": { + "node": ">=4" } }, - "spawn-sync": { + "node_modules/spawn-sync": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", "dev": true, - "requires": { + "hasInstallScript": true, + "dependencies": { "concat-stream": "^1.4.7", "os-shim": "^0.1.2" - }, + } + }, + "node_modules/spawn-sync/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/spawn-sync/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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" - } - }, - "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 - }, - "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" - } - } - } - }, - "split-lines": { + "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" + } + }, + "node_modules/spawn-sync/node_modules/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 + }, + "node_modules/spawn-sync/node_modules/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, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/split-lines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.0.0.tgz", - "integrity": "sha512-gaIdhbqxkB5/VflPXsJwZvEzh/kdwiRPF9iqpkxX4us+lzB8INedFwjCyo6vwuz5x2Ddlnav2zh270CEjCG8mA==" + "integrity": "sha512-gaIdhbqxkB5/VflPXsJwZvEzh/kdwiRPF9iqpkxX4us+lzB8INedFwjCyo6vwuz5x2Ddlnav2zh270CEjCG8mA==", + "engines": { + "node": ">=6" + } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "state-toggle": { + "node_modules/state-toggle": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", "dev": true }, - "string-argv": { + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6.19" + } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } + "engines": { + "node": ">=8" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "stringify-entities": { + "node_modules/stringify-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz", "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==", "dev": true, - "requires": { + "dependencies": { "character-entities-html4": "^1.0.0", "character-entities-legacy": "^1.0.0", "is-alphanumerical": "^1.0.0", @@ -3468,243 +4440,309 @@ "is-hexadecimal": "^1.0.0" } }, - "stringify-object": { + "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, - "requires": { + "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { + "dependencies": { "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } }, - "strip-json-comments": { + "node_modules/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=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "symbol-observable": { + "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "term-size": { + "node_modules/term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { + "dependencies": { "execa": "^0.7.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/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=", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/term-size/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dependencies": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/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=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/term-size/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "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=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "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" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "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=", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "text-table": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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 }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "tmp": { + "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { + "dependencies": { "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "to-readable-stream": { + "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "to-vfile": { + "node_modules/to-vfile": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.0.0.tgz", "integrity": "sha512-i9fwXXSsHLu7mzgixc1WjgnqSe6pGpjnzCYoFmrASvEueLfyKf09QAe+XQYu8OAJ62aFqHpe2EKXojeRVvEzqA==", "dev": true, - "requires": { + "dependencies": { "is-buffer": "^2.0.0", "vfile": "^4.0.0" } }, - "trim": { + "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "deprecated": "Use String.prototype.trim() instead", "dev": true }, - "trim-trailing-lines": { + "node_modules/trim-trailing-lines": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", "dev": true }, - "trough": { + "node_modules/trough": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", "dev": true }, - "tslib": { + "node_modules/tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, - "type-fest": { + "node_modules/type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } }, - "typedarray": { + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "unherit": { + "node_modules/unherit": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.1", "xtend": "^4.0.1" } }, - "unified": { + "node_modules/unified": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", "dev": true, - "requires": { + "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unified-args": { + "node_modules/unified-args": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/unified-args/-/unified-args-7.1.0.tgz", "integrity": "sha512-soi9Rn7l5c1g0RfElSCHMwaxeiclSI0EsS3uZmMPUOfwMeeeZjLpNmHAowV9iSlQh59iiZhSMyQu9lB8WnIz5g==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "chalk": "^2.0.0", "chokidar": "^3.0.0", @@ -3715,12 +4753,12 @@ "unified-engine": "^7.0.0" } }, - "unified-engine": { + "node_modules/unified-engine": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-7.0.0.tgz", "integrity": "sha512-zH/MvcISpWg3JZtCoY/GYBw1WnVHkhnPoMBWpmuvAifCPSS9mzT9EbtimesJp6t2nnr/ojI0mg3TmkO1CjIwVA==", "dev": true, - "requires": { + "dependencies": { "concat-stream": "^2.0.0", "debug": "^4.0.0", "fault": "^1.0.0", @@ -3743,117 +4781,144 @@ "xtend": "^4.0.1" } }, - "unified-lint-rule": { + "node_modules/unified-lint-rule": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-1.0.6.tgz", "integrity": "sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg==", "dev": true, - "requires": { + "dependencies": { "wrapped": "^1.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unified-message-control": { + "node_modules/unified-message-control": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-1.0.4.tgz", "integrity": "sha512-e1dEtN4Z/TvLn/qHm+xeZpzqhJTtfZusFErk336kkZVpqrJYiV9ptxq+SbRPFMlN0OkjDYHmVJ929KYjsMTo3g==", "dev": true, - "requires": { + "dependencies": { "trim": "0.0.1", "unist-util-visit": "^1.0.0", "vfile-location": "^2.0.0" } }, - "unique-random": { + "node_modules/unique-random": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-random/-/unique-random-1.0.0.tgz", - "integrity": "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ=" + "integrity": "sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ=", + "engines": { + "node": ">=0.10.0" + } }, - "unique-random-array": { + "node_modules/unique-random-array": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-random-array/-/unique-random-array-1.0.0.tgz", "integrity": "sha1-QrNyHFeTiNi2Z8k8Lb3j1dgakTY=", - "requires": { + "dependencies": { "unique-random": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "unique-string": { + "node_modules/unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { + "dependencies": { "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "unist-util-inspect": { + "node_modules/unist-util-inspect": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-4.1.4.tgz", "integrity": "sha512-7xxyvKiZ1SC9vL5qrMqKub1T31gRHfau4242F69CcaOrXt//5PmRVOmDZ36UAEgiT+tZWzmQmbNZn+mVtnR9HQ==", "dev": true, - "requires": { + "dependencies": { "is-empty": "^1.0.0" } }, - "unist-util-is": { + "node_modules/unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", "dev": true }, - "unist-util-remove-position": { + "node_modules/unist-util-remove-position": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", "dev": true, - "requires": { + "dependencies": { "unist-util-visit": "^1.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-util-stringify-position": { + "node_modules/unist-util-stringify-position": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.2.tgz", "integrity": "sha512-nK5n8OGhZ7ZgUwoUbL8uiVRwAbZyzBsB/Ddrlbu6jwwubFza4oe15KlyEaLNMXQW1svOQq4xesUeqA85YrIUQA==", "dev": true, - "requires": { + "dependencies": { "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-util-visit": { + "node_modules/unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "dev": true, - "requires": { + "dependencies": { "unist-util-visit-parents": "^2.0.0" } }, - "unist-util-visit-parents": { + "node_modules/unist-util-visit-parents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "dev": true, - "requires": { + "dependencies": { "unist-util-is": "^3.0.0" } }, - "universalify": { + "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } }, - "untildify": { + "node_modules/untildify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=", "dev": true, - "requires": { + "dependencies": { "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "update-notifier": { + "node_modules/update-notifier": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", - "requires": { + "dependencies": { "boxen": "^3.0.0", "chalk": "^2.0.1", "configstore": "^4.0.0", @@ -3866,260 +4931,326 @@ "latest-version": "^5.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "url-parse-lax": { + "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { + "dependencies": { "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "user-home": { + "node_modules/user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "requires": { + "dependencies": { "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "user-meta": { + "node_modules/user-meta": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/user-meta/-/user-meta-1.0.0.tgz", "integrity": "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw==", - "requires": { + "dependencies": { "rc": "^1.2.1" + }, + "engines": { + "node": ">=4" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "vfile": { + "node_modules/vfile": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.2.tgz", "integrity": "sha512-yhoTU5cDMSsaeaMfJ5g0bUKYkYmZhAh9fn9TZicxqn+Cw4Z439il2v3oT9S0yjlpqlI74aFOQCt3nOV+pxzlkw==", "dev": true, - "requires": { + "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "replace-ext": "1.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "vfile-location": { + "node_modules/vfile-location": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", - "dev": true + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "vfile-message": { + "node_modules/vfile-message": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.2.tgz", "integrity": "sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA==", "dev": true, - "requires": { + "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "vfile-reporter": { + "node_modules/vfile-reporter": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.0.tgz", "integrity": "sha512-8Is0XxFxWJUhPJdOg3CyZTqd3ICCWg6r304PuBl818ZG91h4FMS3Q+lrOPS+cs5/DZK3H0+AkJdH0J8JEwKtDA==", "dev": true, - "requires": { + "dependencies": { "repeat-string": "^1.5.0", "string-width": "^4.0.0", "supports-color": "^6.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-sort": "^2.1.2", "vfile-statistics": "^1.1.0" - }, + } + }, + "node_modules/vfile-reporter/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "vfile-sort": { + "node_modules/vfile-sort": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.1.tgz", "integrity": "sha512-5dt7xEhC44h0uRQKhbM2JAe0z/naHphIZlMOygtMBM9Nn0pZdaX5fshhwWit9wvsuP8t/wp43nTDRRErO1WK8g==", "dev": true }, - "vfile-statistics": { + "node_modules/vfile-statistics": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.3.tgz", "integrity": "sha512-CstaK/ebTz1W3Qp41Bt9Lj/2DmumFsCwC2sKahDNSPh0mPh7/UyMLCoU8ZBX34CRU0d61B4W41yIFsV0NKMZeA==", "dev": true }, - "webpack-merge": { + "node_modules/webpack-merge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "requires": { + "dependencies": { "lodash": "^4.17.15" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-pm-runs": { + "node_modules/which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, - "widest-line": { + "node_modules/widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { + "dependencies": { "string-width": "^2.1.1" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wrap-ansi": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", "dev": true, - "requires": { + "dependencies": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "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 - }, - "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 - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wrapped": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrapped": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wrapped/-/wrapped-1.0.1.tgz", "integrity": "sha1-x4PZ2Aeyc+mwHoUWgKk4yHyQckI=", "dev": true, - "requires": { + "dependencies": { "co": "3.1.0", "sliced": "^1.0.1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, - "x-is-string": { + "node_modules/x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, - "xdg-basedir": { + "node_modules/xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "engines": { + "node": ">=4" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4" + } }, - "yallist": { + "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, - "yaml": { + "node_modules/yaml": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", "dev": true, - "requires": { + "dependencies": { "@babel/runtime": "^7.8.7" + }, + "engines": { + "node": ">= 6" } } } diff --git a/package.json b/package.json index f6ae0be5f..29d716989 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,14 @@ "scripts": { "precommit": "lint-staged", "postcommit": "git update-index --again", - "validate-links": "remark ." + "validate-links": "remark .", + "prettier": "prettier --write ." }, "devDependencies": { "husky": "^4.2.3", "lint-staged": "^10.0.8", "pre-commit": "^1.2.2", - "prettier": "^2.0.1", + "prettier": "^2.8.8", "remark-cli": "^7.0.1", "remark-lint": "^6.0.5", "remark-lint-no-dead-urls": "^1.1.0", diff --git a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/App.test.js b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/App.test.js index 1f03afeec..9382b9ad5 100644 --- a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/App.test.js +++ b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/App.test.js @@ -1,7 +1,7 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; +import { render, screen } from "@testing-library/react"; +import App from "./App"; -test('renders learn react link', () => { +test("renders learn react link", () => { render(); const linkElement = screen.getByText(/learn react/i); expect(linkElement).toBeInTheDocument(); diff --git a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.css b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.css index ec2585e8c..4a1df4db7 100644 --- a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.css +++ b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.css @@ -1,13 +1,13 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.js b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.js index ef2edf8ea..ad9cbbbf8 100644 --- a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.js +++ b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/index.js @@ -1,14 +1,14 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; ReactDOM.render( , - document.getElementById('root') + document.getElementById("root") ); // If you want to start measuring performance in your app, pass a function diff --git a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/reportWebVitals.js b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/reportWebVitals.js index 5253d3ad9..9ecd33f9c 100644 --- a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/reportWebVitals.js +++ b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/reportWebVitals.js @@ -1,6 +1,6 @@ -const reportWebVitals = onPerfEntry => { +const reportWebVitals = (onPerfEntry) => { if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { getCLS(onPerfEntry); getFID(onPerfEntry); getFCP(onPerfEntry); diff --git a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/setupTests.js b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/setupTests.js index 8f2609b7b..1dd407a63 100644 --- a/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/setupTests.js +++ b/pair-programming/week-7/react-express-app/starter-code/React-express-starter-code/client/src/setupTests.js @@ -2,4 +2,4 @@ // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; +import "@testing-library/jest-dom"; diff --git a/personal-brand/personal-branding.md b/personal-brand/personal-branding.md index 9c0412d5c..f1e6e08d2 100644 --- a/personal-brand/personal-branding.md +++ b/personal-brand/personal-branding.md @@ -3,7 +3,7 @@ ### Softskills for Week 2 - What are your personal values, and how does your personal brand reflect that? -- 3 parts of the soft skills answer: +- 3 parts of the soft skills answer: - Intro - a super short summary of what you will be talking about - give me the punch line right away - Story - only tell details that show what you did! - Take away “What I learned from this”, “Going forward I will always”, “The lesson I learned from this situation”... @@ -29,7 +29,7 @@ ### Specific Things To Learn -- Using Twitter—following, tweeting, blocking, and muting +- Using Twitter—following, tweeting, blocking, and muting - Tips for blogging - Tips for being social through GitHub @@ -49,16 +49,15 @@ Spend a few minutes reading ["How to win friends and stand out from the crowd"]( - Get involved on Twitter and GitHub - Share your experience - Blog - - Tweet + - Tweet - Speak - + 3. Control your dialogue - Use Twitter—following, tweeting, blocking. - We recommend using [Twitter's reply controls](https://www.socialmediatoday.com/news/twitter-rolls-out-tweet-reply-controls-to-all-users/583327/) to prevent trolls from replying to your tweets. - Use [Block Party](https://www.blockpartyapp.com/) to filter out unwanted @mentions from Twitter, and continue to use Twitter as normal. - ### Common Mistakes / Misconceptions - Most new developers feel they need to be an expert at something before they can share on a topic. The irony is, there are not lots of free beginner content out there for new developer geared towards new developers and the same new developers are in the best position to teach each other today. No matter how new you are, there is someone who knows less than you and you are in the best position to teach them. @@ -71,7 +70,6 @@ Spend a few minutes reading ["How to win friends and stand out from the crowd"]( Tweet about your Techtonica experience on Twitter using the [#BridgeTheTechGap](https://twitter.com/search?q=%23BridgeTheTechGap) or [#CodeNewbie ](https://twitter.com/search?q=%23CodeNewbie)hashtag. - ### Supplemental Resources - [templates.netlify.com](http://templates.netlify.com/) - List a variety of website templates. diff --git a/practice/participants.md b/practice/participants.md index eaeaaecc2..91a09fa86 100644 --- a/practice/participants.md +++ b/practice/participants.md @@ -22,6 +22,7 @@ - Mega Soegiarto! # 2020 H1 + - Lisa Au - Zhag Magauina - Tahshara Boochee @@ -40,8 +41,8 @@ - Leia "Lei" Quesada - Mandy "chocolat" Chen - Meia "Cat Mom" Natividad -- Abigail "boba" Edwards -- Yingjie Wang +- Abigail "boba" Edwards +- Yingjie Wang # 2022 H1 @@ -60,4 +61,4 @@ - Harneet Kaur - Melissa Natividad -- Sophia Pung \ No newline at end of file +- Sophia Pung diff --git a/prework/6_DomExercise.html b/prework/6_DomExercise.html index c58c305cf..aa865c999 100644 --- a/prework/6_DomExercise.html +++ b/prework/6_DomExercise.html @@ -33,13 +33,9 @@

Here's some text in a paragraph

-
- I love learning about HTML and JavaScript -
+
I love learning about HTML and JavaScript
-

- Coding is fun -

+

Coding is fun



diff --git a/prework/7_FunctionsChallenges.js b/prework/7_FunctionsChallenges.js index db96dda45..a8095bbf1 100644 --- a/prework/7_FunctionsChallenges.js +++ b/prework/7_FunctionsChallenges.js @@ -5,7 +5,7 @@ // First try answering these without using references or looking up any information. // Then, check your answer by using references and/or running your code. -// You can run your JS code using the Chrome or Firefox Developer tools, or by using Node.js or using Replit.com +// You can run your JS code using the Chrome or Firefox Developer tools, or by using Node.js or using Replit.com // Feel free to update your answers if you got them wrong at first -- this exercise is for your own learning. // But make sure you understand why the correct answer is right. diff --git a/prework/8_ObjectsChallenges.js b/prework/8_ObjectsChallenges.js index 0153c4a09..05f19f0c7 100644 --- a/prework/8_ObjectsChallenges.js +++ b/prework/8_ObjectsChallenges.js @@ -5,7 +5,7 @@ // First try answering these without using references or looking up any information. // Then, check your answer by using references and/or running your code. -// You can run your JS code using the Chrome or Firefox Developer tools, or by using Node.js or using Replit.com +// You can run your JS code using the Chrome or Firefox Developer tools, or by using Node.js or using Replit.com // Feel free to update your answers if you got them wrong at first -- this exercise is for your own learning. // But make sure you understand why the correct answer is right. @@ -19,7 +19,6 @@ // let obj3 = {}; // keys(obj3); // [] - // Exercise 2. Write a function called values, which accepts an object and returns an array of all of the values in the object. // IMPORTANT: Do not use the built in Object.values() function! // Examples: @@ -68,6 +67,3 @@ // [1, 10] // minMaxKeyInObject({ 1: 'Elie', 4: 'Matt', 2: 'Tim' }); // [1, 4] - - - diff --git a/prework/git-udacity-instructions.md b/prework/git-udacity-instructions.md index fcd8ad090..1cd8e2e9f 100644 --- a/prework/git-udacity-instructions.md +++ b/prework/git-udacity-instructions.md @@ -1,15 +1,17 @@ We are using ZSH but Udacity expects you to use Bash. They are very similar, but they load configurations from different files. Complete the following steps before starting the Udacity course. From your terminal, paste the following lines: + - `cd ~ # Navigate to your home directory` - `atom .zshrc # Create a file named .zshrc if one does not already exist, and open it in Atom` (If the second step fails, you may need to [install Atom](https://atom.io/) first) In your Atom window, add the following lines to the bottm of .zshrc and then save: + ``` -# If bash profile exists, -if [ -f ~/.bash_profile ]; then +# If bash profile exists, +if [ -f ~/.bash_profile ]; then . ~/.bash_profile; fi ``` diff --git a/program-prep/financial-literacy.md b/program-prep/financial-literacy.md index b8e5f5dff..9f422ab70 100644 --- a/program-prep/financial-literacy.md +++ b/program-prep/financial-literacy.md @@ -117,15 +117,15 @@ Under each column put the source and in the next column put the amount. (use you ie. [Here is a list of common budgeting categories](http://www.allywalletwise.com/source/downloads/ally_WalletWise_MonthlyIncomeForm.pdf) so you don't leave anything out. | Column A | B | C | D | E | F | G | -| ------------- | -------------- | ------------ | -------------- | ----------- | -------------- | ------------------- | +| ------------- | -------------- | ------------ | -------------- | ----------- | -------------- | ------------------- | --- | | Income | =SUM(B2:B1000) | Expenses | =SUM(D3:D1000) | Debt | =SUM(F3:F1000) | Balance | | Job@ThisPlace | \$3000.00 | house | \$1500 | loan | \$175 | =SUM(B1)-SUM(D1+F1) | | Other income | \$\$ | groceries | \$250 | credit card | \$30 | | | | | phone | \$80 | | | | | | | electric | \$35 | | | | | | | clothes | \$50 | | | | -| | | clipper card | \$50 | | | | | -| | | savings | \$150 | | | | | +| | | clipper card | \$50 | | | | | +| | | savings | \$150 | | | | | ### Independent Practice diff --git a/project-example/week-10/sample-code/client/src/components/Controller.js b/project-example/week-10/sample-code/client/src/components/Controller.js index 1b93845c4..6eeb76152 100644 --- a/project-example/week-10/sample-code/client/src/components/Controller.js +++ b/project-example/week-10/sample-code/client/src/components/Controller.js @@ -27,7 +27,7 @@ const Controller = () => { const requestOptions = { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify(newSighting), + body: JSON.stringify(newSighting) }; const request = await fetch("/api/sighting", requestOptions); console.log(request); @@ -38,7 +38,7 @@ const Controller = () => { // Delete sighting from Sighting List const handleDeleteSighting = async (deleteId) => { let response = await fetch(`/api/sighting/${deleteId}`, { - method: "DELETE", + method: "DELETE" }); const deleteSighting = sighting.filter( diff --git a/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.css b/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.css index 62caa412c..34353cb99 100644 --- a/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.css +++ b/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.css @@ -1,101 +1,92 @@ .Form { - font-family: sans-serif; - text-align: center; - - } - - - .h1 { - margin-top: 80px; - color: rgb(38, 41, 227); - font-size: 35px; - padding-bottom: 0px; - text-align: center; - } - - .form { - max-width: 800px; - margin: 0 auto; - } + font-family: sans-serif; + text-align: center; +} - - textarea, - select, - input { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; - display: block; - box-sizing: border-box; - width: 100%; - border-radius: 4px; - border: 1px solid black; - padding: 10px 15px; - margin-bottom: 15px; - font-size: 14px; - } - - .label, - section > label { - line-height: 2; - text-align: left; - display: block; - margin-bottom: 13px; - margin-top: 20px; - color: white; - font-size: 14px; - font-weight: 200; - } - - .FormSubmit { - position: relative; - background: #4169E1; - color: white; - text-transform: uppercase; - border: none; - font-weight: 600; - margin-top: 20px; - padding: 20px; - font-size: 16px; - letter-spacing: 2px; - display: block; - appearance: none; - border-radius: 4px; - width: 100%; - font-weight: 400; - letter-spacing: 0.5rem; - transition: 0.3s all; - } - - - - .FormPage { - max-width: 600px; - margin: 0 auto; - } - - .container { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 20px; - } - - - - button[type="button"] { - padding: 5px; - background: #516391; - color: white; - letter-spacing: 0px; - text-transform: none; - padding: 10px; - letter-spacing: 1px; - } - - - - legend { - background-color: #87CEEB; - - padding: 3px 6px; - } \ No newline at end of file +.h1 { + margin-top: 80px; + color: rgb(38, 41, 227); + font-size: 35px; + padding-bottom: 0px; + text-align: center; +} + +.form { + max-width: 800px; + margin: 0 auto; +} + +textarea, +select, +input { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + display: block; + box-sizing: border-box; + width: 100%; + border-radius: 4px; + border: 1px solid black; + padding: 10px 15px; + margin-bottom: 15px; + font-size: 14px; +} + +.label, +section > label { + line-height: 2; + text-align: left; + display: block; + margin-bottom: 13px; + margin-top: 20px; + color: white; + font-size: 14px; + font-weight: 200; +} + +.FormSubmit { + position: relative; + background: #4169e1; + color: white; + text-transform: uppercase; + border: none; + font-weight: 600; + margin-top: 20px; + padding: 20px; + font-size: 16px; + letter-spacing: 2px; + display: block; + appearance: none; + border-radius: 4px; + width: 100%; + font-weight: 400; + letter-spacing: 0.5rem; + transition: 0.3s all; +} + +.FormPage { + max-width: 600px; + margin: 0 auto; +} + +.container { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 20px; +} + +button[type="button"] { + padding: 5px; + background: #516391; + color: white; + letter-spacing: 0px; + text-transform: none; + padding: 10px; + letter-spacing: 1px; +} + +legend { + background-color: #87ceeb; + + padding: 3px 6px; +} diff --git a/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.js b/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.js index 4ee19138f..14b5f13a3 100644 --- a/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.js +++ b/project-example/week-10/sample-code/client/src/components/addSightingForm/AddSightingForm.js @@ -46,7 +46,7 @@ const AddSightingForm = ({ addNewSighting }) => { lastSeen, location, email, - individual_id: selectedIndividual, + individual_id: selectedIndividual }); }} > diff --git a/project-example/week-10/sample-code/client/src/components/detail/DetailPage.css b/project-example/week-10/sample-code/client/src/components/detail/DetailPage.css index abf1c6672..9f0d046a1 100644 --- a/project-example/week-10/sample-code/client/src/components/detail/DetailPage.css +++ b/project-example/week-10/sample-code/client/src/components/detail/DetailPage.css @@ -1,20 +1,11 @@ - - .detailPage { - width: 100%; - height: 100vh; - - justify-content: center; - align-items: center; - text-align:justify; - - } - h1{ - color:blue - } - - - - - - \ No newline at end of file + width: 100%; + height: 100vh; + + justify-content: center; + align-items: center; + text-align: justify; +} +h1 { + color: blue; +} diff --git a/project-example/week-10/sample-code/client/src/components/header/Header.css b/project-example/week-10/sample-code/client/src/components/header/Header.css index bb8bff668..3e423fa5a 100644 --- a/project-example/week-10/sample-code/client/src/components/header/Header.css +++ b/project-example/week-10/sample-code/client/src/components/header/Header.css @@ -1,22 +1,17 @@ - - -ul { - display:flex; +ul { + display: flex; align-content: flex-end; list-style-type: none; - -} -li{ - padding: 1em; +} +li { + padding: 1em; font-weight: bold; font-size: 18px; } -.header -{ +.header { font-size: 38px; text-shadow: -1px -1px #f00, 1px 1px #a00, -3px 0 4px #000; - font-family:"Segoe print", Arial, Helvetica, sans-serif; + font-family: "Segoe print", Arial, Helvetica, sans-serif; color: #dd0000; } - diff --git a/project-example/week-10/sample-code/client/src/components/sighting/SightingList.css b/project-example/week-10/sample-code/client/src/components/sighting/SightingList.css index 17015a8c5..624186ec3 100644 --- a/project-example/week-10/sample-code/client/src/components/sighting/SightingList.css +++ b/project-example/week-10/sample-code/client/src/components/sighting/SightingList.css @@ -1,29 +1,24 @@ +.Table { + width: 100%; + height: 100vh; + display: flex; +} +table { + border: 2px solid rgba(9, 9, 9, 0.1); + width: 800px; + height: 200px; +} -.Table { - width: 100%; - height: 100vh; - display: flex; - - } - - table { - border: 2px solid rgba(9, 9, 9, 0.1); - width: 800px; - height: 200px; - } - - th { - border-bottom: 1px solid black; - padding-left: 20px; - } - - td { - padding-left: 20px; - } - -.List-Header{ - - color: blue; +th { + border-bottom: 1px solid black; + padding-left: 20px; +} + +td { + padding-left: 20px; +} + +.List-Header { + color: blue; } - \ No newline at end of file diff --git a/project-example/week-10/sample-code/client/src/index.css b/project-example/week-10/sample-code/client/src/index.css index d616112ea..9d256e698 100644 --- a/project-example/week-10/sample-code/client/src/index.css +++ b/project-example/week-10/sample-code/client/src/index.css @@ -1,7 +1,7 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; @@ -10,6 +10,6 @@ body { } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/project-example/week-10/sample-code/client/src/reportWebVitals.js b/project-example/week-10/sample-code/client/src/reportWebVitals.js index 5253d3ad9..9ecd33f9c 100644 --- a/project-example/week-10/sample-code/client/src/reportWebVitals.js +++ b/project-example/week-10/sample-code/client/src/reportWebVitals.js @@ -1,6 +1,6 @@ -const reportWebVitals = onPerfEntry => { +const reportWebVitals = (onPerfEntry) => { if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { getCLS(onPerfEntry); getFID(onPerfEntry); getFCP(onPerfEntry); diff --git a/project-example/week-10/sample-code/client/src/setupTests.js b/project-example/week-10/sample-code/client/src/setupTests.js index 8f2609b7b..1dd407a63 100644 --- a/project-example/week-10/sample-code/client/src/setupTests.js +++ b/project-example/week-10/sample-code/client/src/setupTests.js @@ -2,4 +2,4 @@ // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; +import "@testing-library/jest-dom"; diff --git a/project-example/week-10/sample-code/server/controller/individuals.js b/project-example/week-10/sample-code/server/controller/individuals.js index 557e7f313..30f57d31e 100644 --- a/project-example/week-10/sample-code/server/controller/individuals.js +++ b/project-example/week-10/sample-code/server/controller/individuals.js @@ -22,5 +22,5 @@ const getIndividualsOfSpecies = async (req, res) => { module.exports = { getAllIndividuals, - getIndividualsOfSpecies, + getIndividualsOfSpecies }; diff --git a/project-example/week-10/sample-code/server/controller/sightings.js b/project-example/week-10/sample-code/server/controller/sightings.js index a216bdee2..1e2cb0772 100644 --- a/project-example/week-10/sample-code/server/controller/sightings.js +++ b/project-example/week-10/sample-code/server/controller/sightings.js @@ -20,7 +20,7 @@ const addNewSighting = async (req, res) => { email: req.body.email, individualId: req.body.individual_id, createdOn: req.body.created_on || new Date().toISOString(), - sighterId: req.body.sighter_id, + sighterId: req.body.sighter_id }; console.log([newSighting.healthy, newSighting.location]); const result = await model.addNewSighting(newSighting); @@ -60,5 +60,5 @@ module.exports = { getAllSighting, addNewSighting, deleteSighting, - getSightingDetails, + getSightingDetails }; diff --git a/project-example/week-10/sample-code/server/controller/speciesController.js b/project-example/week-10/sample-code/server/controller/speciesController.js index 978b52fb6..9e9fb3175 100644 --- a/project-example/week-10/sample-code/server/controller/speciesController.js +++ b/project-example/week-10/sample-code/server/controller/speciesController.js @@ -12,5 +12,5 @@ const getAllSpecies = async (req, res) => { }; module.exports = { - getAllSpecies, + getAllSpecies }; diff --git a/project-example/week-10/sample-code/server/db/db-connection.js b/project-example/week-10/sample-code/server/db/db-connection.js index 768abefe0..8a75d9b0a 100644 --- a/project-example/week-10/sample-code/server/db/db-connection.js +++ b/project-example/week-10/sample-code/server/db/db-connection.js @@ -4,7 +4,7 @@ let db; function init() { if (!db) { db = new Pool({ - connectionString: process.env.DB_URI, + connectionString: process.env.DB_URI }); } return db; diff --git a/project-example/week-10/sample-code/server/models/individuals.js b/project-example/week-10/sample-code/server/models/individuals.js index 9709610b7..30d6da5ac 100644 --- a/project-example/week-10/sample-code/server/models/individuals.js +++ b/project-example/week-10/sample-code/server/models/individuals.js @@ -16,5 +16,5 @@ const getIndividualsOfSpecies = async (speciesId) => { module.exports = { getIndividual, - getIndividualsOfSpecies, + getIndividualsOfSpecies }; diff --git a/project-example/week-10/sample-code/server/models/sightings.js b/project-example/week-10/sample-code/server/models/sightings.js index 6b9bf1a7f..73c911a54 100644 --- a/project-example/week-10/sample-code/server/models/sightings.js +++ b/project-example/week-10/sample-code/server/models/sightings.js @@ -21,7 +21,7 @@ const addNewSighting = async (newSighting) => { newSighting.healthy, newSighting.individualId, newSighting.createdOn, - newSighting.email, + newSighting.email ] ); return result; @@ -59,5 +59,5 @@ module.exports = { addNewSighting, deleteSighting, - getSightingDetails, + getSightingDetails }; diff --git a/project-example/week-10/sample-code/server/models/species.js b/project-example/week-10/sample-code/server/models/species.js index 428897f8b..2a3c4695e 100644 --- a/project-example/week-10/sample-code/server/models/species.js +++ b/project-example/week-10/sample-code/server/models/species.js @@ -6,5 +6,5 @@ const getAllSpecies = async () => { }; module.exports = { - getAllSpecies, + getAllSpecies }; diff --git a/project-example/week-10/sample-code/server/routes/routes.js b/project-example/week-10/sample-code/server/routes/routes.js index f040eabc8..55a4f247f 100644 --- a/project-example/week-10/sample-code/server/routes/routes.js +++ b/project-example/week-10/sample-code/server/routes/routes.js @@ -7,7 +7,7 @@ const { getAllSighting, addNewSighting, deleteSighting, - getSightingDetails, + getSightingDetails } = require("../controller/sightings"); const router = express.Router(); diff --git a/project-example/week-7/weather-forecast/README.md b/project-example/week-7/weather-forecast/README.md index 166e20d9b..7ef754ea1 100644 --- a/project-example/week-7/weather-forecast/README.md +++ b/project-example/week-7/weather-forecast/README.md @@ -44,6 +44,6 @@ Note: Server runs on http://localhost:5000 and client on http://localhost:3000 ### Resource + - [How to easily manipulate URL search parameters in JavaScript](https://felixgerschau.com/js-manipulate-url-search-params/) - [How the frontend and backend work together for the weather project by Kimberly Dang](https://youtu.be/pCSHm0GrcSQ) - diff --git a/project-example/week-7/weather-forecast/client/src/App.css b/project-example/week-7/weather-forecast/client/src/App.css index dd9e89032..c9ee17a28 100644 --- a/project-example/week-7/weather-forecast/client/src/App.css +++ b/project-example/week-7/weather-forecast/client/src/App.css @@ -2,17 +2,10 @@ /* text-align: center; */ margin: auto; padding-left: 20px; - } - .App-header{ - color:blue - } -.data{ - color: purple } - - - - - - - +.App-header { + color: blue; +} +.data { + color: purple; +} diff --git a/project-example/week-7/weather-forecast/client/src/index.css b/project-example/week-7/weather-forecast/client/src/index.css index ec2585e8c..4a1df4db7 100644 --- a/project-example/week-7/weather-forecast/client/src/index.css +++ b/project-example/week-7/weather-forecast/client/src/index.css @@ -1,13 +1,13 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/project-example/week-7/weather-forecast/client/src/index.js b/project-example/week-7/weather-forecast/client/src/index.js index ef2edf8ea..ad9cbbbf8 100644 --- a/project-example/week-7/weather-forecast/client/src/index.js +++ b/project-example/week-7/weather-forecast/client/src/index.js @@ -1,14 +1,14 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; ReactDOM.render( , - document.getElementById('root') + document.getElementById("root") ); // If you want to start measuring performance in your app, pass a function diff --git a/project-example/week-7/weather-forecast/client/src/reportWebVitals.js b/project-example/week-7/weather-forecast/client/src/reportWebVitals.js index 5253d3ad9..9ecd33f9c 100644 --- a/project-example/week-7/weather-forecast/client/src/reportWebVitals.js +++ b/project-example/week-7/weather-forecast/client/src/reportWebVitals.js @@ -1,6 +1,6 @@ -const reportWebVitals = onPerfEntry => { +const reportWebVitals = (onPerfEntry) => { if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { getCLS(onPerfEntry); getFID(onPerfEntry); getFCP(onPerfEntry); diff --git a/project-example/week-7/weather-forecast/client/src/setupTests.js b/project-example/week-7/weather-forecast/client/src/setupTests.js index 8f2609b7b..1dd407a63 100644 --- a/project-example/week-7/weather-forecast/client/src/setupTests.js +++ b/project-example/week-7/weather-forecast/client/src/setupTests.js @@ -2,4 +2,4 @@ // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; +import "@testing-library/jest-dom"; diff --git a/project-example/week-7/weather-forecast/server/index.mjs b/project-example/week-7/weather-forecast/server/index.mjs index 2d2a3f6b2..63cb2d810 100644 --- a/project-example/week-7/weather-forecast/server/index.mjs +++ b/project-example/week-7/weather-forecast/server/index.mjs @@ -19,7 +19,7 @@ app.get("/weather", (req, res) => { const params = new URLSearchParams({ q: req.query.cityName, appid: process.env.API_KEY, - units: "imperial", + units: "imperial" }); const url = `https://api.openweathermap.org/data/2.5/weather?${params}`; console.log(url); diff --git a/project-example/week-9/eventonica/README.md b/project-example/week-9/eventonica/README.md index ecb5f9e67..a7399bc87 100644 --- a/project-example/week-9/eventonica/README.md +++ b/project-example/week-9/eventonica/README.md @@ -6,7 +6,6 @@ In this project, you'll make a web app to manage events. You'll work on this project over the next several days. The features will remain the same but as you learn more libraries and techniques, you'll integrate those into the app. By the end you'll have built a full-stack web app with React and a database. - ## Project Goals (You will NOT be able to do everything, so choose the things you need extra practice on!) ### Technology diff --git a/project-example/week-9/eventonica/eventonica-sample-code/client/src/App.test.js b/project-example/week-9/eventonica/eventonica-sample-code/client/src/App.test.js index 1f03afeec..9382b9ad5 100644 --- a/project-example/week-9/eventonica/eventonica-sample-code/client/src/App.test.js +++ b/project-example/week-9/eventonica/eventonica-sample-code/client/src/App.test.js @@ -1,7 +1,7 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; +import { render, screen } from "@testing-library/react"; +import App from "./App"; -test('renders learn react link', () => { +test("renders learn react link", () => { render(); const linkElement = screen.getByText(/learn react/i); expect(linkElement).toBeInTheDocument(); diff --git a/project-example/week-9/eventonica/eventonica-sample-code/client/src/components/UserForm.jsx b/project-example/week-9/eventonica/eventonica-sample-code/client/src/components/UserForm.jsx index 92ceb5a37..c23b99a08 100644 --- a/project-example/week-9/eventonica/eventonica-sample-code/client/src/components/UserForm.jsx +++ b/project-example/week-9/eventonica/eventonica-sample-code/client/src/components/UserForm.jsx @@ -11,7 +11,7 @@ function UserForm({ handleSubmit, values, buttonText }) { const value = e.target.value; setInputValues({ ...inputValues, - [e.target.name]: value, + [e.target.name]: value }); } return ( diff --git a/project-example/week-9/eventonica/eventonica-sample-code/client/src/reportWebVitals.js b/project-example/week-9/eventonica/eventonica-sample-code/client/src/reportWebVitals.js index 5253d3ad9..9ecd33f9c 100644 --- a/project-example/week-9/eventonica/eventonica-sample-code/client/src/reportWebVitals.js +++ b/project-example/week-9/eventonica/eventonica-sample-code/client/src/reportWebVitals.js @@ -1,6 +1,6 @@ -const reportWebVitals = onPerfEntry => { +const reportWebVitals = (onPerfEntry) => { if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { getCLS(onPerfEntry); getFID(onPerfEntry); getFCP(onPerfEntry); diff --git a/project-example/week-9/eventonica/eventonica-sample-code/client/src/setupTests.js b/project-example/week-9/eventonica/eventonica-sample-code/client/src/setupTests.js index 8f2609b7b..1dd407a63 100644 --- a/project-example/week-9/eventonica/eventonica-sample-code/client/src/setupTests.js +++ b/project-example/week-9/eventonica/eventonica-sample-code/client/src/setupTests.js @@ -2,4 +2,4 @@ // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; +import "@testing-library/jest-dom"; diff --git a/project-example/week-9/eventonica/eventonica-sample-code/server/db/db-connection.js b/project-example/week-9/eventonica/eventonica-sample-code/server/db/db-connection.js index 88be73cac..e5983230b 100644 --- a/project-example/week-9/eventonica/eventonica-sample-code/server/db/db-connection.js +++ b/project-example/week-9/eventonica/eventonica-sample-code/server/db/db-connection.js @@ -1,7 +1,7 @@ import pg from "pg"; const { Pool } = pg; const db = new Pool({ - connectionString: "postgres://localhost:5432/eventonica", + connectionString: "postgres://localhost:5432/eventonica" }); export default db; diff --git a/project-example/week-9/eventonica/eventonica-sample-code/server/index.js b/project-example/week-9/eventonica/eventonica-sample-code/server/index.js index 2d230f45d..a5a82c364 100644 --- a/project-example/week-9/eventonica/eventonica-sample-code/server/index.js +++ b/project-example/week-9/eventonica/eventonica-sample-code/server/index.js @@ -27,7 +27,7 @@ app.get("/api/users", async (req, res) => { app.post("/api/users", async (req, res) => { const user = { name: req.body.name, - email: req.body.email, + email: req.body.email }; console.log(user); try { @@ -47,7 +47,7 @@ app.put("/api/users/:id", async (req, res) => { const user = { name: req.body.name, - email: req.body.email, + email: req.body.email }; const query = `UPDATE users SET name = $1, email = $2 WHERE id = ${userId} RETURNING *`; diff --git a/project-example/week-9/eventonica/eventonica-test-frontend.md b/project-example/week-9/eventonica/eventonica-test-frontend.md index 297f2f4a3..def7d7d88 100644 --- a/project-example/week-9/eventonica/eventonica-test-frontend.md +++ b/project-example/week-9/eventonica/eventonica-test-frontend.md @@ -13,7 +13,7 @@ Don't worry about testing React components, you'll do that in the RTL lesson. Wi ### Instructions for adding tests -1. Create a test folder, and start with a new file for Events. The [curriculum outline about Jest](https://github.com/Techtonica/curriculum/blob/main/testing-and-tdd/jest.md) can remind you how to structure this. +1. Create a test folder, and start with a new file for Events. The [curriculum outline about Jest](https://github.com/Techtonica/curriculum/blob/main/testing-and-tdd/jest.md) can remind you how to structure this. 2. In your project root, run `jest` (it will start your tests). 3. A lot of them will fail or not be found, and your challenge is to fix them. Debug why the tests are failing and update the Jest code and/or your classes to make the tests pass. Every time you make a fix, run `jest` again to check your tests. This might take a while but is good practice for debugging both your tests and your code. 4. When you get the existing tests working, add tests for other functions you have implemented. diff --git a/project-example/week-9/eventonica/eventonica-test-rtl.md b/project-example/week-9/eventonica/eventonica-test-rtl.md index 18b99506b..62aa16d33 100644 --- a/project-example/week-9/eventonica/eventonica-test-rtl.md +++ b/project-example/week-9/eventonica/eventonica-test-rtl.md @@ -12,6 +12,6 @@ Now that you've written Jest tests to cover your frontend logic, you'll write Re ### Instructions for adding tests -1. Take a look at the React components that make up the Events section of your page. Write down 6 things from this section that a user should expect to see, or how they can expect something to behave. -2. Your challenge is to write an RTL test for each of these listed items. +1. Take a look at the React components that make up the Events section of your page. Write down 6 things from this section that a user should expect to see, or how they can expect something to behave. +2. Your challenge is to write an RTL test for each of these listed items. 3. Write at least one Jest snapshot test that tests a component in this section. diff --git a/project-example/week-9/eventonica/starter-code/events.js b/project-example/week-9/eventonica/starter-code/events.js index fd470489a..a9ef979a2 100644 --- a/project-example/week-9/eventonica/starter-code/events.js +++ b/project-example/week-9/eventonica/starter-code/events.js @@ -1,23 +1,30 @@ const allEvents = []; -const addEvent = (/* arguments you decide go here */) => { +const addEvent = (/* arguments you decide go here */) => { // Adds a new Event -} +}; const updateEvent = () => { // Update existing Event -} +}; const deleteEvent = () => { // Deletes Event -} +}; const findEventsByDate = () => { // Return Event object instances in this.allEvents with a specified date -} +}; const findEventsbyCategory = () => { // Return Event object instances in this.allEvents with a specified category -} +}; -export {allEvents, addEvent, updateEvent, deleteEvent, findEventsByDate, findEventsbyCategory}; +export { + allEvents, + addEvent, + updateEvent, + deleteEvent, + findEventsByDate, + findEventsbyCategory +}; diff --git a/project-example/week-9/eventonica/starter-code/mockEvents.js b/project-example/week-9/eventonica/starter-code/mockEvents.js index 648da7b7f..27f87eead 100644 --- a/project-example/week-9/eventonica/starter-code/mockEvents.js +++ b/project-example/week-9/eventonica/starter-code/mockEvents.js @@ -1,25 +1,25 @@ // some sample events // feel free to edit the data, and/or edit the fields const event1 = { - id: "1", - name: "Birthday", - date: "2021-09-01", - description: "A birthday party for my best friend", - category: "Celebration", - }; - - const event2 = { - id: "2", - name: "Graduation", - date: "2021-08-01", - description: "The class of 2021 graduates from East High", - category: "Education", - }; - - const event3 = { - id: "3", - name: "JS Study Session", - date: "2021-10-01", - description: "A chance to practice Javascript interview questions", - category: "Education", - }; \ No newline at end of file + id: "1", + name: "Birthday", + date: "2021-09-01", + description: "A birthday party for my best friend", + category: "Celebration" +}; + +const event2 = { + id: "2", + name: "Graduation", + date: "2021-08-01", + description: "The class of 2021 graduates from East High", + category: "Education" +}; + +const event3 = { + id: "3", + name: "JS Study Session", + date: "2021-10-01", + description: "A chance to practice Javascript interview questions", + category: "Education" +}; diff --git a/project-example/week-9/eventonica/starter-code/users.js b/project-example/week-9/eventonica/starter-code/users.js index d1bd47090..a29def120 100644 --- a/project-example/week-9/eventonica/starter-code/users.js +++ b/project-example/week-9/eventonica/starter-code/users.js @@ -2,14 +2,14 @@ const allUsers = []; const addUser = () => { // Adds a new User -} +}; const updateUser = () => { // Update existing User -} +}; const deleteUser = () => { // Deletes User -} +}; -export {allUsers, addUser, updateUser, deleteUser} +export { allUsers, addUser, updateUser, deleteUser }; diff --git a/projects/2023TemplateWithVite/README.md b/projects/2023TemplateWithVite/README.md index a45cb71a0..3483497c8 100644 --- a/projects/2023TemplateWithVite/README.md +++ b/projects/2023TemplateWithVite/README.md @@ -1,15 +1,16 @@ # Your First Express and React App with Vite - ⚡ Create a working full stack app with React and Express in minutes by running your client using Vite, your server using Express, and dumping your db in the template ⚡ -## Step by Step instructions - To use this project as your starting point 🚀 -### To create the whole project +⚡ Create a working full stack app with React and Express in minutes by running your client using Vite, your server using Express, and dumping your db in the template ⚡ + +## Step by Step instructions - To use this project as your starting point 🚀 +### To create the whole project 1. Go to your project directory in your terminal and run the command `git clone https://github.com/Yosolita1978/Template2023React-Vite.git NAMENEWDIRECTORY` 2. To remove the source code git out of the project directory, run the command `rm -rf .git` -3. Then while still within the project directory in your terminal, run the command `git init` to start your own git track +3. Then while still within the project directory in your terminal, run the command `git init` to start your own git track ![You will something like this in your terminal](https://user-images.githubusercontent.com/102179075/227304861-7ad633d7-5ec0-463a-8554-9e8b4c8caaad.png?raw=true) @@ -19,21 +20,24 @@ ⚠️ All these instructions should be inside your server folder ⚠️ -6. There are two ways to restore the DB dump file the project already contains: +6. There are two ways to restore the DB dump file the project already contains: -A- If you have postgres set up postgres with an User: - * just run the command `psql -U postgres techtonica -f db.sql`. Make sure that you have your Postgres password on hand. The psql console will ask for your password. +A- If you have postgres set up postgres with an User: + +- just run the command `psql -U postgres techtonica -f db.sql`. Make sure that you have your Postgres password on hand. The psql console will ask for your password. B- If your initial configuration of postgres doesn't require a User: -* just run the command `psql techtonica -f db.sql` -7. Inside your server folder, open the file `.env.example` and copy the correct option for your configuation found there to your new .env file. +- just run the command `psql techtonica -f db.sql` + +7. Inside your server folder, open the file `.env.example` and copy the correct option for your configuation found there to your new .env file. Here is what your `.env` might look like: ``` DATABASE_URI="postgresql://localhost/techtonica" -``` +``` + For this template, the name of your db should be `techtonica`. ⚠️ If you don't see a `techtonica` db, you can create one. From the terminal, navigate to the psql command line with `psql` and type `create database techtonica;` - don't forget the semicolon!! ⚠️ @@ -48,20 +52,19 @@ For this template, the name of your db should be `techtonica`. 9. If you want to run both servers using concurrently (which is already a npm dependency on the server) you can keep the script in the package.json in the server that reads `"dev": " concurrently 'npm start' 'cd .. && cd client && npm run dev' "`. If you run the command `npm run dev` from within your server, both the client and backend servers will start. -10. Go to localhost:5173 and you should see something like this 💪 +10. Go to localhost:5173 and you should see something like this 💪 ![You will something like this in your terminal.](https://raw.githubusercontent.com/Yosolita1978/screenshoots/2f6afdd2318809714071b7625776c195903758ca/2023/H1/Screen%20Shot%202023-03-22%20at%2010.40.36%20PM.png) -⚡ **Notes** ⚡ -* React requires **Node >= 14.0.0** & **npm >= 5.6** -* This template is using icons from `react-icons/io5` and `react-bootstrap` in the frontend. You can see all the frontend dependencies in the package.json on the `client` folder -* Please note that your backend server will run from `port 8080`, and your frontend React server will run from `port 5173` (the default Vite port). +⚡ **Notes** ⚡ -* Confused about why use Vite? 🤔 → Check out the [Create a new React app with Vite](https://scrimba.com/articles/create-react-app-with-vite/) +- React requires **Node >= 14.0.0** & **npm >= 5.6** +- This template is using icons from `react-icons/io5` and `react-bootstrap` in the frontend. You can see all the frontend dependencies in the package.json on the `client` folder +- Please note that your backend server will run from `port 8080`, and your frontend React server will run from `port 5173` (the default Vite port). -⚙️ Links that you could need: - -* The instructions for [pg](https://node-postgres.com/apis/pool) -* Setup [postgres correctly](https://github.com/Techtonica/curriculum/blob/main/databases/installing-postgresql.md) +- Confused about why use Vite? 🤔 → Check out the [Create a new React app with Vite](https://scrimba.com/articles/create-react-app-with-vite/) +⚙️ Links that you could need: +- The instructions for [pg](https://node-postgres.com/apis/pool) +- Setup [postgres correctly](https://github.com/Techtonica/curriculum/blob/main/databases/installing-postgresql.md) diff --git a/projects/2023TemplateWithVite/client/src/App.css b/projects/2023TemplateWithVite/client/src/App.css index 65e63208d..91fecbfc0 100644 --- a/projects/2023TemplateWithVite/client/src/App.css +++ b/projects/2023TemplateWithVite/client/src/App.css @@ -22,14 +22,13 @@ a.navbar-brand { .list-students { text-align: center; margin-top: 25px; - flex: 1 + flex: 1; } ul { list-style-type: none; } - form { flex-direction: column; align-items: center; @@ -38,13 +37,13 @@ form { flex: 1; } -input[type=text] { +input[type="text"] { display: inline-block; margin-top: -10px; width: 100%; font-size: 15px; border-radius: 2px; - border: 3px solid #98d0f1 + border: 3px solid #98d0f1; } button.btn.btn-primary { diff --git a/projects/2023TemplateWithVite/client/src/App.jsx b/projects/2023TemplateWithVite/client/src/App.jsx index 4d2d3275f..49abb9b7d 100644 --- a/projects/2023TemplateWithVite/client/src/App.jsx +++ b/projects/2023TemplateWithVite/client/src/App.jsx @@ -1,18 +1,15 @@ -import './App.css' -import 'bootstrap/dist/css/bootstrap.min.css'; -import MyNavBar from './components/Navbar' -import ListStudents from './components/ListStudents' - +import "./App.css"; +import "bootstrap/dist/css/bootstrap.min.css"; +import MyNavBar from "./components/Navbar"; +import ListStudents from "./components/ListStudents"; function App() { - return (
-
- ) + ); } -export default App +export default App; diff --git a/projects/2023TemplateWithVite/client/src/components/Form.jsx b/projects/2023TemplateWithVite/client/src/components/Form.jsx index 08279e19d..98cdb1b61 100644 --- a/projects/2023TemplateWithVite/client/src/components/Form.jsx +++ b/projects/2023TemplateWithVite/client/src/components/Form.jsx @@ -1,122 +1,126 @@ -import React, { useState, useEffect } from 'react' -import { Button, Form } from "react-bootstrap" +import React, { useState, useEffect } from "react"; +import { Button, Form } from "react-bootstrap"; const MyForm = ({ onSaveStudent, editingStudent, onUpdateStudent }) => { + // This is the original State with not initial student + const [student, setStudent] = useState( + editingStudent || { + firstname: "", + lastname: "", + is_current: false + } + ); - // This is the original State with not initial student - const [student, setStudent] = useState(editingStudent || { - firstname: "", - lastname: "", - is_current: false - }); - - //create functions that handle the event of the user typing into the form - const handleNameChange = (event) => { - const firstname = event.target.value; - setStudent((student) => ({ ...student, firstname })); - - }; + //create functions that handle the event of the user typing into the form + const handleNameChange = (event) => { + const firstname = event.target.value; + setStudent((student) => ({ ...student, firstname })); + }; - const handleLastnameChange = (event) => { - const lastname = event.target.value; - setStudent((student) => ({ ...student, lastname })); - }; + const handleLastnameChange = (event) => { + const lastname = event.target.value; + setStudent((student) => ({ ...student, lastname })); + }; - const handleCheckChange = (event) => { - const is_current = event.target.checked; - //console.log(iscurrent); - setStudent((student) => ({ ...student, is_current })); - }; + const handleCheckChange = (event) => { + const is_current = event.target.checked; + //console.log(iscurrent); + setStudent((student) => ({ ...student, is_current })); + }; - const clearForm = () => { - setStudent({ firstname: "", lastname: "", is_current: false }) - } + const clearForm = () => { + setStudent({ firstname: "", lastname: "", is_current: false }); + }; - //A function to handle the post request - const postStudent = (newStudent) => { - return fetch("http://localhost:8080/api/students", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(newStudent), - }) - .then((response) => { - return response.json(); - }) - .then((data) => { - //console.log("From the post ", data); - //I'm sending data to the List of Students (the parent) for updating the list - onSaveStudent(data); - //this line just for cleaning the form - clearForm(); - }); - }; + //A function to handle the post request + const postStudent = (newStudent) => { + return fetch("http://localhost:8080/api/students", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(newStudent) + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + //console.log("From the post ", data); + //I'm sending data to the List of Students (the parent) for updating the list + onSaveStudent(data); + //this line just for cleaning the form + clearForm(); + }); + }; - //A function to handle the post request - const putStudent = (toEditStudent) => { - return fetch(`http://localhost:8080/api/students/${toEditStudent.id}`, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(toEditStudent), - }) - .then((response) => { - return response.json(); - }) - .then((data) => { - onUpdateStudent(data); - //this line just for cleaning the form - clearForm(); - }); - }; + //A function to handle the post request + const putStudent = (toEditStudent) => { + return fetch(`http://localhost:8080/api/students/${toEditStudent.id}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(toEditStudent) + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + onUpdateStudent(data); + //this line just for cleaning the form + clearForm(); + }); + }; + //A function to handle the submit in both cases - Post and Put request! + const handleSubmit = (e) => { + e.preventDefault(); + if (student.id) { + putStudent(student); + } else { + postStudent(student); + } + }; - //A function to handle the submit in both cases - Post and Put request! - const handleSubmit = (e) => { - e.preventDefault(); - if (student.id) { - putStudent(student); - } else { - postStudent(student); - } - }; - - return ( -
- - First Name - - - - Last Name - - - - - - {student.id ? : null} - - - ); + return ( +
+ + First Name + + + + Last Name + + + + + + {student.id ? ( + + ) : null} + + + ); }; - -export default MyForm \ No newline at end of file +export default MyForm; diff --git a/projects/2023TemplateWithVite/client/src/components/ListStudents.jsx b/projects/2023TemplateWithVite/client/src/components/ListStudents.jsx index 82f99f0a8..9bdd14369 100644 --- a/projects/2023TemplateWithVite/client/src/components/ListStudents.jsx +++ b/projects/2023TemplateWithVite/client/src/components/ListStudents.jsx @@ -1,78 +1,86 @@ -import React, { useState, useEffect } from 'react' -import * as ioicons from 'react-icons/io5' -import MyForm from './Form'; -import Student from './Student'; +import React, { useState, useEffect } from "react"; +import * as ioicons from "react-icons/io5"; +import MyForm from "./Form"; +import Student from "./Student"; const ListStudents = () => { - - // this is my original state with an array of students - const [students, setStudents] = useState([]); - - //this is the state needed for the UpdateRequest - const [editingStudent, setEditingStudent] = useState(null) - - const loadStudents = () => { - // A function to fetch the list of students that will be load anytime that list change - fetch("http://localhost:8080/api/students") - .then((response) => response.json()) - .then((students) => { - setStudents(students); - }); - } - - useEffect(() => { - loadStudents(); - }, [students]); - - const onSaveStudent = (newStudent) => { - //console.log(newStudent, "From the parent - List of Students"); - setStudents((students) => [...students, newStudent]); - } - - - //A function to control the update in the parent (student component) - const updateStudent = (savedStudent) => { - // console.log("Line 29 savedStudent", savedStudent); - // This function should update the whole list of students - + // this is my original state with an array of students + const [students, setStudents] = useState([]); + + //this is the state needed for the UpdateRequest + const [editingStudent, setEditingStudent] = useState(null); + + const loadStudents = () => { + // A function to fetch the list of students that will be load anytime that list change + fetch("http://localhost:8080/api/students") + .then((response) => response.json()) + .then((students) => { + setStudents(students); + }); + }; + + useEffect(() => { + loadStudents(); + }, [students]); + + const onSaveStudent = (newStudent) => { + //console.log(newStudent, "From the parent - List of Students"); + setStudents((students) => [...students, newStudent]); + }; + + //A function to control the update in the parent (student component) + const updateStudent = (savedStudent) => { + // console.log("Line 29 savedStudent", savedStudent); + // This function should update the whole list of students - + loadStudents(); + }; + + //A function to handle the Delete funtionality + const onDelete = (student) => { + //console.log(student, "delete method") + return fetch(`http://localhost:8080/api/students/${student.id}`, { + method: "DELETE" + }).then((response) => { + //console.log(response); + if (response.ok) { loadStudents(); - } - - //A function to handle the Delete funtionality - const onDelete = (student) => { - //console.log(student, "delete method") - return fetch(`http://localhost:8080/api/students/${student.id}`, { - method: "DELETE" - }).then((response) => { - //console.log(response); - if (response.ok) { - loadStudents(); - } - }) - } - - //A function to handle the Update functionality - const onUpdate = (toUpdateStudent) => { - //console.log(toUpdateStudent); - setEditingStudent(toUpdateStudent); - - } - - - - return ( -
-
-

Techtonica Participants

-
    - {students.map((student) => { - return
  • - })} -
-
- -
- ); -} - - -export default ListStudents \ No newline at end of file + } + }); + }; + + //A function to handle the Update functionality + const onUpdate = (toUpdateStudent) => { + //console.log(toUpdateStudent); + setEditingStudent(toUpdateStudent); + }; + + return ( +
+
+

Techtonica Participants

+
    + {students.map((student) => { + return ( +
  • + {" "} + +
  • + ); + })} +
+
+ +
+ ); +}; + +export default ListStudents; diff --git a/projects/2023TemplateWithVite/client/src/components/Navbar.jsx b/projects/2023TemplateWithVite/client/src/components/Navbar.jsx index fa3347d94..87a4e972e 100644 --- a/projects/2023TemplateWithVite/client/src/components/Navbar.jsx +++ b/projects/2023TemplateWithVite/client/src/components/Navbar.jsx @@ -1,34 +1,32 @@ -import Container from 'react-bootstrap/Container'; -import Navbar from 'react-bootstrap/Navbar'; -import Nav from 'react-bootstrap/Nav'; -import Logo from '../assets/BlueTechtonicaWord.png' - +import Container from "react-bootstrap/Container"; +import Navbar from "react-bootstrap/Navbar"; +import Nav from "react-bootstrap/Nav"; +import Logo from "../assets/BlueTechtonicaWord.png"; function MyNavBar(props) { - return ( <> - - - - + + + React Bootstrap logo - - Your Link - - - - Signed in as: Cristina Rodriguez - - - - + + Your Link + + + + Signed in as: Cristina Rodriguez + + + + ); -}; +} -export default MyNavBar; \ No newline at end of file +export default MyNavBar; diff --git a/projects/2023TemplateWithVite/client/src/components/Student.jsx b/projects/2023TemplateWithVite/client/src/components/Student.jsx index 39ff3b128..96d3b4752 100644 --- a/projects/2023TemplateWithVite/client/src/components/Student.jsx +++ b/projects/2023TemplateWithVite/client/src/components/Student.jsx @@ -1,28 +1,45 @@ -import React from 'react'; -import Card from 'react-bootstrap/Card'; -import Button from 'react-bootstrap/Button'; -import * as ioicons from 'react-icons/io5' +import React from "react"; +import Card from "react-bootstrap/Card"; +import Button from "react-bootstrap/Button"; +import * as ioicons from "react-icons/io5"; -const Student = ({student, toUpdate, toDelete}) => { +const Student = ({ student, toUpdate, toDelete }) => { + const onUpdate = (toUpdateStudent) => { + toUpdate(toUpdateStudent); + }; - const onUpdate = (toUpdateStudent) => { - toUpdate(toUpdateStudent) - } + const onDelete = (toDeleteStudent) => { + toDelete(toDeleteStudent); + }; - const onDelete = (toDeleteStudent) => { - toDelete(toDeleteStudent) - } + return ( + + + + {student.firstname} {student.lastname} + + + + + + ); +}; - return ( - - - {student.firstname} {student.lastname} - - - - - ) - -} - -export default Student; \ No newline at end of file +export default Student; diff --git a/projects/2023TemplateWithVite/client/src/main.jsx b/projects/2023TemplateWithVite/client/src/main.jsx index 5cc599199..f18b0f0d1 100644 --- a/projects/2023TemplateWithVite/client/src/main.jsx +++ b/projects/2023TemplateWithVite/client/src/main.jsx @@ -1,10 +1,10 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' -import './index.css' +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; +import "./index.css"; -ReactDOM.createRoot(document.getElementById('root')).render( +ReactDOM.createRoot(document.getElementById("root")).render( - , -) + +); diff --git a/projects/2023TemplateWithVite/client/vite.config.js b/projects/2023TemplateWithVite/client/vite.config.js index 5a33944a9..0a265f450 100644 --- a/projects/2023TemplateWithVite/client/vite.config.js +++ b/projects/2023TemplateWithVite/client/vite.config.js @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], -}) + plugins: [react()] +}); diff --git a/projects/2023TemplateWithVite/server/db/db-connection.js b/projects/2023TemplateWithVite/server/db/db-connection.js index 3a619bb49..5cfdb8dcf 100644 --- a/projects/2023TemplateWithVite/server/db/db-connection.js +++ b/projects/2023TemplateWithVite/server/db/db-connection.js @@ -1,6 +1,6 @@ -const { Pool } = require('pg'); +const { Pool } = require("pg"); const db = new Pool({ - connectionString: process.env.DATABASE_URI - }); + connectionString: process.env.DATABASE_URI +}); - module.exports = db; \ No newline at end of file +module.exports = db; diff --git a/projects/2023TemplateWithVite/server/server.js b/projects/2023TemplateWithVite/server/server.js index 69a0b69d1..1f9170e45 100644 --- a/projects/2023TemplateWithVite/server/server.js +++ b/projects/2023TemplateWithVite/server/server.js @@ -1,9 +1,8 @@ -const express = require('express'); -const cors = require('cors'); -require('dotenv').config(); -const path = require('path'); -const db = require('./db/db-connection.js'); - +const express = require("express"); +const cors = require("cors"); +require("dotenv").config(); +const path = require("path"); +const db = require("./db/db-connection.js"); const app = express(); const PORT = process.env.PORT || 8080; @@ -11,80 +10,88 @@ app.use(cors()); app.use(express.json()); // creates an endpoint for the route "/"" -app.get('/', (req, res) => { - res.json({ message: 'Hola, from My template ExpressJS with React-Vite' }); +app.get("/", (req, res) => { + res.json({ message: "Hola, from My template ExpressJS with React-Vite" }); }); // create the get request for students in the endpoint '/api/students' -app.get('/api/students', async (req, res) => { - try { - const { rows: students } = await db.query('SELECT * FROM students'); - res.send(students); - } catch (e) { - return res.status(400).json({ e }); - } +app.get("/api/students", async (req, res) => { + try { + const { rows: students } = await db.query("SELECT * FROM students"); + res.send(students); + } catch (e) { + return res.status(400).json({ e }); + } }); // create the POST request -app.post('/api/students', async (req, res) => { - try { - const newStudent = { - firstname: req.body.firstname, - lastname: req.body.lastname, - iscurrent: req.body.iscurrent - }; - //console.log([newStudent.firstname, newStudent.lastname, newStudent.iscurrent]); - const result = await db.query( - 'INSERT INTO students(firstname, lastname, is_current) VALUES($1, $2, $3) RETURNING *', - [newStudent.firstname, newStudent.lastname, newStudent.iscurrent], - ); - console.log(result.rows[0]); - res.json(result.rows[0]); - - } catch (e) { - console.log(e); - return res.status(400).json({ e }); - } - +app.post("/api/students", async (req, res) => { + try { + const newStudent = { + firstname: req.body.firstname, + lastname: req.body.lastname, + iscurrent: req.body.iscurrent + }; + //console.log([newStudent.firstname, newStudent.lastname, newStudent.iscurrent]); + const result = await db.query( + "INSERT INTO students(firstname, lastname, is_current) VALUES($1, $2, $3) RETURNING *", + [newStudent.firstname, newStudent.lastname, newStudent.iscurrent] + ); + console.log(result.rows[0]); + res.json(result.rows[0]); + } catch (e) { + console.log(e); + return res.status(400).json({ e }); + } }); // delete request for students -app.delete('/api/students/:studentId', async (req, res) => { - try { - const studentId = req.params.studentId; - await db.query('DELETE FROM students WHERE id=$1', [studentId]); - console.log("From the delete request-url", studentId); - res.status(200).end(); - } catch (e) { - console.log(e); - return res.status(400).json({ e }); - - } +app.delete("/api/students/:studentId", async (req, res) => { + try { + const studentId = req.params.studentId; + await db.query("DELETE FROM students WHERE id=$1", [studentId]); + console.log("From the delete request-url", studentId); + res.status(200).end(); + } catch (e) { + console.log(e); + return res.status(400).json({ e }); + } }); -//A put request - Update a student -app.put('/api/students/:studentId', async (req, res) =>{ - //console.log(req.params); - //This will be the id that I want to find in the DB - the student to be updated - const studentId = req.params.studentId - const updatedStudent = { id: req.body.id, firstname: req.body.firstname, lastname: req.body.lastname, iscurrent: req.body.is_current} - console.log("In the server from the url - the student id", studentId); - console.log("In the server, from the react - the student to be edited", updatedStudent); - // UPDATE students SET lastname = "something" WHERE id="16"; - const query = `UPDATE students SET firstname=$1, lastname=$2, is_current=$3 WHERE id=${studentId} RETURNING *`; - const values = [updatedStudent.firstname, updatedStudent.lastname, updatedStudent.iscurrent]; - try { - const updated = await db.query(query, values); - console.log(updated.rows[0]); - res.send(updated.rows[0]); - - }catch(e){ - console.log(e); - return res.status(400).json({e}) - } - }) +//A put request - Update a student +app.put("/api/students/:studentId", async (req, res) => { + //console.log(req.params); + //This will be the id that I want to find in the DB - the student to be updated + const studentId = req.params.studentId; + const updatedStudent = { + id: req.body.id, + firstname: req.body.firstname, + lastname: req.body.lastname, + iscurrent: req.body.is_current + }; + console.log("In the server from the url - the student id", studentId); + console.log( + "In the server, from the react - the student to be edited", + updatedStudent + ); + // UPDATE students SET lastname = "something" WHERE id="16"; + const query = `UPDATE students SET firstname=$1, lastname=$2, is_current=$3 WHERE id=${studentId} RETURNING *`; + const values = [ + updatedStudent.firstname, + updatedStudent.lastname, + updatedStudent.iscurrent + ]; + try { + const updated = await db.query(query, values); + console.log(updated.rows[0]); + res.send(updated.rows[0]); + } catch (e) { + console.log(e); + return res.status(400).json({ e }); + } +}); // console.log that your server is up and running app.listen(PORT, () => { - console.log(`Hola, Server listening on ${PORT}`); -}); \ No newline at end of file + console.log(`Hola, Server listening on ${PORT}`); +}); diff --git a/projects/db-modeling-assignment.md b/projects/db-modeling-assignment.md index 5c3d3e31b..31a0bb095 100644 --- a/projects/db-modeling-assignment.md +++ b/projects/db-modeling-assignment.md @@ -36,7 +36,6 @@ After designing and creating your tables above, include SQL for the following qu 1. Select the image URLs of all Photos that a specific User ID hearted 1. Select all the usernames who Hearted a given photo (given the photo's primary key) - ## Bonus Queries 1. Find the user with the most Hearts across all their photos diff --git a/projects/eventonica-legacy/README.md b/projects/eventonica-legacy/README.md index 0b3c2d334..c33560392 100644 --- a/projects/eventonica-legacy/README.md +++ b/projects/eventonica-legacy/README.md @@ -2,7 +2,7 @@ Welcome to the Eventonica project! -> Note: as of Summer 2021, we will be jumping straight into [eventonica-react](../eventonica-react/README.md). Please go to there unless you know you want to follow these Vanilla JS Eventonica outlines instead. +> Note: as of Summer 2021, we will be jumping straight into [eventonica-react](../eventonica-react/README.md). Please go to there unless you know you want to follow these Vanilla JS Eventonica outlines instead. In this project, you'll make a web app to manage events. diff --git a/projects/full-stack-checklist.md b/projects/full-stack-checklist.md index 9934c4e25..e174a2e02 100644 --- a/projects/full-stack-checklist.md +++ b/projects/full-stack-checklist.md @@ -14,52 +14,54 @@ This checklist covers how to create a full-stack app with a React frontend, Node 1. Create a `.env` file in the root directory of your project. In the file, add the following variables: - ``` - POSTGRES_DB=name_of_your_database - POSTGRES_PASSWORD=example_password - ``` - -1. Create a folder named `db` and put a file named `seed_data.sql` file in the folder. In this file, you can define your database tables and insert any initial data. - - ``` - # example seed - - # this will reset the table if you want to re-seed the database - DROP TABLE IF EXISTS users; - - # create table - be sure to include any non-null constraints and primary/foreign keys - - CREATE TABLE users ( - id serial primary key, - first_name text not null - ); - - # optional initial data load - INSERT INTO users (id, first_name) VALUES - (1, 'Hermoine'), - (2, 'Harry'), - (3, 'Ron') - ; - - ``` - -1. (If using Docker) Create a `docker-compose.yaml` file in the root directory of your project and specify the Postgres service. Then run `docker-compose up -d`. - ``` - version: '3.8' - - services: - postgres: - image: postgres - restart: always - env_file: - - .env - ports: - - 5432:5432 - volumes: - - ./data/seed_data.sql:/docker-entrypoint-initdb.d/seed_data.sql - - ``` - This creates a Postgres database in a container with the database name and password from your `.env` file. It runs the seed script on start up. You can see a full explanation of configurations [here](https://hub.docker.com/_/postgres). If you already have a Postgres database running on port 5432, replace the `ports` value with `- {OTHER_PORT}:5432` and be sure to use the new port value in the steps below. + ``` + POSTGRES_DB=name_of_your_database + POSTGRES_PASSWORD=example_password + ``` + +1. Create a folder named `db` and put a file named `seed_data.sql` file in the folder. In this file, you can define your database tables and insert any initial data. + + ``` + # example seed + + # this will reset the table if you want to re-seed the database + DROP TABLE IF EXISTS users; + + # create table - be sure to include any non-null constraints and primary/foreign keys + + CREATE TABLE users ( + id serial primary key, + first_name text not null + ); + + # optional initial data load + INSERT INTO users (id, first_name) VALUES + (1, 'Hermoine'), + (2, 'Harry'), + (3, 'Ron') + ; + + ``` + +1. (If using Docker) Create a `docker-compose.yaml` file in the root directory of your project and specify the Postgres service. Then run `docker-compose up -d`. + + ``` + version: '3.8' + + services: + postgres: + image: postgres + restart: always + env_file: + - .env + ports: + - 5432:5432 + volumes: + - ./data/seed_data.sql:/docker-entrypoint-initdb.d/seed_data.sql + + ``` + + This creates a Postgres database in a container with the database name and password from your `.env` file. It runs the seed script on start up. You can see a full explanation of configurations [here](https://hub.docker.com/_/postgres). If you already have a Postgres database running on port 5432, replace the `ports` value with `- {OTHER_PORT}:5432` and be sure to use the new port value in the steps below. 1. (If using Postgres locally) Using PGAdmin or `psql`, create a new database for your project with the name and password specified in your `.env` file. @@ -79,23 +81,22 @@ This checklist covers how to create a full-stack app with a React frontend, Node 1. Use the following code to set up your database connection. It can go in the `index.js` file. - ``` - const dotenv = require("dotenv"); - const pgp = require("pg-promise"); + ``` + const dotenv = require("dotenv"); + const pgp = require("pg-promise"); - const connection = { - user: "postgres", - database: process.env.POSTGRES_DB, - password: process.env.POSTGRES_PASSWORD, - port: 5432, - host: "localhost", - }; - const db = pgp(connection)() - ``` + const connection = { + user: "postgres", + database: process.env.POSTGRES_DB, + password: process.env.POSTGRES_PASSWORD, + port: 5432, + host: "localhost", + }; + const db = pgp(connection)() + ``` 1. Update your existing route or create a new one that returns rows from your database. You can find example queries [here](https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example). - ### React Setup 1. In the root directory of your project, run `npx create-react-app app`. This will create an `app` folder with initial React files. diff --git a/projects/js-html-games.md b/projects/js-html-games.md index 5b4cc0191..8c54d633c 100644 --- a/projects/js-html-games.md +++ b/projects/js-html-games.md @@ -2,8 +2,8 @@ Make one or more of 3 games to practice using HTML and JS. They are listed easiest to hardest. Feel free to work on whichever one(s) are a good challenge for you. There's not much instruction -- it's up to you to decide how the site will look and the details of how it works. Be creative! - ### Project Requirements + - Make 1 or more games using JS and HTML - Include a README with a demo, and instructions for how to run the code - Pro-tip: CSS is not a requirement of this project, so it's smart to do the basics and focus on other curriculum unless you have extra time to practice design @@ -11,7 +11,8 @@ Make one or more of 3 games to practice using HTML and JS. They are listed easie ### Extension (not requried) - Use GitHub Pages to serve the games. You can follow [these instructions](https://www.codecademy.com/articles/f1-u3-github-pages) to deploy your code. -- +- + ## Games ### Coin Flip @@ -41,4 +42,3 @@ Optional Extensions: - Add a timer so that each person can only take a certain amount of time for a turn - Advanced: Write a function that can [solve the boggle game](https://www.codewars.com/kata/boggle-solver/javascript) - find all the valid words using a dictionary - diff --git a/projects/mern-pern-project.md b/projects/mern-pern-project.md index 19d9d5807..15ba00b78 100644 --- a/projects/mern-pern-project.md +++ b/projects/mern-pern-project.md @@ -61,7 +61,6 @@ Example features: - Form to add a new sighting record - Form to add new individuals - ### Submission - Include a top-level `README.md` that says how to run your app locally including all steps after cloning the repo diff --git a/projects/portfolio/portfolio-webpage-1.md b/projects/portfolio/portfolio-webpage-1.md index baf039846..6cc4a94da 100644 --- a/projects/portfolio/portfolio-webpage-1.md +++ b/projects/portfolio/portfolio-webpage-1.md @@ -19,28 +19,26 @@ To demonstrate understanding of the foundational topics covered in the first two In this project, you will build a simple portfolio page to practice what you've learned about VSCode, HTML, CSS, Git, and GitHub. In the future, a great portfolio page will be valuable way to showcase your skills as you look for engineering work. - ### Motivation Increase your job prospects dramatically with your own personal web page. Get creative and show off your technical skills. Employers will love you! Here's a list of example portfolios: https://github.com/HackathonHackers/personal-sites - ## Project Requirements: -You should write clear + informative commit messages for each commit and create pull requests once big/multiple changes have been made for your mentor to review and document it in the cohort shared sheet. +You should write clear + informative commit messages for each commit and create pull requests once big/multiple changes have been made for your mentor to review and document it in the cohort shared sheet. -- At least 15 commits +- At least 15 commits - Pro-tip: Get used to committing your code every single time a new line of code works - At least one PR - Consider pushing your code to GitHub every time you finish a bolded section, but at least every day - Use of the command line to create files and implement use of Git - Practice use of developer tools - HTML - - Headers - - Sections - - Semantic Tags - - Contact Form + - Headers + - Sections + - Semantic Tags + - Contact Form - CSS - At least 3 style properties applied to text - Photo @@ -87,7 +85,7 @@ You should write clear + informative commit messages for each commit and create - [ ] Double check that you have proper indentation for readability. - [ ] Use semantic tags rather than presentational tags when possible. - [ ] (Remember to make a git commit after each set of code changes!) -- [ ] (Second half of week) - Add a contact form with the following fields: name (required), email (required), phone number (not required), and address (not required) (Hint: Required fields in a form are those where you normally see a * symbol) +- [ ] (Second half of week) - Add a contact form with the following fields: name (required), email (required), phone number (not required), and address (not required) (Hint: Required fields in a form are those where you normally see a \* symbol) **Developer Tools** @@ -107,7 +105,6 @@ You should write clear + informative commit messages for each commit and create - [ ] Have 2 css blocks that include the class "override" with one overriding the other rule in an obvious way. - [ ] Change the display property of at least one element. - **Media Queries, UI, UX** - [ ] Have at least one style change each for a narrow, medium, and wide browswer window. @@ -130,5 +127,3 @@ You should write clear + informative commit messages for each commit and create - [ ] Make the link to your live github.io site clickable on your README. --- - - diff --git a/projects/portfolio/portfolio-webpage-3.md b/projects/portfolio/portfolio-webpage-3.md index dcb581b0f..69ae19631 100644 --- a/projects/portfolio/portfolio-webpage-3.md +++ b/projects/portfolio/portfolio-webpage-3.md @@ -6,8 +6,7 @@ To demonstrate understanding of the topics covered in week 3 of Techtonica, as w ### Overview -Put the finishing touches on your project by collaborating on documentation, reviewing, refactoring, and re-deploying with a partner. - +Put the finishing touches on your project by collaborating on documentation, reviewing, refactoring, and re-deploying with a partner. ### Languages @@ -47,7 +46,6 @@ For this section you should pair program with a partner the whole time. Complete - [ ] Add useful comments to clarify code. - [ ] Commit your changes, push the branch to GitHub, and make a PR to the main branch. - ### Part 2: Practice Code Review Each partner should go back to their own computer and open their repo on GitHub. diff --git a/projects/react-game.md b/projects/react-game.md index 61e4f30af..2a37beca3 100644 --- a/projects/react-game.md +++ b/projects/react-game.md @@ -6,7 +6,7 @@ You've now learned enough React to create a game! This project is to practice fu ### General guidelines for projects: -You are welcome to rewrite the game you made last week in React or to make a different one. +You are welcome to rewrite the game you made last week in React or to make a different one. Here are some [examples](https://bg.reactjs.org/community/examples.html). **Please do not select hangman because of its racist origins.** @@ -14,7 +14,7 @@ You can start this app in codeSandbox, codePen, replit.com, etc and then this we ### Minimum Requirements -- Write a game of your choosing in React +- Write a game of your choosing in React - Make sure you practice components, props, and state - Have some sort of input that you receive from one component that you pass to another (such as number of tries, hi/low number, etc.) - Have some sort of counter that uses the useState hook to update the score or count to the screen @@ -24,6 +24,3 @@ You can start this app in codeSandbox, codePen, replit.com, etc and then this we #### Extension Activity If you have extra time, consider [hosting your game on GitHub Pages](https://betterprogramming.pub/how-to-host-your-react-app-on-github-pages-for-free-919ad201a4cb). - - - diff --git a/projects/recipe-page/phase-1-html-prompt.md b/projects/recipe-page/phase-1-html-prompt.md index c6e5cf5ad..e37ef83a6 100644 --- a/projects/recipe-page/phase-1-html-prompt.md +++ b/projects/recipe-page/phase-1-html-prompt.md @@ -21,7 +21,7 @@ In this project you will create a well-designed webpage that displays one of you For Week 1 of the program, this project involves coding the structure of your webpage using HTML. This includes the ingredients, the steps needed to make the dish, links to similar recipes, and at least one photo. Then add some styling and pizazz using CSS like changing the font style, font size, colors, and other qualities that interest you. -Then, in Week 2, you'll incorporate 3 or more interactive elements of your choosing by implementing JS DOM methods. +Then, in Week 2, you'll incorporate 3 or more interactive elements of your choosing by implementing JS DOM methods. ### Context diff --git a/projects/recipe-page/phase-2-css-prompt.md b/projects/recipe-page/phase-2-css-prompt.md index 11ae68b57..31f334b44 100644 --- a/projects/recipe-page/phase-2-css-prompt.md +++ b/projects/recipe-page/phase-2-css-prompt.md @@ -26,7 +26,7 @@ Phase 2 of the project involves adding styling and pizazz using CSS. This includ Phase 3 of the project involves incorporating JS DOM methods. You'll add at least three interactive elements of your choosing (next week). -There used to be a "Bootstrap" part of this project, but bootstrap is no longer a part of the Techtonica curriculum. If you'd like to research and incorporate a library to streamline the CSS process, you can do that on your own. +There used to be a "Bootstrap" part of this project, but bootstrap is no longer a part of the Techtonica curriculum. If you'd like to research and incorporate a library to streamline the CSS process, you can do that on your own. ### Context diff --git a/projects/recipe-page/phase-3-bootstrap-prompt.md b/projects/recipe-page/phase-3-bootstrap-prompt.md index 0d24d0d33..17fcee66c 100644 --- a/projects/recipe-page/phase-3-bootstrap-prompt.md +++ b/projects/recipe-page/phase-3-bootstrap-prompt.md @@ -1,4 +1,5 @@ # Project 1 - Recipe Page + NOTE: Bootstrap is a powerful and widely used CSS framework. You are welcome to add it to your recipe page if you like, but it might be confusing. Feel free to use it or not. ### Phase 3 - Incorporate the Bootstrap Framework diff --git a/projects/recipe-page/phase-4-DOM-Manipulation.md b/projects/recipe-page/phase-4-DOM-Manipulation.md index 516249bc6..a5e69ab6d 100644 --- a/projects/recipe-page/phase-4-DOM-Manipulation.md +++ b/projects/recipe-page/phase-4-DOM-Manipulation.md @@ -10,9 +10,9 @@ The DOM (or Document Object Model) is a tree-like representation of the contents - CSS - Javascript -Hello everyone! -We have a big goal for the EOW: we want to incorporate DOM Methods to your recipe page -How excited are you about this? Let's use JS to make your website interactive. +Hello everyone! +We have a big goal for the EOW: we want to incorporate DOM Methods to your recipe page +How excited are you about this? Let's use JS to make your website interactive. ### Primary Goals @@ -24,11 +24,14 @@ How excited are you about this? Let's use JS to make your website interactive. You already have an HTML/CSS/JS project, but now you get surprise your users by adding some JS DOM methodsto make your website interactive! You'll add at least three interactive elements of your choosing. ### Use your creativity! -This is practice, so there's no right or wrong approach. + +This is practice, so there's no right or wrong approach. You can add a strikethrough when someone clicks on an ingredient, add a button that will create a space for notes, have a mouse event that shows hidden content. Let's see some examples of what we can do: #### 1. Adding Content + To add new elements to the page, we’ll need to use a three step process: + ``` // First up, let's create a new list item and store it in a variable. var newListItem = document.createElement('li'); @@ -39,14 +42,18 @@ newListItem.textContent = 'Jalapenos'; // And finally, let's add that list item as a child of the ul. document.querySelector('ul').appendChild(newListItem); ``` + #### 2. Adding a check mark as an element to a list + To add checkbox to the page, we’ll need to use a this process ![Brute Force Approach to adding a checkbox](https://raw.githubusercontent.com/Techtonica/curriculum/af027e9524fff7abab62e65705f8d3427424c7d9/projects/pr-screenshot/pr-dommanipulation1.png) #### 3. Adding a strikethrough when someone clicks an element + The CSS rule to show HTML text as strikethrough is called `text-decoration: line-through`. You can add CSS rules to an element with a Class or ID. Remember that you can add a className to any element using DOM Manipalation with `yourelementname.className = "checked";` ![Brute Force Approach to adding a checkbox](https://raw.githubusercontent.com/Techtonica/curriculum/af027e9524fff7abab62e65705f8d3427424c7d9/projects/pr-screenshot/pr-dommanipulation2.png) #### 4. Adding a strikethrough when someone clicks an element inside a checkbox -You can add the strikethrough line at the user action of clicking a checkbox, like in the example. + +You can add the strikethrough line at the user action of clicking a checkbox, like in the example. ![Brute Force Approach to adding a checkbox](https://raw.githubusercontent.com/Techtonica/curriculum/af027e9524fff7abab62e65705f8d3427424c7d9/projects/pr-screenshot/pr-dommanipulation3.png) diff --git a/projects/rest-api-project.md b/projects/rest-api-project.md index 5ccb9918b..9a730ec1f 100644 --- a/projects/rest-api-project.md +++ b/projects/rest-api-project.md @@ -4,48 +4,55 @@ A RESTful API is an Application Programming Interface (API) that uses HTTP verbs ![Screenshoot](https://raw.githubusercontent.com/Yosolita1978/screenshoots/f2fdebc24a671f11394d8da1a9355a0ed4ce4a29/Week5/Screen%20Shot%202022-08-14%20at%201.58.39%20PM.png) -### Learning Objective: +### Learning Objective: + What you will learn with this project is how to organize the data that comes from your backend using a REST API. At this moment, you don't know how to connect a DB, so for now, we will work with data in a JSON. (see the file [books.js](https://github.com/Yosolita1978/RESTAPI-mybooks/blob/main/restapi/books.js)) Don't be afraid of the terminology. A REST API it's just a way of organizing data according to the CRUD operations ![Screenshoot](https://github.com/Yosolita1978/screenshoots/blob/main/Week5/Screen%20Shot%202022-08-14%20at%201.59.03%20PM.png?raw=true) ## General guidelines for projects: -* In this project, you will build a REST API to manage books with Node.js and Express. -* You will use a simple JSON to store your . If you want to learn a little about how to use hardcode data in a project (follow this document)[https://docs.google.com/document/d/12MFPDYC0LPKpzrYHZVmfs2NeCUfquNpEKCLKtDkcK4E/edit?usp=sharing] -* Remember to start the project by creating your new branch in your assignments repo. By Friday, you should push your commit up to GitHub and have a PR ready to go for your partner. -* This project is focused on the backend. If you don't have anything in the frontend- it's ok. Your frontend could be just the JSON in the file. + +- In this project, you will build a REST API to manage books with Node.js and Express. +- You will use a simple JSON to store your . If you want to learn a little about how to use hardcode data in a project (follow this document)[https://docs.google.com/document/d/12MFPDYC0LPKpzrYHZVmfs2NeCUfquNpEKCLKtDkcK4E/edit?usp=sharing] +- Remember to start the project by creating your new branch in your assignments repo. By Friday, you should push your commit up to GitHub and have a PR ready to go for your partner. +- This project is focused on the backend. If you don't have anything in the frontend- it's ok. Your frontend could be just the JSON in the file. ## Specific guidelines for projects: -* Change the information inside the file books.js to have your data (we suggest books, but if you want to use any other data, it's ok) -* Using Node and Express, create a GET router with a response that converts all using Json() -* Using that endpoint build a list of all your books in the backend(server side). -* Using Node and Express, create a route for each one of the verbs in CRUD operations in the backend. You don't need to have a Frontend. You can test your API using Postman. -* Bonus: Using that endpoint build a list of all your books in the Frontend (client side). Note: you will need to make a GET request to bring all your information to the Frontend too + +- Change the information inside the file books.js to have your data (we suggest books, but if you want to use any other data, it's ok) +- Using Node and Express, create a GET router with a response that converts all using Json() +- Using that endpoint build a list of all your books in the backend(server side). +- Using Node and Express, create a route for each one of the verbs in CRUD operations in the backend. You don't need to have a Frontend. You can test your API using Postman. +- Bonus: Using that endpoint build a list of all your books in the Frontend (client side). Note: you will need to make a GET request to bring all your information to the Frontend too ## Helping Resources: -* You can see how the first task in [Cristina's example](https://github.com/Yosolita1978/RESTAPI-mybooks/tree/main/restapi). This code only does a route for the initial GET for all the books and shows a specific book. It shows in the Frontend, but you don't need to get to that point. You can show your API with only code in the backend -* [Here is a good reading tutorial on how to work a REST API for your books](https://levelup.gitconnected.com/creating-a-rest-api-with-node-js-and-express-a-step-by-step-guide-3bd7188fa219) -* [Here is a good video tutorial on how to work a REST API for users](https://www.youtube.com/watch?v=l8WPWK9mS5M&ab_channel=JavaScriptMastery) + +- You can see how the first task in [Cristina's example](https://github.com/Yosolita1978/RESTAPI-mybooks/tree/main/restapi). This code only does a route for the initial GET for all the books and shows a specific book. It shows in the Frontend, but you don't need to get to that point. You can show your API with only code in the backend +- [Here is a good reading tutorial on how to work a REST API for your books](https://levelup.gitconnected.com/creating-a-rest-api-with-node-js-and-express-a-step-by-step-guide-3bd7188fa219) +- [Here is a good video tutorial on how to work a REST API for users](https://www.youtube.com/watch?v=l8WPWK9mS5M&ab_channel=JavaScriptMastery) ## Frequently Asked Questions + We can add common FAQs here. Open a PR if you have any questions. # Step by Step instructions - Building this from scratch ### For creating the server (using Express) -1. Make a new directory for your project. -2. cd into your new directory + +1. Make a new directory for your project. +2. cd into your new directory 3. create a package.json with the command `npm init y` 4. Make sure that the main file in your package is `index.js` -4. Install all the dependencies with the commands:`npm i express` and `npm i cors` -5. Install the module nodemon in the dev server with the command `npm i nodemon --save-dev` -6. Inside your package.json, change the scripts to: +5. Install all the dependencies with the commands:`npm i express` and `npm i cors` +6. Install the module nodemon in the dev server with the command `npm i nodemon --save-dev` +7. Inside your package.json, change the scripts to: + ``` "start": "node index.js", "server": "nodemon index.js", ``` + (doing this, you will delete the test script) 7. Create your index.js file (you can do that with `touch index.js` or directly on your VSCode) - diff --git a/projects/weather-app.md b/projects/weather-app.md index 032ed4a0b..3f666850f 100644 --- a/projects/weather-app.md +++ b/projects/weather-app.md @@ -1,4 +1,4 @@ -# Week 7 Build a Minimal APP connecting backend and frontend Project +# Week 7 Build a Minimal APP connecting backend and frontend Project ### Frameworks @@ -7,7 +7,7 @@ ### Libraries/Tools -- NodeJS +- NodeJS - Express - Postman - Create-React-APP @@ -21,24 +21,23 @@ This assignment will check for proficiency in: NodeJS, ExpressJS, and how connec ### Overview -In this project, you will build a minimal Weather App connecting your backend and your frontend. +In this project, you will build a minimal Weather App connecting your backend and your frontend. -Win #1 -The weather app should have all the basic functions including: city name, current weather icon, temperature, humidity, wind speed, etc. +Win #1 +The weather app should have all the basic functions including: city name, current weather icon, temperature, humidity, wind speed, etc. Win #2 -It should display the icon images for sunny/rainy/cloudy/snowy weather conditions. +It should display the icon images for sunny/rainy/cloudy/snowy weather conditions. Win #3 It should have a responsive design. ### Context -- After learning Node, Express, and API concepts (Fetch), you will use them to connect with a external API in the Backend. - We recommend that you use OpenWeather API https://openweathermap.org/api +- After learning Node, Express, and API concepts (Fetch), you will use them to connect with a external API in the Backend. - We recommend that you use OpenWeather API https://openweathermap.org/api + - Register for a student open weather map API account. Put Techtonica under institution and if they ask for documentation use your acceptance email. - - Register for a student open weather map API account. Put Techtonica under institution and if they ask for documentation use your acceptance email. - Open Weather Map Student - You'll put N/A for student ID and a year from now for expiration is fine. @@ -46,40 +45,47 @@ It should have a responsive design. - Please note that for this project we using the APi 2.5 that allows you to fetch current weather data using the name of the city. If you want to read the docummentation of the API please follow [this link](https://openweathermap.org/current#name) After submit Open Weather Map Student - -- You will use React to show the results of the API fetch to your frontend +- You will use React to show the results of the API fetch to your frontend + # Project Instructions ## Part 0 - Starter Code + ### For the Backend + - [ ] Create your main directory for this project. Initialize this project folder for git, and get a new remote GitHub repo ready so you can save and push as you make progress on your project. You will be submitting your GitHub repo link once you finish. -- [ ] Inside the main folder of your project create a server folder +- [ ] Inside the main folder of your project create a server folder - [ ] Inside the server folder setup a basic express server ### For the Frontend - + ## Part 0.1 - Working with existing code + - [ ] Here is an app that is fully running using hard-coded data. Start by cloning this and get it running on your computer, make sure to start a new branch for your project [Cristina's example Weather app with hard-coded data](https://github.com/Yosolita1978/HardCodeDataWeatherApi) - + ## Part 1 - Connecting the API in the backend - The example code is getting the weather data from a file - you will be changing the code to get data from the open weather map API + +The example code is getting the weather data from a file - you will be changing the code to get data from the open weather map API + - [ ] Change the Express connection from using a hard coded data file, to connecting to the live API - [ ] Inside the server folder in your server.js file do a fetch request to the Weather API (note start off with the city hardcoded into the URL) -![Code Example](https://raw.githubusercontent.com/Yosolita1978/screenshoots/836e1da625022b836f2aef42b3cace63563782a7/Week7/Screen%20Shot%202022-09-05%20at%206.15.14%20PM.png) + ![Code Example](https://raw.githubusercontent.com/Yosolita1978/screenshoots/836e1da625022b836f2aef42b3cace63563782a7/Week7/Screen%20Shot%202022-09-05%20at%206.15.14%20PM.png) ## Part 2 - Connecting the API in the frontend -When you press the submit button on the form you will get data from the API. Make sure you understand the JSON object and add a few more items to the page (such as wind speed) + +When you press the submit button on the form you will get data from the API. Make sure you understand the JSON object and add a few more items to the page (such as wind speed) + - [ ] Choose at least 3 more pieces of information from the HTTP response to your React front end - [ ] Render the weather information inside a component ## Part 3 - Creating a form to dynamically change the city + - [ ] In the WeatherForm component create a form that will get a city from a user - [ ] Inside the client folder in your script.js file, add the city to the Fetch request (think: how do you get data from a child to a parent?) - [ ] Change the Express route to accept the city parameter and add it dynamically to your URL - - ## Guide code + You can see a guide code from Cristina working with hard-code data [here](https://github.com/Yosolita1978/HardCodeDataWeatherApi) You can see a guide code from Cristina working with real data with a API_KEY[here](https://github.com/Yosolita1978/RealDataWeatherAPI) diff --git a/projects/week-1-worksheet.md b/projects/week-1-worksheet.md index 296530a3e..056582211 100644 --- a/projects/week-1-worksheet.md +++ b/projects/week-1-worksheet.md @@ -2,7 +2,7 @@ ### Prerequisites -Here are links to a lesson that should be completed before this lesson: +Here are links to a lesson that should be completed before this lesson: - [Zsh Profile](https://github.com/Techtonica/curriculum/blob/main/dev-tools/dot-profile.md) @@ -112,13 +112,13 @@ work. ### Notes -- *zsh vs bash*: For a long time bash was the default shell on macs. As of +- _zsh vs bash_: For a long time bash was the default shell on macs. As of MacOS Catalina, Apple [switched their default shell from Bash to -Zsh](https://eshop.macsales.com/blog/56921-moving-from-bash-to-zsh-terminal-changes-in-macos-catalina/). -This means you may see older resources which still refer to the shell in -general as bash even though now on mac you will by default use Zsh. Most of the -time this doesn't make a big difference but sometimes the distinction is -important. For example if you want to set enviornment variables, an alias or a -terminal prompt change for every time you start a new shell, you will need to -do it in the `.zshrc` file not the `.bashrc` file because you are using zsh and -not bash. See the suggested reading for more info. + Zsh](https://eshop.macsales.com/blog/56921-moving-from-bash-to-zsh-terminal-changes-in-macos-catalina/). + This means you may see older resources which still refer to the shell in + general as bash even though now on mac you will by default use Zsh. Most of the + time this doesn't make a big difference but sometimes the distinction is + important. For example if you want to set enviornment variables, an alias or a + terminal prompt change for every time you start a new shell, you will need to + do it in the `.zshrc` file not the `.bashrc` file because you are using zsh and + not bash. See the suggested reading for more info. diff --git a/projects/week8GameREADME.md b/projects/week8GameREADME.md index 62d9eda63..c8e2d6605 100644 --- a/projects/week8GameREADME.md +++ b/projects/week8GameREADME.md @@ -7,7 +7,7 @@ ### Libraries/Tools -- NodeJS +- NodeJS - Express - Postman - Create-React-APP @@ -21,36 +21,45 @@ This assignment will check for proficiency in: NodeJS, ExpressJS, and how to con ### Overview -In this project, you will build a minimal Game connecting your Backend and your frontend. +In this project, you will build a minimal Game connecting your Backend and your frontend. + +##### Pre-Win -##### Pre-Win The game's existing code already grabs the user information and shows the user the questions that exist in the `fakedata.js` file ##### Win # 1 + Grab the real information with the API and show it correctly in the FrontEnd. ##### Win #2 + It should grab how many questions the user has an answer to and how many right/wrong questions. ##### Win #3 + It should show the user a message in case they win/lost the game ### Context -- After learning Node, Express, and API concepts (Fetch), you will use them to connect with an external API in the Backend. - We recommend using the [TRIVIA APP](https://opentdb.com/api_config.php) for this project. +- After learning Node, Express, and API concepts (Fetch), you will use them to connect with an external API in the Backend. - We recommend using the [TRIVIA APP](https://opentdb.com/api_config.php) for this project. - You will use React to show the game to the user, and you will have to grab all the info for the game (how many questions, correctly answer or incorrectly answer) and send it to the Backend to show if the user won or not -- +- + # Project Instructions ## Part 0 - Starter Code + - [ ] Start by cloning the existing code and get it running on your computer. Make sure to start a new branch for your project [Cristina's example with hard data](https://github.com/Yosolita1978/week8Game) ### For the Backend + - Make the GET request for real data to the API in the Backend ### For the Frontend + - Make the game functional - + ## Guide code -You can see a tutorial on how to create a game in react [here](https://www.freecodecamp.org/news/how-to-build-a-quiz-app-using-react/) + +You can see a tutorial on how to create a game in react [here](https://www.freecodecamp.org/news/how-to-build-a-quiz-app-using-react/) diff --git a/react-js/class-based-components/react-part-1-intro.md b/react-js/class-based-components/react-part-1-intro.md index 2dcc5d777..4f83a5032 100644 --- a/react-js/class-based-components/react-part-1-intro.md +++ b/react-js/class-based-components/react-part-1-intro.md @@ -40,7 +40,7 @@ React allows developers to create large web applications that can change data, w ### Lesson Materials -You will spend the day working through these materials. +You will spend the day working through these materials. 1. [Introduction to React (video)](https://youtu.be/ycstRj2i66k) 1. [Learn React in 5 minutes (article)](https://medium.freecodecamp.org/learn-react-js-in-5-minutes-526472d292f4) @@ -84,8 +84,7 @@ Here, the component has a className heading. Try applying various styles for the Remove the return from a component in one of the CodePens and take note of the error message shown. 2. Don't forget that expressions in JSX must be enclosed in brackets. Example: `
Hello {this.state.thing}
` 3. The event system in React uses attributes you are likely familiar with from HTML, but they are written using camelCase. Example: `` -4. Many of these tutorials have used a class to define a component, although it is now more popular to use functions. - +4. Many of these tutorials have used a class to define a component, although it is now more popular to use functions. ### Guided Practice diff --git a/react-js/class-based-components/react-part-2-component-state.md b/react-js/class-based-components/react-part-2-component-state.md index 24b2ed8ef..129a3f9dd 100644 --- a/react-js/class-based-components/react-part-2-component-state.md +++ b/react-js/class-based-components/react-part-2-component-state.md @@ -33,58 +33,60 @@ Now the problem arises: How do we store and change component information we want 1. Remember: The scope of the state is local to the component. This means that the state is restricted within the class only. - - Incorrect, since `this.state.message` is undefined outside of the component. - ```javascript - class Message extends React.Component { - constructor(){ - this.state = { message : "message" } - } - } +- Incorrect, since `this.state.message` is undefined outside of the component. + ```javascript + class Message extends React.Component { + constructor() { + this.state = { message: 'message' }; + } + } + console.log(this.state.message); + ``` +- Correct + ```javascript + class Message extends React.Component { + constructor() { + this.state = { message: 'message' }; + } + render() { console.log(this.state.message); - ``` - - Correct - ```javascript - class Message extends React.Component { - constructor(){ - this.state = { message : "message" } - } - render(){ console.log(this.state.message); } - } - ``` + } + } + ``` 2. Don't forget to update state immutably. - - Incorrect, since you can't just reassign state. You have to use `setState`. - ```javascript - this.state.message = 'new message'; - ``` - - Correct +- Incorrect, since you can't just reassign state. You have to use `setState`. + ```javascript + this.state.message = 'new message'; + ``` +- Correct - ```javascript - this.setState({ - message: 'new message' - }); - ``` + ```javascript + this.setState({ + message: 'new message' + }); + ``` 3. A component should not change or update its props. Props are values sent by parent component to child component and changing the props will cause inconsistency in prop data. Therefore, it is advisable not to change its own props. - - Incorrect - ```javascript - this.props.message = 'new message'; - ``` - - Correct - ```javascript - this.setState({ - message: 'new message' - }); - ``` +- Incorrect + ```javascript + this.props.message = 'new message'; + ``` +- Correct + ```javascript + this.setState({ + message: 'new message' + }); + ``` ### Guided Practice - Define state. - ```javascript - state = {}; - ``` + ```javascript + state = {}; + ``` - Initialize state inside class constructor. ```javascript @@ -124,27 +126,27 @@ constructor(){ 2. Now we will create two buttons which will perform the functionality. - ```html - - ``` +```html + +``` 3. Create a simple tag to display the number i.e. the value defined in state. - ```html -

{this.state.value}

- ``` +```html +

{this.state.value}

+``` 4. That is all which will be displayed on the page. Now we need to implement the functionality when the buttons are clicked. 5. So, let us create a function which will run when increment button is clicked. To increment the value in the state, we will take the previous value and add 1 to it by using _setState_ function. - ```javascript - addValue = () => { - this.setState({ - value: this.state.value + 1 - }); - }; - ``` +```javascript +addValue = () => { + this.setState({ + value: this.state.value + 1 + }); +}; +``` **Note:- setState is a predefined function in React which is used to update the state. The setState function has two function definitions i.e. it can either take an object as a parameter or a function as a parameter.** @@ -165,20 +167,20 @@ For now, let us use the object instance only. 6. Similarly we will create a function which will decrement the value by 1. - ```javascript - subtractValue = () => { - this.setState({ - value: this.state.value - 1 - }); - }; - ``` +```javascript +subtractValue = () => { + this.setState({ + value: this.state.value - 1 + }); +}; +``` 7. The functions have been created. Now, we just need to associate the functions we have created to the buttons i.e. set the _onClick_ attribute to the button which we have created. - ```html - - - ``` +```html + + +``` 8. Let us extend this example a bit more by adding lower and upper limit to the value. If the value is _0_ , then we cannot reduce the value and when the value becomes _10_, we cannot increment the value. This can be done by hiding the buttons on certain boundary values. @@ -233,8 +235,14 @@ There are 3 buttons :- render() { return (
- - + +

Prop display {this.props.message}

{' '}

Value display {this.state.value}

@@ -299,8 +307,7 @@ UI should contain - - A hidden text which will only be displayed when correct button is clicked. - A message tag which will display the status of the game whether the person has _won_ or _lost_ the game. - A reset button which will reset the state of the game. - \*\*Hint:-1.Onlythosetagswhosestateischangingwillbekeptinstate. - 2. Use of conditions in React.\*\* + \*\*Hint:-1.Onlythosetagswhosestateischangingwillbekeptinstate. 2. Use of conditions in React.\*\* ### Supplemental Materials diff --git a/react-js/class-based-components/react-part-3-component-hierarchies.md b/react-js/class-based-components/react-part-3-component-hierarchies.md index b37ab7c96..9be341af5 100644 --- a/react-js/class-based-components/react-part-3-component-hierarchies.md +++ b/react-js/class-based-components/react-part-3-component-hierarchies.md @@ -247,8 +247,7 @@ The full set is in the starter code link above. // Source: https://www.mentalfloss.com/article/53181/inspiring-quotes-10-influential-women-tech const QUOTES = [ { - text: - 'A ship in port is safe, but that is not what ships are for. Sail out to sea and do new things.', + text: 'A ship in port is safe, but that is not what ships are for. Sail out to sea and do new things.', speaker: 'Grace Hopper' } //... diff --git a/react-js/react-hooks.md b/react-js/react-hooks.md index afba951d4..3d4969d97 100644 --- a/react-js/react-hooks.md +++ b/react-js/react-hooks.md @@ -51,20 +51,20 @@ Look at the functions in the [pure functions article](https://dev.to/keevcodes/p ```js let globalNumber = 4; const multiply = (x) => { - return globalNumber *= x -} + return (globalNumber *= x); +}; ``` ```js const multiplyNumber = (x) => { - return x * 2; -} + return x * 2; +}; ``` Pure components, also called (Stateless)Functional Component, or _(S)FC_ in React, are pure functions - they are components that do not store any internal state, and are pure with respect to their props. For example, ```js -const HeadlineComponent = props => (

{props.headline}

) +const HeadlineComponent = (props) =>

{props.headline}

; ``` #### Why were hooks introduced? @@ -128,7 +128,6 @@ const TodoApp = () => { ); }; - ``` 2. **What information do we need? (aka what states do we need?)** @@ -168,21 +167,21 @@ This could look like: ```js const TodoApp = () => { - const [items, setItems] = useState(["Item one"]); - const [status, setStatus] = useState(""); - const [newTodo, setNewTodo] = useState(""); + const [items, setItems] = useState(['Item one']); + const [status, setStatus] = useState(''); + const [newTodo, setNewTodo] = useState(''); return (
{status}
{ + onSubmit={(e) => { e.preventDefault(); // We want update items to be old items + a new item // we do this with setItems // We also want to reset the input field value setItems([...items, newTodo]); - setNewTodo(""); + setNewTodo(''); }} >
` - - You feed an object instead of a string into `style`: `style='color: red'` -> `style={{color: “red”}}` + - JSX avoids reserved JavaScript words like `class`, `for`, etc + - `class` -> `className` ; `for` -> `htmlFor` + - You can use HTML Elements, but they won't be exactly the same. The event system in React uses attributes you are likely familiar with from HTML, but they are written using camelCase. One example is that an HTML button's `onclick` is written `onClick` in JSX: `` + - You feed an object instead of a string into `style`: `style='color: red'` -> `style={{color: “red”}}` - Many projects use a class to define a component, although it is now more popular to use functions. - ### Check for Understanding Open one of your CodePens from the lesson. -Pretend you are in an interview, and the interviewer is asking you to point out different parts of the code. Point to it and say a few things you notice about [the previous CodePen](https://codepen.io/alodahl/pen/xxgoeqL), like if it reminds you of something in JS, HTML or CSS. +Pretend you are in an interview, and the interviewer is asking you to point out different parts of the code. Point to it and say a few things you notice about [the previous CodePen](https://codepen.io/alodahl/pen/xxgoeqL), like if it reminds you of something in JS, HTML or CSS. + - [ ] Which function renders your webpage? - [ ] Where in the HTML does the React component render? - [ ] Which function declarations are actually React components? diff --git a/react-js/react-part-2-props.md b/react-js/react-part-2-props.md index 6f04eb0c8..de796bb0a 100644 --- a/react-js/react-part-2-props.md +++ b/react-js/react-part-2-props.md @@ -30,49 +30,50 @@ The reusable components help prevent duplication, but for this reason, React can ### Guided Practice 1. Watch this 5 minute video, ["What is 'props'?"](https://youtu.be/KvapOdsFK5A). -1. Spend 5 minutes on this CodePen that shows one prop. Fork it and try changing rules in the ".box" class, duplicating the line ``, and changing the value in `text=""`. https://codepen.io/alodahl/pen/xxgoeMW -1. Spend 5 minutes on this CodePen that passes a prop to 3 instances of the same component. There is still only one prop called "text". https://codepen.io/alodahl/pen/gOgNyEN. Try changing the text on just one box. -1. Spend 5 minutes on this CodePen that now has 2 props: "text" and "color": https://codepen.io/alodahl/pen/dyNBLLQ. Try changing the text colors. -1. What if you wanted to change a whole class of styles? Spend 5 minutes changing the CSS here: https://codepen.io/alodahl/pen/poRXBmR -1. As you may notice, if you were trying to make a long list of say, 10 boxes, even though this is more efficient than HTML, it's still a bit repetitive. Spend 5 minutes checking out this `Array.map` version of the boxes list. If you have time, change things like you did in the previous steps. https://codepen.io/alodahl/pen/LYxwbro +1. Spend 5 minutes on this CodePen that shows one prop. Fork it and try changing rules in the ".box" class, duplicating the line ``, and changing the value in `text=""`. https://codepen.io/alodahl/pen/xxgoeMW +1. Spend 5 minutes on this CodePen that passes a prop to 3 instances of the same component. There is still only one prop called "text". https://codepen.io/alodahl/pen/gOgNyEN. Try changing the text on just one box. +1. Spend 5 minutes on this CodePen that now has 2 props: "text" and "color": https://codepen.io/alodahl/pen/dyNBLLQ. Try changing the text colors. +1. What if you wanted to change a whole class of styles? Spend 5 minutes changing the CSS here: https://codepen.io/alodahl/pen/poRXBmR +1. As you may notice, if you were trying to make a long list of say, 10 boxes, even though this is more efficient than HTML, it's still a bit repetitive. Spend 5 minutes checking out this `Array.map` version of the boxes list. If you have time, change things like you did in the previous steps. https://codepen.io/alodahl/pen/LYxwbro ### JS versus JSX + - Read these docs through to the "Specifying Children with JSX" section (15 min read): https://reactjs.org/docs/introducing-jsx.html -- Since JSX is not JS, you need to point out to the JSX that you want to use regular JS. You can do this with curly braces. Some examples are: - - ``
`` - since string interpolation is a JS tool, and not JSX, string interpolation has to be inside curly braces. - - `

{props.text}

`. If you forget the braces, your page will render the string "props.text", which is likely not what you want. Try it in one of the CodePens. +- Since JSX is not JS, you need to point out to the JSX that you want to use regular JS. You can do this with curly braces. Some examples are: + - ``
`` - since string interpolation is a JS tool, and not JSX, string interpolation has to be inside curly braces. + - `

{props.text}

`. If you forget the braces, your page will render the string "props.text", which is likely not what you want. Try it in one of the CodePens. - `style={{color: "blue"}}`, where the first braces are to note "there will be JS in here", while the second set surrounds the style object: `{color: "blue"}`. - ### Independent Practice -- Fork one of the React CodePens above, and delete everything in the "JS" section. Give it a new name, like "Props Independent Practice". Paste the following code into it, and try to create a mapped list of boxes that accept text as a prop to make 3 boxes that say "one", "two" and "three". Try to get as far as you can on your own before peeking at the previous example. +- Fork one of the React CodePens above, and delete everything in the "JS" section. Give it a new name, like "Props Independent Practice". Paste the following code into it, and try to create a mapped list of boxes that accept text as a prop to make 3 boxes that say "one", "two" and "three". Try to get as far as you can on your own before peeking at the previous example. Stop after 20 minutes. If you finish early, try adding a second prop to each box. - ``` - import React from 'https://cdn.skypack.dev/react@^17'; - import ReactDOM from 'https://cdn.skypack.dev/react-dom@^17'; - // Don't worry about these imports right now. + +``` +import React from 'https://cdn.skypack.dev/react@^17'; +import ReactDOM from 'https://cdn.skypack.dev/react-dom@^17'; +// Don't worry about these imports right now. - const Box = props => -
- This box says: -
; +const Box = props => +
+ This box says: +
; - const boxData = ["one","two","three"]; +const boxData = ["one","two","three"]; - const App = () => { - return(); - }; +const App = () => { + return(); +}; - ReactDOM.render(, - document.getElementById("root")) - ``` +ReactDOM.render(, +document.getElementById("root")) +``` ### Check for Understanding - Make sure you can answer these questions. If you aren't sure about any of these, write them down and figure it out with a peer before moving on. +Make sure you can answer these questions. If you aren't sure about any of these, write them down and figure it out with a peer before moving on. - [ ] Open [this CodePen example](https://codepen.io/alodahl/pen/LYxwbro). Point out which parts are: 1. props diff --git a/react-js/react-part-3-state.md b/react-js/react-part-3-state.md index b88ee15bf..4219fdc00 100644 --- a/react-js/react-part-3-state.md +++ b/react-js/react-part-3-state.md @@ -5,7 +5,6 @@ - What is React state? - What is the difference between React props and state? (When should you use each one?) - ### Prerequisites - [Intro to React](./react-part-1-intro.md) @@ -13,9 +12,9 @@ ### Motivation -React allows developers to create large web applications that can change data without reloading the page. The changes are managed as the component's _state_. React watches _state_, and only changes parts of the page where the state changes. +React allows developers to create large web applications that can change data without reloading the page. The changes are managed as the component's _state_. React watches _state_, and only changes parts of the page where the state changes. -[Facebook](https://www.facebook.com) created React as a framework to create reusable components, like posts or comments, and allow the user to see updates instantly. For example, submitting a new comment would add that new data to the _state_. Because the _state_ changed in the post, the comment section would automatically update, while the image or title wouldn't have to update. This takes a lot less computing power, and it is more satisfying than having to refresh the page to notice the change. +[Facebook](https://www.facebook.com) created React as a framework to create reusable components, like posts or comments, and allow the user to see updates instantly. For example, submitting a new comment would add that new data to the _state_. Because the _state_ changed in the post, the comment section would automatically update, while the image or title wouldn't have to update. This takes a lot less computing power, and it is more satisfying than having to refresh the page to notice the change. ### Objectives @@ -26,7 +25,9 @@ React allows developers to create large web applications that can change data wi - Become familiar with how state is implemented ### Materials + See Lesson for how to use each. + - [React-State Slides](https://docs.google.com/presentation/d/1rUowQmt-JBKWvyNnoAxdqdUfo2Xs-KtinCTrqgjt5CY/edit#slide=id.g832b659498_0_442) - [Light Switch CodePen example](https://codepen.io/alodahl/pen/YzZyaKe) - [Props vs State article by Kent C Dodds (15 min read)](https://kentcdodds.com/blog/props-vs-state) @@ -38,27 +39,32 @@ See Lesson for how to use each. State is the reactive part of react. -- Spend 10 minutes looking at this code pen example of a simple toggle state: _checked_ or _unchecked_. If you fork it you can experiment, or delete the comments to see just the code. https://codepen.io/alodahl/pen/YzZyaKe -- Take a minute or two to look at the checkbox html in the inspector. Watch how the attributes change as you check and uncheck the box. +- Spend 10 minutes looking at this code pen example of a simple toggle state: _checked_ or _unchecked_. If you fork it you can experiment, or delete the comments to see just the code. https://codepen.io/alodahl/pen/YzZyaKe +- Take a minute or two to look at the checkbox html in the inspector. Watch how the attributes change as you check and uncheck the box. ### Props vs State -To put it plainly, the difference between props and state is whether you need *external* or *internal* management for your component. **Props** are what the component needs to *receive* to do its job, while **state** is what it manages *on its own*. -What are some real world examples? If we pretend these are components, this is how it would look: +To put it plainly, the difference between props and state is whether you need _external_ or _internal_ management for your component. **Props** are what the component needs to _receive_ to do its job, while **state** is what it manages _on its own_. + +What are some real world examples? If we pretend these are components, this is how it would look: **Software Employee** -- Props to pass in: assignments, meetings + +- Props to pass in: assignments, meetings - State to self-manage: time management, code creation, lunch **Dog** + - Props: food, water, let in or out - State: sleep/wake, emotions, running or sitting **Toaster** + - Props: start lever, timer setting - State: heat up based on start, pop-up based on timer, turn off after pop-up happens **Car** + - Props: // add 3 examples yourself - what does the driver control? - State: // add 3 examples yourself - what does a car control automatically? @@ -66,14 +72,16 @@ Take 3 minutes to come up with examples for "Car". We'll practice using both props and state in the same component in Guided Practice. #### Reading Time + - [Props vs State article by Kent C Dodds (15 min read)](https://kentcdodds.com/blog/props-vs-state) - [React Official Docs: Using the state hook (15 min read)](https://reactjs.org/docs/hooks-state.html) ### Common Mistakes / Misconceptions -1. It may take a few days for props v state to sink in - this is normal. For now, try to remember the basic reasons you would use one instead of the other. No need to memorize the syntax yet. +1. It may take a few days for props v state to sink in - this is normal. For now, try to remember the basic reasons you would use one instead of the other. No need to memorize the syntax yet. 2. Don't forget that JS variables inside JSX must be enclosed in curly braces. Example: `
Hello {props.name}, your lights are {isLightOn ? "on" : "off"}
` - - Note that boolean `isLightOn` is the name of an example _state_. + +- Note that boolean `isLightOn` is the name of an example _state_. ### Guided Practice @@ -93,8 +101,7 @@ The full set is in the starter code link above. // Source: https://www.mentalfloss.com/article/53181/inspiring-quotes-10-influential-women-tech const quotes = [ { - text: - 'A ship in port is safe, but that is not what ships are for. Sail out to sea and do new things.', + text: 'A ship in port is safe, but that is not what ships are for. Sail out to sea and do new things.', source: 'Grace Hopper' } //... @@ -171,23 +178,25 @@ const QuoteGenerator () => { } ``` -One of the most complex parts of this example is that setCurrentQuote manages the state, but it is passed down as a prop to `QuoteButton`. Because the quotes are controlled and displayed in `QuoteGenerator`, quotes have to be managed there. The way `setCurrentQuote` is passed through the `onClick` prop is a *callback*. When `onClick` happens, `QuoteButton` triggers its `onClick` function, but that function, `setCurrentQuote`, is still executed here in `QuoteGenerator`. +One of the most complex parts of this example is that setCurrentQuote manages the state, but it is passed down as a prop to `QuoteButton`. Because the quotes are controlled and displayed in `QuoteGenerator`, quotes have to be managed there. The way `setCurrentQuote` is passed through the `onClick` prop is a _callback_. When `onClick` happens, `QuoteButton` triggers its `onClick` function, but that function, `setCurrentQuote`, is still executed here in `QuoteGenerator`. ### Extended Independent Practice Instead of random quotes, modify `QuoteButton` so it displays two buttons, `Previous` and `Next` that go through the `quotes` array in order. - - On each new button's onClick method, change the state with `setCurrentQuote(*add logic here*)`. - - When you reach either end of the list, it's up to you if it "wraps around" to the other end or if the Previous or Next button are disabled on the ends. - - When newly added, the state should be updated to display it as the current quote. + +- On each new button's onClick method, change the state with `setCurrentQuote(*add logic here*)`. +- When you reach either end of the list, it's up to you if it "wraps around" to the other end or if the Previous or Next button are disabled on the ends. +- When newly added, the state should be updated to display it as the current quote. #### Finished Result This [CodePen](https://codepen.io/alodahl/pen/MWmgoEY) has an example of a finished result. - ### Extensions (Optional) - - Add a form to the above so the user can add their own quote to the end of the `quotes` array. - - [Build a Pokedex with React ](https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-1-e1ba0b9387a7) + +- Add a form to the above so the user can add their own quote to the end of the `quotes` array. +- [Build a Pokedex with React ](https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-1-e1ba0b9387a7) ### Supplemental Materials + - [Using the State Hook](https://reactjs.org/docs/hooks-state.html) - React doc diff --git a/react-js/react-part-4-component-hierarchies.md b/react-js/react-part-4-component-hierarchies.md index a551785d6..9f511503d 100644 --- a/react-js/react-part-4-component-hierarchies.md +++ b/react-js/react-part-4-component-hierarchies.md @@ -25,7 +25,6 @@ React is a UI library. Building a React application involves breaking up your ap - Understand the use of `props.children` - Understand how to use a 3rd-party library of components like [reactstrap](https://reactstrap.github.io/) - ### Lesson #### What is the Difference Between Components and Built-in JSX tags like `
); -} +}; ``` ```javascript // Child.jsx -import React, {useState} from "react"; +import React, { useState } from 'react'; -const Child = props => { - const [data, setData] = useState('Data received'); +const Child = (props) => { + const [data, setData] = useState('Data received'); - return ( -
-

Child Component

- -
- ); -} + return ( +
+

Child Component

+ +
+ ); +}; export default Child; ``` -You can run the code in this [codesandbox.io page](https://codesandbox.io/s/pass-data-from-child-to-parent-6tl0e?file=/src/Child.js:43-493). Note that this is using React class syntax instead of the above functional syntax, but the rest is exactly the same. +You can run the code in this [codesandbox.io page](https://codesandbox.io/s/pass-data-from-child-to-parent-6tl0e?file=/src/Child.js:43-493). Note that this is using React class syntax instead of the above functional syntax, but the rest is exactly the same. **A note on siblings and mediators:** -Note that the above method is also how you would deal with **sibling communication**. If there were a parent container with three buttons, and you want all to change color if one is clicked, you would manage this with child states communicated to the parent through callbacks. The parent keeping track of all three could then pass the appropriate action to the buttons with props, such as which color to display. In this situation, the parent with the coordinating role is a **mediator**. +Note that the above method is also how you would deal with **sibling communication**. If there were a parent container with three buttons, and you want all to change color if one is clicked, you would manage this with child states communicated to the parent through callbacks. The parent keeping track of all three could then pass the appropriate action to the buttons with props, such as which color to display. In this situation, the parent with the coordinating role is a **mediator**. ##### How to use `props.children` 1. Read [React This Props Children](https://learn.co/lessons/react-this-props-children) 1. Watch this 4 min video, [React Tutorial 13: `props.children`](https://www.youtube.com/watch?v=Sq0FoUPxj_c) -1. [Read the React Docs on Children](https://reactjs.org/docs/composition-vs-inheritance.html#children) (5 min read. Just read the first section on Containment, but not about Specialization.) +1. [Read the React Docs on Children](https://reactjs.org/docs/composition-vs-inheritance.html#children) (5 min read. Just read the first section on Containment, but not about Specialization.) The ability for components to receive and render child elements is one of the most important feature of React. This makes it really easy to create reusable components. All we need to do is include data between the opening and closing tags of a parent component, and it will automatically get passed as a prop called `children`. ```javascript -import React from "react"; +import React from 'react'; const MyComponent = (props) => (
@@ -161,14 +158,14 @@ ReactDOM.render(

understanding props.children

, - document.getElementById("root") + document.getElementById('root') ); ``` -In the above example, whenever the MyComponent is invoked, `props.children` will be displayed under the `h1`. Again, `props.children` is just a reference to what is between the opening and closing tags of its parent component. +In the above example, whenever the MyComponent is invoked, `props.children` will be displayed under the `h1`. Again, `props.children` is just a reference to what is between the opening and closing tags of its parent component. [Run code](https://codepen.io/SupriyaRaj/pen/GRMdVKX?editors=1111) -Instead of invoking the component with a self-closing tag < MyComponent />; invoke it with full opening and closing tags `*`, placing your child code in between (*). +Instead of invoking the component with a self-closing tag < MyComponent />; invoke it with full opening and closing tags `*`, placing your child code in between (\*). This de-couples the component from its content and makes it more reusable. diff --git a/react-js/react-part-5-full-apps.md b/react-js/react-part-5-full-apps.md index dbcdc25ae..34a27d98d 100644 --- a/react-js/react-part-5-full-apps.md +++ b/react-js/react-part-5-full-apps.md @@ -323,15 +323,14 @@ const [sortBy, setSortBy] = useState('asc'); const sortByTime = () => { setSortBy(sortBy === 'asc' ? 'dsc' : 'asc'); const sortedTodos = [...todos]; - sortedTodos - .sort((a, b) => { - if (sortBy === 'asc') { - return a.createdAt - b.createdAt; - } else { - return b.createdAt - a.createdAt; - } - }); - setTodos(sortedTodos) + sortedTodos.sort((a, b) => { + if (sortBy === 'asc') { + return a.createdAt - b.createdAt; + } else { + return b.createdAt - a.createdAt; + } + }); + setTodos(sortedTodos); }; // .... @@ -340,16 +339,15 @@ return (

My todos:

- {todos - .map((todo, index) => ( - - ))} + {todos.map((todo, index) => ( + + ))}
diff --git a/react-js/styling-react.md b/react-js/styling-react.md index 369ff402d..0acdcf2ff 100644 --- a/react-js/styling-react.md +++ b/react-js/styling-react.md @@ -3,7 +3,7 @@ ### Week 4 Keywords and Questions - What is JSX and how is it different than HTML? -- What are syntactic differences between HTML and JSX? +- What are syntactic differences between HTML and JSX? - What are the two ways to add style to a component in React? - How do you import stylesheets into React application? @@ -34,33 +34,30 @@ Styling has been one of the building blocks of web development. Cascading Style - Look through these [slides: CSS in React ](https://docs.google.com/presentation/d/15SRalCJq0HaZ7O8LIngmDVqxDSU0GBVzOhpF1Q0eQOw/edit#slide=id.g827758f8ad_0_333) -> Note: No need to watch any sections on React Bootstrap, since we've recently removed Bootstrap from the curriculum. +> Note: No need to watch any sections on React Bootstrap, since we've recently removed Bootstrap from the curriculum. ### Guided Practice #### Let's create a simple div, and style it using inline CSS and flexbox. Then we will achieve the same using external CSS instead. - - - Fork this [CodePen starter code](https://codepen.io/alodahl/pen/xxdrqbG) to your account and name it `Styling In React`. - - First of all get rid of all the unnecessary stuff showing on DOM , remove all the lines in render of `App.js`. - Now we create a simple div **parent div** which will contain few div as _child_ elements. - After creating that , your `App.js` will look like this - - ```javascript - - const App = () => { - return( -
-
-
Child Div 1
-
Child Div 2
-
Child Div 3
-
-
- ); - }; - - ReactDOM.render(, - document.getElementById("root")) - - ``` +- Fork this [CodePen starter code](https://codepen.io/alodahl/pen/xxdrqbG) to your account and name it `Styling In React`. +- First of all get rid of all the unnecessary stuff showing on DOM , remove all the lines in render of `App.js`. - Now we create a simple div **parent div** which will contain few div as _child_ elements. - After creating that , your `App.js` will look like this - + +```javascript +const App = () => { + return ( +
+
+
Child Div 1
+
Child Div 2
+
Child Div 3
+
+
+ ); +}; + +ReactDOM.render(, document.getElementById('root')); +``` - Now we will be adding CSS to this App to differentiate the **div** elements and achieve this one by one using @@ -71,68 +68,106 @@ Styling has been one of the building blocks of web development. Cascading Style #### Note - To compare the changes among the 3 methods of CSS, create separate React apps. - - Using inline CSS: + - Using inline CSS: - 1. Let us give a background color and some margin on top and bottom to parent element and make its display as flex. - ```javascript -
- ``` - 2. Now add `backgroundColor` to each **child div** with some padding and flex basis. - ```javascript -
Child Div 1
- ``` - 3. Your `App.js` will look like: - - ```javascript -
- {/* Start of Parent Div */} -
- {/* Start of Child Divs */} -
Child Div 1
-
Child Div 2
-
Child Div 3
-
- {/* End of Parent Div */} -
- ``` + 1. Let us give a background color and some margin on top and bottom to parent element and make its display as flex. + ```javascript +
+ ``` + 2. Now add `backgroundColor` to each **child div** with some padding and flex basis. + + ```javascript +
+ Child Div 1 +
+ ``` + + 3. Your `App.js` will look like: + + ```javascript +
+ {/* Start of Parent Div */} +
+ {/* Start of Child Divs */} +
+ Child Div 1 +
+
+ Child Div 2 +
+
+ Child Div 3 +
+
+ {/* End of Parent Div */} +
+ ``` - Using external CSS 1. In your CSS file in the CodePen, add a parent class with same styling as you did in inline CSS. - 2. Create a class for each **child element**. - 3. Your CSS file will look like - - + 2. Create a class for each **child element**. + 3. Your CSS file will look like - - + ```css .parent { - margin: 10px 0; - display: flex; - width: 100vw; - background-color: darkorange; + margin: 10px 0; + display: flex; + width: 100vw; + background-color: darkorange; } .child1 { - flex-basis: 25%; - max-width: 25%; - padding: 10px; - background-color: green; + flex-basis: 25%; + max-width: 25%; + padding: 10px; + background-color: green; } .child2 { - flex-basis: 25%; - max-width: 25%; - padding: 10px; - background-color: red; + flex-basis: 25%; + max-width: 25%; + padding: 10px; + background-color: red; } .child3 { - flex-basis: 25%; - max-width: 25%; - padding: 10px; - background-color: blue; + flex-basis: 25%; + max-width: 25%; + padding: 10px; + background-color: blue; } ``` - 4. Your `App.js` will look like: - ```javascript + + 4. Your `App.js` will look like: + ```javascript return (
- {/* Start of Parent Div */} + {/* Start of Parent Div */}
{/* Start of Child Divs */}
Child 1
@@ -148,53 +183,61 @@ Styling has been one of the building blocks of web development. Cascading Style 1. Avoid these mistakes when combining different classes based on certain state/props. - - When a component is receiving a prop and CSS is rendered depending upon the value of that prop. - - Let us take a component, say `ButtonComp`, which returns a button and adds a class `btn-class` as default class to the button in the component. Now if the component receives a prop as `color`, then an additional `error` class should be added to the button in that component. - - If color is received as a prop by the component then `className = "error btn-class"` - - else `className = "btn-class"` - - > **Incorrect Way** - ```javascript - - ``` - - Reason - ClassName only accepts a single string. The `+` operator before `props.color` will try to parse it to an integer value. Therefore it always takes the `true` value and displays the error class. - - > **Incorrect Way** - ```javascript - - ``` - - Reason - ClassName takes a single string. Hence if the component receives a prop as _color_, the `error` class will be displayed, whereas if the `color` prop is not received by the component then an empty string `""` `+` `btn-class` makes the className `btn-class`. - - However, our requirement was to add not only the `error` class but also `btn-class` when a `color` prop is received. - - > **Correct Way** - ```javascript - - ``` - Or if we use backticks, it can be written as - - - > **Alternate Correct Way** - ```javascript - - ``` + - When a component is receiving a prop and CSS is rendered depending upon the value of that prop. + - Let us take a component, say `ButtonComp`, which returns a button and adds a class `btn-class` as default class to the button in the component. Now if the component receives a prop as `color`, then an additional `error` class should be added to the button in that component. + - If color is received as a prop by the component then `className = "error btn-class"` + - else `className = "btn-class"` + - > **Incorrect Way** + ```javascript + + ``` + - Reason - ClassName only accepts a single string. The `+` operator before `props.color` will try to parse it to an integer value. Therefore it always takes the `true` value and displays the error class. + - > **Incorrect Way** + ```javascript + + ``` + - Reason - ClassName takes a single string. Hence if the component receives a prop as _color_, the `error` class will be displayed, whereas if the `color` prop is not received by the component then an empty string `""` `+` `btn-class` makes the className `btn-class`. + - However, our requirement was to add not only the `error` class but also `btn-class` when a `color` prop is received. + - > **Correct Way** + ```javascript + + ``` + Or if we use backticks, it can be written as - + - > **Alternate Correct Way** + ```javascript + + ``` 2. Wrong path provided while importing CSS in your file structure. - - If the path provided for external CSS file or module in the JSX file is incorrect then React throws an error, i.e. it will not be able to build the webpack. The error will look like - + - If the path provided for external CSS file or module in the JSX file is incorrect then React throws an error, i.e. it will not be able to build the webpack. The error will look like - - ```shell - - > Failed to compile. - - > ./src/App.js - ``` + ```shell + - > Failed to compile. + - > ./src/App.js + ``` 3. Forgetting to use camelCase for CSS styles in React JSX. - - Using **class** instead of **className** gives a warning. - - If any inline style property is used as **two words** like **background-color**, you will encounter an error. This is because these styles are not in a .css file. They are in JSX (Javascript extension for React), so it is actually a JS object; and JS cannot parse dashes. Also note the double curly braces. The outer set of braces means “now instead of React JSX, what’s in these braces will be pure JavaScript.” `style={}`. Then inside is a JS object `{backgroundColor: “red”}`. - - > **Incorrect Way**: - ```javascript - - ) + render(); ``` diff --git a/reading-and-writing-documentation/documentation.md b/reading-and-writing-documentation/documentation.md index df6ce6811..1357e0da7 100644 --- a/reading-and-writing-documentation/documentation.md +++ b/reading-and-writing-documentation/documentation.md @@ -43,7 +43,6 @@ This is such an important topic in software development that many IDE companies - **"I'll just add comments to as much of my code as possible so there will be no confusion later."** This is actually not a good practice. Your variable names and function names should be so descriptive that comments would be redundant. Use comments only to explain things that are not easily apparent by reading the code. - ### Independent Practice 1. Find the JavaScript documentation online. diff --git a/recursion/recursion.md b/recursion/recursion.md index 1f3763fce..99246a03f 100644 --- a/recursion/recursion.md +++ b/recursion/recursion.md @@ -10,7 +10,6 @@ - What is the Base case? - What is the Recursive case? - ### Prerequisites - [JavaScript 1 - Variables, Strings, Numbers](/javascript/javascript-1-variables.md) @@ -22,11 +21,10 @@ Recursion is a powerful technique you can use to solve certain types of problems, usually those that involve hierarchical data. It is also a common interview subject area. - - Interview Questions! - - Fibonacci sequence - - Factorial - - Tree traversal - +- Interview Questions! + - Fibonacci sequence + - Factorial + - Tree traversal ### Objectives diff --git a/refactoring/refactoring.md b/refactoring/refactoring.md index 3c36077d1..42a85b128 100644 --- a/refactoring/refactoring.md +++ b/refactoring/refactoring.md @@ -55,10 +55,10 @@ This is something people might not realize or might assume at first. How would you refactor this? ```js -const legs = function(numOfSpiders) { - let eyes = 2 - let totalEyes = numOfSpiders * eyes - return numOfSpiders * 8 +const legs = function (numOfSpiders) { + let eyes = 2; + let totalEyes = numOfSpiders * eyes; + return numOfSpiders * 8; }; ``` @@ -83,9 +83,9 @@ A possible solution: Your refactored code may look like this (but doesn't have to!): ```js -const getTotalNumOfSpiderLegs = function(numOfSpiders) { +const getTotalNumOfSpiderLegs = function (numOfSpiders) { const NUM_OF_SPIDER_LEGS = 8; - return numOfSpiders * NUM_OF_SPIDER_LEGS + return numOfSpiders * NUM_OF_SPIDER_LEGS; }; ``` diff --git a/runtime-complexity/runtime-complexity.md b/runtime-complexity/runtime-complexity.md index 213ab275f..480dc7af0 100644 --- a/runtime-complexity/runtime-complexity.md +++ b/runtime-complexity/runtime-complexity.md @@ -3,12 +3,11 @@ ### Week 3 Keywords and Questions (see lecture slides) + - What is runtime complexity? - How do we talk about runtime complexity? - What are examples of each the following run times: Constant, linear, O(n^2) - - ### Prerequisites - [JavaScript I - VI lessons](/javascript) @@ -78,8 +77,6 @@ There are several common runtimes that you should understand: - [Efficiency: Determining Big O (15 min video)](https://www.youtube.com/watch?v=3GKpkJ2pr-0&=&t=454s) - [Explanations and code examples of common runtimes](https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/) (10 min read) - - ### Things we'll cover later These things are not covered in this lesson, but they are related and important to know. @@ -110,7 +107,6 @@ Compare multiple pieces of code that do the same thing, and figure out the runti How would you solve these problems [runtime3-solving.md](runtime3-solving.md)? Can you think of an O(n^2), O(n log n), O(n) solution? - ### Advanced Extension - Try to implement the problems in [runtime3-solving.md](runtime3-solving.md). Run your solutions on multiple input sizes. Does it match your expectations? diff --git a/runtime-complexity/runtime.js b/runtime-complexity/runtime.js index fb03ad27d..d59c548d0 100644 --- a/runtime-complexity/runtime.js +++ b/runtime-complexity/runtime.js @@ -7,18 +7,7 @@ const Chart = require("chart.js"); const randomstring = require("randomstring"); const evaluate = function (f, _ns) { const ns = _ns || [ - 1000, - 2000, - 3000, - 4000, - 5000, - 6000, - 7000, - 8000, - 9000, - 10000, - 20000, - 30000, + 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 20000, 30000, 40000 ]; const runs = 100; diff --git a/seo/seo.md b/seo/seo.md index 35ed4d224..42f4b2d96 100644 --- a/seo/seo.md +++ b/seo/seo.md @@ -1,6 +1,7 @@ # SEO ### Week 4 Questions and Keywords + - Why should one use semantic elements? - What types of disabilities should one think of when designing a site? - What is an aria tag? diff --git a/solving-coding-challenges/solving-coding-challenges.md b/solving-coding-challenges/solving-coding-challenges.md index a72c0df71..cb9ce9ce9 100644 --- a/solving-coding-challenges/solving-coding-challenges.md +++ b/solving-coding-challenges/solving-coding-challenges.md @@ -129,7 +129,6 @@ If I am unsure of how to do this in Javascript, I can also google the syntax. A complete solution could look something like this. Note there are a lot of different ways to solve this. In coding there is rarely one "right" answer. - Option 1: ``` diff --git a/testing-and-tdd/jasmine-testing.md b/testing-and-tdd/jasmine-testing.md index fac22e78c..482b82f91 100644 --- a/testing-and-tdd/jasmine-testing.md +++ b/testing-and-tdd/jasmine-testing.md @@ -328,19 +328,19 @@ expect(fizzBuzz).toBeDefined(); return "fizz"; }; - module.exports = fizzBuzz; +module.exports = fizzBuzz; - // spec/fizzBuzz.spec.js - describe("fizzBuzz", function(){ - // older tests +// spec/fizzBuzz.spec.js +describe("fizzBuzz", function(){ +// older tests - it("should return 'fizz' when given a multiple of 3", function(){ - expect(fizzBuzz(3)).toBe("fizz"); - expect(fizzBuzz(6)).toBe("fizz"); - }); - }); - - Notice that we haven't implemented all the functionality for `fizzBuzz` yet - we don't have to for the test to pass. That means we should add more tests! +it("should return 'fizz' when given a multiple of 3", function(){ +expect(fizzBuzz(3)).toBe("fizz"); +expect(fizzBuzz(6)).toBe("fizz"); +}); +}); + +Notice that we haven't implemented all the functionality for `fizzBuzz` yet - we don't have to for the test to pass. That means we should add more tests! diff --git a/testing-and-tdd/jest.md b/testing-and-tdd/jest.md index a864bbb3a..58460c187 100644 --- a/testing-and-tdd/jest.md +++ b/testing-and-tdd/jest.md @@ -6,7 +6,6 @@ - How do you run test coverage with jest in the command line, and what does the output mean? - Give an example of a test assertion. - ### Prerequisites Here are links to lessons that should be completed before this lesson: @@ -40,42 +39,43 @@ _Participants will be able to:_ ### Specific Things to Learn - - create test files in your project - - run Jest commands in the terminal - - write test assertions using Jest +- create test files in your project +- run Jest commands in the terminal +- write test assertions using Jest + +### Materials +> Note: How to use these links is described in the Lesson section. - ### Materials - > Note: How to use these links is described in the Lesson section. +- Jest Official Site: https://jestjs.io/ +- Rithm School Jest tutorial: https://www.rithmschool.com/courses/intermediate-react/testing-with-jest - - Jest Official Site: https://jestjs.io/ - - Rithm School Jest tutorial: https://www.rithmschool.com/courses/intermediate-react/testing-with-jest - ### Lesson +### Lesson - #### Jest Testing +#### Jest Testing - The nice thing about using Jest with React is that it is already included in projects built with `create-react-app`. You should just be able to run `npm test` in a `create-react-app` project folder and it should run Jest. If your project was started another way besides CRA, you can still [install jest](https://jestjs.io/docs/getting-started) with `npm install --save-dev jest` or `yarn add --dev jest`. +The nice thing about using Jest with React is that it is already included in projects built with `create-react-app`. You should just be able to run `npm test` in a `create-react-app` project folder and it should run Jest. If your project was started another way besides CRA, you can still [install jest](https://jestjs.io/docs/getting-started) with `npm install --save-dev jest` or `yarn add --dev jest`. - 1. Spend 5 minutes looking at the jest landing page: https://jestjs.io/ +1. Spend 5 minutes looking at the jest landing page: https://jestjs.io/ - 2. Spend ~ 30 minutes following [this Rithm School tutorial]( https://www.rithmschool.com/courses/intermediate-react/testing-with-jest) for Jest. No need to leave the page for the tutorial, but feel free to click around. +2. Spend ~ 30 minutes following [this Rithm School tutorial](https://www.rithmschool.com/courses/intermediate-react/testing-with-jest) for Jest. No need to leave the page for the tutorial, but feel free to click around. - 3. Spend ~ 30 minutes following [Jest Tutorial for Beginners: Getting Started With JavaScript Testing](https://www.valentinog.com/blog/jest/). Note that you can skip these sections for now: - - "Setting up the Project" - you can just add code to your existing project from step 2, so no need to do this part. - - "How to test React with Jest" - we'll come to that later. - - "Bonus: ES modules with Jest" +3. Spend ~ 30 minutes following [Jest Tutorial for Beginners: Getting Started With JavaScript Testing](https://www.valentinog.com/blog/jest/). Note that you can skip these sections for now: - 4. Spend ~ 1 hour following this Jest Tutorial: https://flaviocopes.com/jest/. It reviews some of the things you just covered, but moves on to more complex use cases. Try to run the tests described yourself locally, even if it may not make sense yet. + - "Setting up the Project" - you can just add code to your existing project from step 2, so no need to do this part. + - "How to test React with Jest" - we'll come to that later. + - "Bonus: ES modules with Jest" - ### Common Mistakes / Misconceptions +4. Spend ~ 1 hour following this Jest Tutorial: https://flaviocopes.com/jest/. It reviews some of the things you just covered, but moves on to more complex use cases. Try to run the tests described yourself locally, even if it may not make sense yet. - - File structure: Different testing libraries scan your project for different folder and file names to find your tests. - - For Jest, you'll need a folder named `__tests__` and files that use the pattern in `button.test.js` or `events.test.ts`. ie: `src/App.js, src/__tests__/App.test.js` - - If you use a different pattern, jest may not be able to find your file to run it. - - Another default option is to keep a test next to the file it is testing instead of a `__tests__` folder - this will keep it easy to see and your import statement short. ie: `src/App.js, src/App.test.js` - - You *can* change this in your project, but it takes some work, and there's no need to get into that now. ([Jest docs](https://jestjs.io/docs/configuration#testmatch-arraystring)) - - Don't make your tests hard to find! In general, try to name your test files after the file that they're testing. When testing `listItem.js`, if you name your test file `listItem.test.js`, it's easy to see what it's supposed to be testing when you or a coworker come back later. - - Remember: you can get "false positives" and "false negatives" in tests. That's why it's good to follow a Red-Green-Refactor pattern, and make sure that your tests fail before implementing the code to make them pass. - - A test with no expectations in it will pass. Don't forget to add at least one `expect` to every `it` function, or you could end up with this false positive. - - Pay attention to when you are writing tests for Asynchronous code. The testing engine might complete before asynchronous code has completed running, giving you unreliable tests. The biggest clue is usually that a test passes sometimes but not others even though you haven't made any changes. +### Common Mistakes / Misconceptions +- File structure: Different testing libraries scan your project for different folder and file names to find your tests. + - For Jest, you'll need a folder named `__tests__` and files that use the pattern in `button.test.js` or `events.test.ts`. ie: `src/App.js, src/__tests__/App.test.js` + - If you use a different pattern, jest may not be able to find your file to run it. + - Another default option is to keep a test next to the file it is testing instead of a `__tests__` folder - this will keep it easy to see and your import statement short. ie: `src/App.js, src/App.test.js` + - You _can_ change this in your project, but it takes some work, and there's no need to get into that now. ([Jest docs](https://jestjs.io/docs/configuration#testmatch-arraystring)) +- Don't make your tests hard to find! In general, try to name your test files after the file that they're testing. When testing `listItem.js`, if you name your test file `listItem.test.js`, it's easy to see what it's supposed to be testing when you or a coworker come back later. +- Remember: you can get "false positives" and "false negatives" in tests. That's why it's good to follow a Red-Green-Refactor pattern, and make sure that your tests fail before implementing the code to make them pass. +- A test with no expectations in it will pass. Don't forget to add at least one `expect` to every `it` function, or you could end up with this false positive. +- Pay attention to when you are writing tests for Asynchronous code. The testing engine might complete before asynchronous code has completed running, giving you unreliable tests. The biggest clue is usually that a test passes sometimes but not others even though you haven't made any changes. diff --git a/testing-and-tdd/mocking-and-abstraction.md b/testing-and-tdd/mocking-and-abstraction.md index 794f1529d..b46370a01 100644 --- a/testing-and-tdd/mocking-and-abstraction.md +++ b/testing-and-tdd/mocking-and-abstraction.md @@ -115,7 +115,7 @@ describe('Get User tests', () => { **Challenge** -Looking at the test code above, think about what would happen if we made any of the following changes. Would the test pass? +Looking at the test code above, think about what would happen if we made any of the following changes. Would the test pass? - Change `return getUser('octocat')...` to `return getUser('not-octocat')...` - In the `mockResponse` object: @@ -224,7 +224,7 @@ app.get('/', (req, res) => { }); ``` -How do we test this? It's tricky because we're interacting with a database. What happens if we run the test while the database isn't running? Or if we use the same database in two different tests, and their saved information conflicts? We'll cover how to deal with this in the Guided Practice section, but as a hint it is very similar to how we mocked our network call. +How do we test this? It's tricky because we're interacting with a database. What happens if we run the test while the database isn't running? Or if we use the same database in two different tests, and their saved information conflicts? We'll cover how to deal with this in the Guided Practice section, but as a hint it is very similar to how we mocked our network call. ### Common Mistakes & Misconceptions diff --git a/testing-and-tdd/react-testing-jest-and-RTL.md b/testing-and-tdd/react-testing-jest-and-RTL.md index 49ccb00c1..2403b8c9b 100644 --- a/testing-and-tdd/react-testing-jest-and-RTL.md +++ b/testing-and-tdd/react-testing-jest-and-RTL.md @@ -21,7 +21,7 @@ Here are links to lessons that should be completed before this lesson: Learn a commonly used React testing tool. -Jest is designed to test JS and React code. React Testing Library (RTL) is a great tool to use with Jest to test that your component is rendering and behaving as expected from the perspective of the user, as opposed to the perspective of the developer. The idea is that the most critical things that you don't want to break are the experience of the end user - for example, do you want a test for a button to fail when its internal function name changes or gets refactored? It's probably more important that the component renders at all, that it renders with the right styles, and it behaves correctly when clicked. +Jest is designed to test JS and React code. React Testing Library (RTL) is a great tool to use with Jest to test that your component is rendering and behaving as expected from the perspective of the user, as opposed to the perspective of the developer. The idea is that the most critical things that you don't want to break are the experience of the end user - for example, do you want a test for a button to fail when its internal function name changes or gets refactored? It's probably more important that the component renders at all, that it renders with the right styles, and it behaves correctly when clicked. **Which companies use Jest + RTL testing?** @@ -41,58 +41,65 @@ _Participants will be able to:_ ### Specific Things to Learn - - write test assertions using Jest + RTL - - recognize when to use RTL - - the basic difference between unit and integration testing +- write test assertions using Jest + RTL +- recognize when to use RTL +- the basic difference between unit and integration testing ### Materials - > Note: How to use these links is described in the Lesson section. - - RTL Official Site: https://testing-library.com/ - - [freeCodeCamp: React Testing Library – Tutorial with JavaScript Code Examples](https://www.freecodecamp.org/news/react-testing-library-tutorial-javascript-example-code/) +> Note: How to use these links is described in the Lesson section. + +- RTL Official Site: https://testing-library.com/ +- [freeCodeCamp: React Testing Library – Tutorial with JavaScript Code Examples](https://www.freecodecamp.org/news/react-testing-library-tutorial-javascript-example-code/) ### Lesson #### React Testing Library - 1. Read these 2 "React Testing Library: Getting Started" pages. (5 min) - - https://testing-library.com/docs/ - - https://testing-library.com/docs/guiding-principles - - 2. Work through this freeCodeCamp tutorial (~30 min): [React Testing Library – Tutorial with JavaScript Code Examples](https://www.freecodecamp.org/news/react-testing-library-tutorial-javascript-example-code/) - - 3. Follow along with this video series by [The Net Ninja](https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg) (~ 90 min. Each one is 5-15 min. Feel free to take a break at some point between videos.): - - [RTL Tutorial #1 - Introduction (start at 2:00)](https://youtu.be/7dTTFW7yACQ?t=119) - - [RTL Tutorial #2 - The Importance of Testing](https://youtu.be/tit8PecSH70) - - [RTL Tutorial #3 - Types of Test](https://youtu.be/n_sS-GAgZ98) - - [RTL Tutorial #4 - Structure of Tests](https://youtu.be/SppbtlpPZu4) - - [RTL Tutorial #5 - Intro to Query Methods](https://youtu.be/Yghw9FkNGsc) - - [RTL Tutorial #6 - Priority](https://youtu.be/PLL5Pvuk-tw) - - [RTL Tutorial #7 - Using Query Methods](https://youtu.be/l9qr3EuLE_8) - - [RTL Tutorial #8 - Assertions](https://youtu.be/3ugQRXRToFA) - - [RTL Tutorial #9 - Describe Block](https://youtu.be/kVzw_f7TfCE) - - [RTL Tutorial #10 - Fire Events](https://youtu.be/0Y11K7KSC80) - - [RTL Tutorial #11 - Integration Tests](https://youtu.be/6wbnwsKrnYU) - - You'll be using previous methods a lot, while these next ones are likely necessary only a couple times per application. - - [RTL Tutorial #12 - Finding Async Elements with FindBy](https://youtu.be/V2wWLM8VX5k) - - [RTL Tutorial #13 - Mocking Requests](https://youtu.be/TBZy-Rc-xX0) - You should not be testing outside apps. Apps should be testing themselves, and this includes your own backend. You don't want to be testing things you have not control over. - - [RTL Tutorial #14 - Before & After Each](https://youtu.be/MtiQMhzjQrY) +1. Read these 2 "React Testing Library: Getting Started" pages. (5 min) + + - https://testing-library.com/docs/ + - https://testing-library.com/docs/guiding-principles + +2. Work through this freeCodeCamp tutorial (~30 min): [React Testing Library – Tutorial with JavaScript Code Examples](https://www.freecodecamp.org/news/react-testing-library-tutorial-javascript-example-code/) + +3. Follow along with this video series by [The Net Ninja](https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg) (~ 90 min. Each one is 5-15 min. Feel free to take a break at some point between videos.): + + - [RTL Tutorial #1 - Introduction (start at 2:00)](https://youtu.be/7dTTFW7yACQ?t=119) + - [RTL Tutorial #2 - The Importance of Testing](https://youtu.be/tit8PecSH70) + - [RTL Tutorial #3 - Types of Test](https://youtu.be/n_sS-GAgZ98) + - [RTL Tutorial #4 - Structure of Tests](https://youtu.be/SppbtlpPZu4) + - [RTL Tutorial #5 - Intro to Query Methods](https://youtu.be/Yghw9FkNGsc) + - [RTL Tutorial #6 - Priority](https://youtu.be/PLL5Pvuk-tw) + - [RTL Tutorial #7 - Using Query Methods](https://youtu.be/l9qr3EuLE_8) + - [RTL Tutorial #8 - Assertions](https://youtu.be/3ugQRXRToFA) + - [RTL Tutorial #9 - Describe Block](https://youtu.be/kVzw_f7TfCE) + - [RTL Tutorial #10 - Fire Events](https://youtu.be/0Y11K7KSC80) + - [RTL Tutorial #11 - Integration Tests](https://youtu.be/6wbnwsKrnYU) + + You'll be using previous methods a lot, while these next ones are likely necessary only a couple times per application. + + - [RTL Tutorial #12 - Finding Async Elements with FindBy](https://youtu.be/V2wWLM8VX5k) + - [RTL Tutorial #13 - Mocking Requests](https://youtu.be/TBZy-Rc-xX0) - You should not be testing outside apps. Apps should be testing themselves, and this includes your own backend. You don't want to be testing things you have not control over. + - [RTL Tutorial #14 - Before & After Each](https://youtu.be/MtiQMhzjQrY) #### Jest Snapshots Follow just these 2 sections about snapshot testing. Use inside any of your practice apps from this outline or the [Jest](jest.md) outline (10 min): + - https://www.valentinog.com/blog/testing-react/#testing-react-components-getting-to-know-snapshot-testing - https://www.valentinog.com/blog/testing-react/#demystifying-snapshot-testing -Read this, but no need to try it now. This may come in handy later. (2 min): https://kentcdodds.com/blog/effective-snapshot-testing#snapshot-diff +Read this, but no need to try it now. This may come in handy later. (2 min): https://kentcdodds.com/blog/effective-snapshot-testing#snapshot-diff **When should I use Jest snapshots?** + - Most of the time you want to test CSS in your component. -- To test the overall structure of your component, and how major variations differ. For example, if you have a component that can switch between a light and a dark theme, you probably want 1 snapshot per theme. -- Breakpoint differences! For example, when mobile layout is different then desktop layout, you should have 2 snapshots. +- To test the overall structure of your component, and how major variations differ. For example, if you have a component that can switch between a light and a dark theme, you probably want 1 snapshot per theme. +- Breakpoint differences! For example, when mobile layout is different then desktop layout, you should have 2 snapshots. **When should I not use Jest snapshots?** + - For non-react JS functions, use plain Jest instead. - If you only want to test the logic of just one CSS rule changing, like just the `fontSize` changing if there's a prop called `textSize`, use React Testing Library. - [How to test a className with Jest and React Testing Library](https://www.semicolonworld.com/question/72512/how-to-test-a-classname-with-jest-and-react-testing-library) diff --git a/testing-and-tdd/testing-mindset.md b/testing-and-tdd/testing-mindset.md index f7e9b85fc..89f505578 100644 --- a/testing-and-tdd/testing-mindset.md +++ b/testing-and-tdd/testing-mindset.md @@ -6,7 +6,6 @@ - What are the edge cases? - When does one create the tests in TDD? - ### Motivation When you write code, you're not done once you write the code -- you need to make sure it works! A big part of coding is testing -- making sure your code actually works how you think it will. diff --git a/ui-ux-design/ui-ux-design.md b/ui-ux-design/ui-ux-design.md index 4a7ce37d3..d73ca7079 100644 --- a/ui-ux-design/ui-ux-design.md +++ b/ui-ux-design/ui-ux-design.md @@ -14,7 +14,6 @@ - Cite an example of bad UX? - Why are they important? - ### Prerequisites - [HTML lesson](/web/html.md) @@ -93,4 +92,3 @@ What do you think stands out in terms of the following?: - Simplicity - Sense of community - Speed - diff --git a/web/accessibility.md b/web/accessibility.md index d3e88864c..f3c657d4a 100644 --- a/web/accessibility.md +++ b/web/accessibility.md @@ -34,63 +34,60 @@ As more and more of our lives revolve around using the internet it is important 2. Watch [Accessibility Fundamentals with Rob Dodson](https://www.youtube.com/watch?v=z8xUCzToff8) 28:15 -3. Try navigating a website with your keyboard only. (5 min) - -`Tab` through focusable items. - -`Arrow keys` for radio buttons, dropdowns. - -`Spacebar` to check/uncheck boxes. - -`Enter` to submit. - +3. Try navigating a website with your keyboard only. (5 min) -`Tab` through focusable items. -`Arrow keys` for radio buttons, dropdowns. -`Spacebar` to check/uncheck boxes. -`Enter` to submit. + Start with www.trello.com. - Things to pay attention to: + Things to pay attention to: - - How does it feel to navigate like this? - - Is it easy to accomplish your goals? + - How does it feel to navigate like this? + - Is it easy to accomplish your goals? - Next, navigate a website you use often (e.g. GitHub, Gmail, Facebook, LinkedIn). + Next, navigate a website you use often (e.g. GitHub, Gmail, Facebook, LinkedIn). - - Talk to a partner about what was easy, hard, or surprising. - - How would you make it better? - - What did they do that worked well? + - Talk to a partner about what was easy, hard, or surprising. + - How would you make it better? + - What did they do that worked well? 4. Spend 15 minutes setting up your screen reader and trying it out. Scan through the linked directions just long enough to get it working. - - Mac - - [Getting started with VoiceOver - perkinselearning.org](https://www.perkinselearning.org/technology/getting-started/mac-voiceover) - - iOS Devices (iPad, iPhone) - - [Turn on and practice VoiceOver on iOS](https://support.apple.com/guide/iphone/turn-on-and-practice-voiceover-iph3e2e415f/ios) - - PC - - NVDA: Scan through these sections. - 1. https://www.nvaccess.org/files/nvda/documentation/userGuide.html#SystemRequirements - 2. https://www.nvaccess.org/files/nvda/documentation/userGuide.html#InstallingNVDA - 3. https://www.nvaccess.org/files/nvda/documentation/userGuide.html#GettingStartedWithNVDA - - [JAWS](https://support.freedomscientific.com/Content/Documents/Manuals/JAWS/JAWS-Quick-Start-Guide.pdf): Start on page 9 - - [Talkback](https://support.google.com/accessibility/android/answer/6283677?hl=en) - - - The following combination of screen reader and browsers are recommended: - - Mac - - VoiceOver + Safari - - iOS Devices - - VoiceOver + Safari - - PC - - NVDA + Firefox - - JAWS + Edge - - Android Devices - - Talkback + Chrome - - On the site you use often: - - Close your eyes and try to understand the content. - - Do images have clear descriptions? - - Can you understand and sumbit forms? - - Can you visualize where you are on the page? - + + - Mac + - [Getting started with VoiceOver - perkinselearning.org](https://www.perkinselearning.org/technology/getting-started/mac-voiceover) + - iOS Devices (iPad, iPhone) + - [Turn on and practice VoiceOver on iOS](https://support.apple.com/guide/iphone/turn-on-and-practice-voiceover-iph3e2e415f/ios) + - PC + - NVDA: Scan through these sections. + 1. https://www.nvaccess.org/files/nvda/documentation/userGuide.html#SystemRequirements + 2. https://www.nvaccess.org/files/nvda/documentation/userGuide.html#InstallingNVDA + 3. https://www.nvaccess.org/files/nvda/documentation/userGuide.html#GettingStartedWithNVDA + - [JAWS](https://support.freedomscientific.com/Content/Documents/Manuals/JAWS/JAWS-Quick-Start-Guide.pdf): Start on page 9 + - [Talkback](https://support.google.com/accessibility/android/answer/6283677?hl=en) + + The following combination of screen reader and browsers are recommended: + + - Mac + - VoiceOver + Safari + - iOS Devices + - VoiceOver + Safari + - PC + - NVDA + Firefox + - JAWS + Edge + - Android Devices + - Talkback + Chrome + + On the site you use often: + + - Close your eyes and try to understand the content. + - Do images have clear descriptions? + - Can you understand and sumbit forms? + - Can you visualize where you are on the page? + 5. Get a disability simulator Chrome Extension such as [Web Disability Simulator](https://chrome.google.com/webstore/detail/web-disability-simulator/olioanlbgbpmdlgjnnampnnlohigkjla?hl=en) (10 min) - - Now try out the different options. - - Can you clearly see text with the color blindness options turned on? - - Can you select buttons and click on links easily in the Parkenson's mode? + Now try out the different options. + - Can you clearly see text with the color blindness options turned on? + - Can you select buttons and click on links easily in the Parkenson's mode? ### Common Mistakes / Misconceptions @@ -123,6 +120,7 @@ Fact: Most accessibility features are not visible. Many websites and apps are st - Practice implementing [aria](accessibility/aria.md) to understand how we can use that to improve accessibility of Web applications. #### Links from slideshow + - [Screen Reader Demo for Digital Accessibility](https://www.youtube.com/watch?v=dEbl5jvLKGQ) - [ARIA tags W3C](https://www.w3.org/TR/html-aria/) - [ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices-1.1/) @@ -131,6 +129,7 @@ Fact: Most accessibility features are not visible. Many websites and apps are st - [Tab indexing Mozilla dev docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex) #### Developer/QA Resources + - [Intro to ARIA](https://www.w3.org/WAI/standards-guidelines/aria/) - [WAI-ARIA Authoring Practice 1.1](https://www.w3.org/TR/wai-aria-practices-1.1/) - [React Accessibility](https://reactjs.org/docs/accessibility.html) @@ -140,6 +139,7 @@ Fact: Most accessibility features are not visible. Many websites and apps are st - [Color Contrast Analyzer](https://www.tpgi.com/color-contrast-checker/) #### Assistive Technologies + - Screen Reader - [VoiceOver](https://webaim.org/articles/voiceover/) - [NVDA](https://webaim.org/articles/nvda/) @@ -152,10 +152,9 @@ Fact: Most accessibility features are not visible. Many websites and apps are st - [Refreshable Braille Display Web Simulator](https://swidjaja.github.io/Refreshable-Braille-Display-Simulator/) - [Screen Magnification Systems](https://www.afb.org/node/16207/screen-magnification-systems) - #### Community -- [a11y Slack](https://web-a11y.slack.com/) - This is a [Slack](https://slack.com/) group where you can ask questions on any accessibility-related topics. +- [a11y Slack](https://web-a11y.slack.com/) - This is a [Slack](https://slack.com/) group where you can ask questions on any accessibility-related topics. ### Check for Understanding diff --git a/web/accessibility/aria.md b/web/accessibility/aria.md index 37233dd5c..bf67ea8a6 100644 --- a/web/accessibility/aria.md +++ b/web/accessibility/aria.md @@ -1,9 +1,11 @@ # Accessible Rich Internet Applications (ARIA) ## Definition + ARIA is a set of attributes that developers can add to native HTML components to improve the accessibility of Web applications. When native HTML accessibility support is not enough, ARIA can be used to enhance accessibility of Web applications. ## Example + Let us take a look at an example on how aria can be used to enhance the accessibility of Web components. The following example shows an accordion component where you can show/hide contents by clicking on a button. ```html @@ -35,9 +37,7 @@ The above example illustrates one of many examples of limitation with the curren ```html
- +