diff --git a/challenges/advanced-bonfires.json b/challenges/advanced-bonfires.json
index d31921c7d8..e14504dba4 100644
--- a/challenges/advanced-bonfires.json
+++ b/challenges/advanced-bonfires.json
@@ -5,6 +5,7 @@
{
"id": "aff0395860f5d3034dc0bfc9",
"name": "Bonfire: Validate US Telephone Numbers",
+ "dashedName": "bonfire-validate-us-telephone-numbers",
"difficulty": "4.01",
"description": [
"Return true if the passed string is a valid US phone number",
@@ -65,6 +66,7 @@
{
"id": "a3f503de51cf954ede28891d",
"name": "Bonfire: Symmetric Difference",
+ "dashedName": "bonfire-symmetric-difference",
"difficulty": "4.02",
"description": [
"Create a function that takes two or more arrays and returns an array of the symmetric difference of the provided arrays.",
@@ -102,6 +104,7 @@
{
"id": "aa2e6f85cab2ab736c9a9b24",
"name": "Bonfire: Exact Change",
+ "dashedName": "bonfire-exact-change",
"difficulty": "4.03",
"description": [
"Design a cash register drawer function that accepts purchase price as the first argument, payment as the second argument, and cash-in-drawer (cid) as the third argument.",
@@ -157,6 +160,7 @@
{
"id": "a56138aff60341a09ed6c480",
"name": "Bonfire: Inventory Update",
+ "dashedName": "bonfire-inventory-update",
"difficulty": "4.04",
"description": [
"Compare and update inventory stored in a 2d array against a second 2d array of a fresh delivery. Update current inventory item quantity, and if an item cannot be found, add the new item and quantity into the inventory array in alphabetical order.",
@@ -211,6 +215,7 @@
{
"id": "a7bf700cd123b9a54eef01d5",
"name": "Bonfire: No repeats please",
+ "dashedName": "bonfire-no-repeats-please",
"difficulty": "4.05",
"description": [
"Return the number of total permutations of the provided string that don't have repeated consecutive letters.",
@@ -252,6 +257,7 @@
{
"id": "a19f0fbe1872186acd434d5a",
"name": "Bonfire: Friendly Date Ranges",
+ "dashedName": "bonfire-friendly-date-ranges",
"difficulty": "4.06",
"description": [
"Implement a way of converting two dates into a more friendly date range that could be presented to a user.",
diff --git a/challenges/basejumps.json b/challenges/basejumps.json
index 2b07de0333..71f3f3dcf8 100644
--- a/challenges/basejumps.json
+++ b/challenges/basejumps.json
@@ -5,6 +5,7 @@
{
"id": "bd7158d8c443eddfaeb5bcef",
"name": "Waypoint: Get Set for Basejumps",
+ "dashedName": "waypoint-get-set-for-basejumps",
"difficulty": 2.00,
"challengeSeed": ["128451852"],
"description": [
@@ -66,6 +67,7 @@
{
"id": "bd7158d8c443eddfaeb5bdef",
"name": "Basejump: Build a Voting App",
+ "dashedName": "basejump-build-a-voting-app",
"difficulty": 2.01,
"challengeSeed": ["128451852"],
"description": [
@@ -101,6 +103,7 @@
{
"id": "bd7158d8c443eddfaeb5bdff",
"name": "Basejump: Build a Nightlife Coordination App",
+ "dashedName": "basejump-build-a-nightlife-coordination-app",
"difficulty": 2.02,
"challengeSeed": ["128451852"],
"description": [
@@ -132,6 +135,7 @@
{
"id": "bd7158d8c443eddfaeb5bd0e",
"name": "Basejump: Chart the Stock Market",
+ "dashedName": "basejump-chart-the-stock-market",
"difficulty": 2.03,
"challengeSeed": ["128451852"],
"description": [
@@ -163,6 +167,7 @@
{
"id": "bd7158d8c443eddfaeb5bd0f",
"name": "Basejump: Manage a Book Trading Club",
+ "dashedName": "basejump-manage-a-book-trading-club",
"difficulty": 2.04,
"challengeSeed": ["128451852"],
"description": [
@@ -194,6 +199,7 @@
{
"id": "bd7158d8c443eddfaeb5bdee",
"name": "Basejump: Build a Pinterest Clone",
+ "dashedName": "basejump-build-a-pinterest-clone",
"difficulty": 2.05,
"challengeSeed": ["128451852"],
"description": [
diff --git a/challenges/basic-bonfires.json b/challenges/basic-bonfires.json
index 998d46df23..df4b6bc16c 100644
--- a/challenges/basic-bonfires.json
+++ b/challenges/basic-bonfires.json
@@ -5,6 +5,7 @@
{
"id": "bd7139d8c441eddfaeb5bdef",
"name": "Waypoint: Pair Program on Bonfires",
+ "dashedName": "waypoint-pair-program-on-bonfires",
"difficulty": 0.44,
"challengeSeed": ["119657641"],
"description": [
@@ -42,11 +43,11 @@
{
"id": "ad7123c8c441eddfaeb5bdef",
"name": "Bonfire: Meet Bonfire",
+ "dashedName": "bonfire-meet-bonfire",
"difficulty": "0",
"description": [
- "Click the button below for further instructions.",
"Your goal is to fix the failing test.",
- "First, run all the tests by clicking \"Run code\" or by pressing Control + Enter",
+ "First, run all the tests by clicking \"Run code\" or by pressing Control + Enter.",
"The failing test is in red. Fix the code so that all tests pass. Then you can move on to the next Bonfire.",
"Make this function return true no matter what."
],
@@ -81,6 +82,7 @@
{
"id": "a202eed8fc186c8434cb6d61",
"name": "Bonfire: Reverse a String",
+ "dashedName": "bonfire-reverse-a-string",
"difficulty": "1.01",
"tests": [
"expect(reverseString('hello')).to.be.a('String');",
@@ -122,6 +124,7 @@
{
"id": "a302f7aae1aa3152a5b413bc",
"name": "Bonfire: Factorialize a Number",
+ "dashedName": "bonfire-factorialize-a-number",
"tests": [
"expect(factorialize(5)).to.be.a(\"Number\");",
"expect(factorialize(5)).to.equal(120);",
@@ -161,6 +164,7 @@
{
"id": "aaa48de84e1ecc7c742e1124",
"name": "Bonfire: Check for Palindromes",
+ "dashedName": "bonfire-check-for-palindromes",
"difficulty": "1.03",
"description": [
"Return true if the given string is a palindrome. Otherwise, return false.",
@@ -207,6 +211,7 @@
{
"id": "a26cbbe9ad8655a977e1ceb5",
"name": "Bonfire: Find the Longest Word in a String",
+ "dashedName": "bonfire-find-the-longest-word-in-a-string",
"difficulty": "1.04",
"description": [
"Return the length of the longest word in the provided sentence.",
@@ -246,6 +251,7 @@
{
"id": "ab6137d4e35944e21037b769",
"name": "Bonfire: Title Case a Sentence",
+ "dashedName": "bonfire-title-case-a-sentence",
"difficulty": "1.05",
"description": [
"Return the provided string with the first letter of each word capitalized.",
@@ -283,6 +289,7 @@
{
"id": "a789b3483989747d63b0e427",
"name": "Bonfire: Return Largest Numbers in Arrays",
+ "dashedName": "bonfire-return-largest-numbers-in-arrays",
"difficulty": "1.06",
"description": [
"Return an array consisting of the largest number from each provided sub-array. For simplicity, the provided array will contain exactly 4 sub-arrays.",
@@ -321,6 +328,7 @@
{
"id": "acda2fb1324d9b0fa741e6b5",
"name": "Bonfire: Confirm the Ending",
+ "dashedName": "bonfire-confirm-the-ending",
"difficulty": "1.07",
"description": [
"Check if a string (first argument) ends with the given target string (second argument).",
@@ -360,6 +368,7 @@
{
"id": "afcc8d540bea9ea2669306b6",
"name": "Bonfire: Repeat a string repeat a string",
+ "dashedName": "bonfire-repeat-a-string-repeat-a-string",
"difficulty": "1.08",
"description": [
"Repeat a given string (first argument) n times (second argument). Return an empty string if n is a negative number.",
@@ -396,6 +405,7 @@
{
"id": "ac6993d51946422351508a41",
"name": "Bonfire: Truncate a string",
+ "dashedName": "bonfire-truncate-a-string",
"difficulty": "1.09",
"description": [
"Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a '...' ending.",
@@ -433,6 +443,7 @@
{
"id": "a9bd25c716030ec90084d8a1",
"name": "Bonfire: Chunky Monkey",
+ "dashedName": "bonfire-chunky-monkey",
"difficulty": "1.10",
"description": [
"Write a function that splits an array (first argument) into groups the length of size (second argument) and returns them as a multidimensional array.",
@@ -470,6 +481,7 @@
{
"id": "ab31c21b530c0dafa9e241ee",
"name": "Bonfire: Slasher Flick",
+ "dashedName": "bonfire-slasher-flick",
"difficulty": "1.11",
"description": [
"Return the remaining elements of an array after chopping off n elements from the head.",
@@ -507,6 +519,7 @@
{
"id": "af2170cad53daa0770fabdea",
"name": "Bonfire: Mutations",
+ "dashedName": "bonfire-mutations",
"difficulty": "1.12",
"description": [
"Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array.",
@@ -549,6 +562,7 @@
{
"id": "adf08ec01beb4f99fc7a68f2",
"name": "Bonfire: Falsey Bouncer",
+ "dashedName": "bonfire-falsey-bouncer",
"difficulty": "1.50",
"description": [
"Remove all falsey values from an array.",
@@ -587,6 +601,7 @@
{
"id": "a8e512fbe388ac2f9198f0fa",
"name": "Bonfire: Where art thou",
+ "dashedName": "bonfire-where-art-thou",
"difficulty": "1.55",
"description": [
"Make a function that looks through a list (first argument) and returns an array of all objects that have equivalent property values (second argument).",
@@ -625,6 +640,7 @@
{
"id": "a39963a4c10bc8b4d4f06d7e",
"name": "Bonfire: Seek and Destroy",
+ "dashedName": "bonfire-seek-and-destroy",
"difficulty": "1.60",
"description": [
"You will be provided with an initial array (the first argument in the destroyer function), followed by one or more arguments. Remove all elements from the initial array that are of the same value as these arguments.",
@@ -661,6 +677,7 @@
{
"id": "a24c1a4622e3c05097f71d67",
"name": "Bonfire: Where do I belong",
+ "dashedName": "bonfire-where-do-i-belong",
"difficulty": "1.61",
"description": [
"Return the lowest index at which a value (second argument) should be inserted into a sorted array (first argument).",
@@ -697,6 +714,7 @@
{
"id": "a3566b1109230028080c9345",
"name": "Bonfire: Sum All Numbers in a Range",
+ "dashedName": "bonfire-sum-all-numbers-in-a-range",
"difficulty": "2.00",
"description": [
"We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.",
@@ -736,7 +754,8 @@
},
{
"id": "a5de63ebea8dbee56860f4f2",
- "name": "Bonfire: Diff Two Arrays",
+ "name": "bonfire-diff-two-arrays",
+ "dashedName": "Bonfire: Diff Two Arrays",
"difficulty": "2.01",
"description": [
"Compare two arrays and return a new array with any items not found in both of the original arrays.",
@@ -782,6 +801,7 @@
{
"id": "a7f4d8f2483413a6ce226cac",
"name": "Bonfire: Roman Numeral Converter",
+ "dashedName": "bonfire-roman-numeral-converter",
"tests": [
"expect(convert(12)).to.equal(\"XII\");",
"expect(convert(5)).to.equal(\"V\");",
@@ -822,6 +842,7 @@
{
"id": "a0b5010f579e69b815e7c5d6",
"name": "Bonfire: Search and Replace",
+ "dashedName": "bonfire-search-and-replace",
"tests": [
"expect(replace(\"Let us go to the store\", \"store\", \"mall\")).to.equal(\"Let us go to the mall\");",
"expect(replace(\"He is Sleeping on the couch\", \"Sleeping\", \"sitting\")).to.equal(\"He is Sitting on the couch\");",
@@ -865,6 +886,7 @@
{
"id": "aa7697ea2477d1316795783b",
"name": "Bonfire: Pig Latin",
+ "dashedName": "bonfire-pig-latin",
"tests": [
"expect(translate(\"california\")).to.equal(\"aliforniacay\");",
"expect(translate(\"paragraphs\")).to.equal(\"aragraphspay\");",
@@ -908,6 +930,7 @@
{
"id": "afd15382cdfb22c9efe8b7de",
"name": "Bonfire: DNA Pairing",
+ "dashedName": "bonfire-dna-pairing",
"tests": [
"assert.deepEqual(pair(\"ATCGA\"),[['A','T'],['T','A'],['C','G'],['G','C'],['A','T']], 'should return the dna pair');",
"assert.deepEqual(pair(\"TTGAG\"),[['T','A'],['T','A'],['G','C'],['A','T'],['G','C']], 'should return the dna pair');",
@@ -946,6 +969,7 @@
{
"id": "af7588ade1100bde429baf20",
"name": "Bonfire: Missing letters",
+ "dashedName": "bonfire-missing-letters",
"difficulty": "2.05",
"description": [
"Find the missing letter in the passed letter range and return it.",
@@ -983,6 +1007,7 @@
{
"id": "a77dbc43c33f39daa4429b4f",
"name": "Bonfire: Boo who",
+ "dashedName": "bonfire-boo-who",
"difficulty": "2.06",
"description": [
"Check if a value is classified as a boolean primitive. Return true or false.",
@@ -1025,6 +1050,7 @@
{
"id": "a105e963526e7de52b219be9",
"name": "Bonfire: Sorted Union",
+ "dashedName": "bonfire-sorted-union",
"difficulty": "2.07",
"description": [
"Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.",
@@ -1062,6 +1088,7 @@
{
"id": "a6b0bb188d873cb2c8729495",
"name": "Bonfire: Convert HTML Entities",
+ "dashedName": "bonfire-convert-html-entities",
"difficulty": "2.07",
"description": [
"Convert the characters \"&\", \"<\", \">\", '\"', and \"'\", in a string to their corresponding HTML entities.",
@@ -1097,6 +1124,7 @@
{
"id": "a103376db3ba46b2d50db289",
"name": "Bonfire: Spinal Tap Case",
+ "dashedName": "bonfire-spinal-tap-case",
"difficulty": "2.08",
"description": [
"Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.",
@@ -1136,6 +1164,7 @@
{
"id": "a5229172f011153519423690",
"name": "Bonfire: Sum All Odd Fibonacci Numbers",
+ "dashedName": "bonfire-sum-all-odd-fibonacci-numbers",
"difficulty": "2.09",
"description": [
"Return the sum of all odd Fibonacci numbers up to and including the passed number if it is a Fibonacci number.",
@@ -1176,6 +1205,7 @@
{
"id": "a3bfc1673c0526e06d3ac698",
"name": "Bonfire: Sum All Primes",
+ "dashedName": "bonfire-sum-all-primes",
"difficulty": "2.10",
"description": [
"Sum all the prime numbers up to and including the provided number.",
@@ -1214,6 +1244,7 @@
{
"id": "ae9defd7acaf69703ab432ea",
"name": "Bonfire: Smallest Common Multiple",
+ "dashedName": "bonfire-smallest-common-multiple",
"difficulty": "2.11",
"description": [
"Find the smallest number that is evenly divisible by all numbers in the provided range.",
@@ -1252,6 +1283,7 @@
{
"id": "a6e40f1041b06c996f7b2406",
"name": "Bonfire: Finders Keepers",
+ "dashedName": "bonfire-finders-keepers",
"difficulty": "2.12",
"description": [
"Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).",
@@ -1287,6 +1319,7 @@
{
"id": "a5deed1811a43193f9f1c841",
"name": "Bonfire: Drop it",
+ "dashedName": "bonfire-drop-it",
"difficulty": "2.13",
"description": [
"Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.",
@@ -1324,6 +1357,7 @@
{
"id": "ab306dbdcc907c7ddfc30830",
"name": "Bonfire: Steamroller",
+ "dashedName": "bonfire-steamroller",
"difficulty": "2.14",
"description": [
"Flatten a nested array. You must account for varying levels of nesting.",
@@ -1360,6 +1394,7 @@
{
"id": "a8d97bd4c764e91f9d2bda01",
"name": "Bonfire: Binary Agents",
+ "dashedName": "bonfire-binary-agents",
"difficulty": "2.15",
"description": [
"Return an English translated sentence of the passed binary string.",
@@ -1396,6 +1431,7 @@
{
"id": "a10d2431ad0c6a099a4b8b52",
"name": "Bonfire: Everything Be True",
+ "dashedName": "bonfire-everything-be-true",
"difficulty": "2.21",
"description": [
"Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).",
@@ -1434,6 +1470,7 @@
{
"id": "a97fd23d9b809dac9921074f",
"name": "Bonfire: Arguments Optional",
+ "dashedName": "bonfire-arguments-optional",
"difficulty": "2.22",
"description": [
"Create a function that sums two arguments together. If only one argument is provided, return a function that expects one additional argument and will return the sum.",
diff --git a/challenges/basic-html5-and-css.json b/challenges/basic-html5-and-css.json
index 6b8ef98def..3e0532d81a 100644
--- a/challenges/basic-html5-and-css.json
+++ b/challenges/basic-html5-and-css.json
@@ -5,6 +5,7 @@
{
"id": "bd7123c8c441eddfaeb5bdef",
"name": "Waypoint: Say Hello to HTML Elements",
+ "dashedName": "waypoint-say-hello-to-html-elements",
"difficulty": 0.0085,
"description": [
"Welcome to Free Code Camp's first coding challenge! Click on the button below for further instructions.",
@@ -44,6 +45,7 @@
{
"id": "bad87fee1348bd9aedf0887a",
"name": "Waypoint: Headline with the h2 Element",
+ "dashedName": "waypoint-headline-with-the-h2-element",
"difficulty": 0.010,
"description": [
"Add an h2
tag that says \"CatPhotoApp\" to create a second HTML element
below your \"Hello World\" h1
element.",
@@ -80,6 +82,7 @@
{
"id": "bad87fee1348bd9aedf08801",
"name": "Waypoint: Inform with the Paragraph Element",
+ "dashedName": "waypoint-inform-with-the-paragraph-element",
"difficulty": 0.011,
"description": [
"Create a p
element below your h2
element, and give it the text \"Hello Paragraph\".",
@@ -114,6 +117,7 @@
{
"id": "bad87fee1348bd9aeaf08801",
"name": "Waypoint: Visually Separate Elements with Line Breaks",
+ "dashedName": "waypoint-visually-separate-elements-with-line-breaks",
"difficulty": 0.012,
"description": [
"Add a br
element to your page, preferably between two of your elements.",
@@ -149,6 +153,7 @@
{
"id": "bad87fee1348bd9aedf08802",
"name": "Waypoint: Uncomment HTML",
+ "dashedName": "waypoint-uncomment-html",
"difficulty": 0.013,
"description": [
"Uncomment your h1
, h2
and p
elements.",
@@ -193,6 +198,7 @@
{
"id": "bad87fee1348bd9aedf08804",
"name": "Waypoint: Comment out HTML",
+ "dashedName": "waypoint-comment-out-html",
"difficulty": 0.014,
"description": [
"Comment out your h1
element and your p
element, but leave your h2
element uncommented.",
@@ -235,6 +241,7 @@
{
"id": "bad87fee1348bd9aedf08833",
"name": "Waypoint: Fill in the Blank with Placeholder Text",
+ "dashedName": "waypoint-fill-in-the-blank-with-placeholder-text",
"difficulty": 0.015,
"description": [
"Replace the text inside your p
element with the first few words of the provided \"Kitty Ipsum\" text.",
@@ -276,6 +283,7 @@
{
"id": "bad87fed1348bd9aedf08833",
"name": "Waypoint: Delete HTML Elements",
+ "dashedName": "waypoint-delete-html-elements",
"difficulty": 0.016,
"description": [
"Delete your h1
and br
elements so we can simplify our view.",
@@ -316,6 +324,7 @@
{
"id": "bad87fee1348bd9aedf08803",
"name": "Waypoint: Change the Color of Text",
+ "dashedName": "waypoint-change-the-color-of-text",
"difficulty": 0.017,
"description": [
"Change your h2
element's style so that its text color is red.",
@@ -351,6 +360,7 @@
{
"id": "bad87fee1348bd9aedf08805",
"name": "Waypoint: Use CSS Selectors to Style Elements",
+ "dashedName": "waypoint-use-css-selectors-to-style-elements",
"difficulty": 0.018,
"description": [
"Delete your h2
element's style attribute and instead create a CSS style
element. Add the necessary CSS to turn all h2
elements blue.",
@@ -395,6 +405,7 @@
{
"id": "bad87fee1348bd9aecf08806",
"name": "Waypoint: Use a CSS Class to Style an Element",
+ "dashedName": "waypoint-use-a-css-class-to-style-an-element",
"difficulty": 0.019,
"description": [
"Create a CSS class called \"red-text\" and apply it to your h2
element.",
@@ -436,6 +447,7 @@
{
"id": "bad87fee1348bd9aefe08806",
"name": "Waypoint: Style Multiple Elements with a CSS Class",
+ "dashedName": "waypoint-style-multiple-elements-with-a-css-class",
"difficulty": 0.020,
"description": [
"Apply the \"red-text\" class to your h2
and p
elements.",
@@ -474,6 +486,7 @@
{
"id": "bad87fee1348bd9aedf08806",
"name": "Waypoint: Change the Font Size of an Element",
+ "dashedName": "waypoint-change-the-font-size-of-an-element",
"difficulty": 0.021,
"description": [
"Create a second p
element. Then, inside your <style>
element, set the \"font-size\" of all p
elements to 16 pixels.",
@@ -513,6 +526,7 @@
{
"id": "bad87fee1348bd9aede08807",
"name": "Waypoint: Set the Font Family of an Element",
+ "dashedName": "waypoint-set-the-font-family-of-an-element",
"difficulty": 0.022,
"description": [
"Make all of your p
elements use the \"Monospace\" font.",
@@ -553,6 +567,7 @@
{
"id": "bad87fee1348bd9aedf08807",
"name": "Waypoint: Import a Google Font",
+ "dashedName": "waypoint-import-a-google-font",
"difficulty": 0.023,
"description": [
"Apply the font-family
of \"Lobster\" to your h2
element.",
@@ -598,6 +613,7 @@
{
"id": "bad87fee1348bd9aedf08808",
"name": "Waypoint: Specify How Fonts Should Degrade",
+ "dashedName": "waypoint-specify-how-fonts-should-degrade",
"difficulty": 0.024,
"description": [
"Make all your h2
elements use \"Lobster\" as their font family, but degrade to the \"Monospace\" font when the \"Lobster\" font isn't available.",
@@ -647,6 +663,7 @@
{
"id": "bad87fee1348bd9aedf08809",
"name": "Waypoint: Override Styles with Important",
+ "dashedName": "waypoint-override-styles-with-important",
"difficulty": 0.025,
"description": [
"Create an \"urgently-red\" class that gives an element the font-color of red, but add !important
to the class to ensure the element is rendered as being red. Immediately below your \"urgently-red\" class declaration, create a \"blue-text\" class that gives an element the font-color of blue. Apply both classes to your h2
element.",
@@ -703,6 +720,7 @@
{
"id": "bad87fee1348bd9aedf08812",
"name": "Waypoint: Add Images to your Website",
+ "dashedName": "waypoint-add-images-to-your-website",
"difficulty": 0.026,
"description": [
"Use an img
element to add the image http://bit.ly/fcc-kittens
to your website.",
@@ -751,6 +769,7 @@
{
"id": "bad87fee1348bd9acdf08812",
"name": "Waypoint: Size your Images",
+ "dashedName": "waypoint-size-your-images",
"difficulty": 0.027,
"description": [
"Create a class called smaller-image
and use it to resize the image so that it's only 100 pixels wide.",
@@ -800,6 +819,7 @@
{
"id": "bad87fee1348bd9bedf08813",
"name": "Waypoint: Add Borders Around your Elements",
+ "dashedName": "waypoint-add-borders-around-your-elements",
"difficulty": 0.028,
"description": [
"Create a class called \"thick-green-border\" that puts a 10-pixel-wide green border with a style of \"solid\" around an HTML element, and apply that class to your cat photo.",
@@ -856,6 +876,7 @@
{
"id": "bad87fee1348bd9aedf08814",
"name": "Waypoint: Add Rounded Corners with a Border Radius",
+ "dashedName": "waypoint-add-rounded-corners-with-a-border-radius",
"difficulty": 0.029,
"description": [
"Give your cat photo a border-radius
of 10 pixels.",
@@ -915,6 +936,7 @@
{
"id": "bad87fee1348bd9aedf08815",
"name": "Waypoint: Make Circular Images with a Border Radius",
+ "dashedName": "waypoint-make-circular-images-with-a-border-radius",
"difficulty": 0.030,
"description": [
"Give your cat photo a border-radius
of 50%.",
@@ -973,6 +995,7 @@
{
"id": "bad87fee1348bd9aedf08816",
"name": "Waypoint: Link to External Pages with Anchor Elements",
+ "dashedName": "waypoint-link-to-external-pages-with-anchor-elements",
"difficulty": 0.031,
"description": [
"Create an a
element, or \"anchor element\", that links to http://catphotoapp.com and has \"cat photos\" as its link text, or \"anchor text\".",
@@ -1035,6 +1058,7 @@
{
"id": "bad87fee1348bd9aede08817",
"name": "Waypoint: Wrap an Anchor Element within a Paragraph",
+ "dashedName": "waypoint-wrap-an-anchor-element-within-a-paragraph",
"difficulty": 0.032,
"description": [
"Now wrap your a
element within a new p
element so that the surrounding paragraph says \"click here for cat photos\", but where only \"cat photos\" is a link - the rest is plain text.",
@@ -1103,6 +1127,7 @@
{
"id": "bad87fee1348bd9aedf08817",
"name": "Waypoint: Make Dead Links using the Hash Symbol",
+ "dashedName": "waypoint-make-dead-links-using-the-hash-symbol",
"difficulty": 0.033,
"description": [
"Use the hash symbol (#) to turn your a
element's link into a dead link.",
@@ -1165,6 +1190,7 @@
{
"id": "bad87fee1348bd9aedf08820",
"name": "Waypoint: Turn an Image into a Link",
+ "dashedName": "waypoint-turn-an-image-into-a-link",
"difficulty": 0.034,
"description": [
"Wrap your img
element inside an a
element with a dead link.",
@@ -1230,6 +1256,7 @@
{
"id": "bad87fee1348bd9aedf08818",
"name": "Waypoint: Add Alt Text to an Image for Accessibility",
+ "dashedName": "waypoint-add-alt-text-to-an-image-for-accessibility",
"difficulty": 0.035,
"description": [
"Add an alt
attribute with the text \"A cute orange cat lying on its back\" to our cat photo.",
@@ -1293,6 +1320,7 @@
{
"id": "bad87fee1348bd9aedf08827",
"name": "Waypoint: Create a Bulleted Unordered List",
+ "dashedName": "waypoint-create-a-bulleted-unordered-list",
"difficulty": 0.036,
"description": [
"Replace your p
elements with an unordered list of three things that cats love.",
@@ -1358,6 +1386,7 @@
{
"id": "bad87fee1348bd9aedf08828",
"name": "Waypoint: Create an Ordered List",
+ "dashedName": "waypoint-create-an-ordered-list",
"difficulty": 0.037,
"description": [
"Create an ordered list of the top 3 things cats hate the most.",
@@ -1430,6 +1459,7 @@
{
"id": "bad87fee1348bd9aedf08829",
"name": "Waypoint: Create a Text Field",
+ "dashedName": "waypoint-create-a-text-field",
"difficulty": 0.038,
"description": [
"Now we'll create a web form. Create a text input under your lists.",
@@ -1501,6 +1531,7 @@
{
"id": "bad87fee1348bd9aedf08830",
"name": "Waypoint: Add Placeholder Text to a Text Field",
+ "dashedName": "waypoint-add-placeholder-text-to-a-text-field",
"difficulty": 0.039,
"description": [
"Set the placeholder
value of your text input
to \"cat photo URL\".",
@@ -1574,6 +1605,7 @@
{
"id": "bad87fee1348bd9aede08830",
"name": "Waypoint: Create a Form Element",
+ "dashedName": "waypoint-create-a-form-element",
"difficulty": 0.040,
"description": [
"Wrap your text field in a form
element. Add the action=\"/submit-cat-photo\"
attribute to this form element.",
@@ -1649,6 +1681,7 @@
{
"id": "bad87fee1348bd9aedd08830",
"name": "Waypoint: Add a Submit Button to a Form",
+ "dashedName": "waypoint-add-a-submit-button-to-a-form",
"difficulty": 0.041,
"description": [
"Add a submit button to your form
element with type \"submit\" and \"Submit\" as its text.",
@@ -1725,7 +1758,8 @@
},
{
"id": "bad87fee1348bd9aedc08830",
- "name": "Waypoint: Use HTML5 to Require a Field",
+ "name": "waypoint-use-html5-to-require-a-field",
+ "dashedName": "Waypoint: Use HTML5 to Require a Field",
"difficulty": 0.042,
"description": [
"Make your text input
a \"required\" field, so that your user can't submit the form without completing this field.",
@@ -1801,6 +1835,7 @@
{
"id": "bad87fee1348bd9aedf08834",
"name": "Waypoint: Create a Set of Radio Buttons",
+ "dashedName": "waypoint-create-a-set-of-radio-buttons",
"difficulty": 0.043,
"description": [
"Add to your form a pair of radio buttons. Each radio button should be wrapped within its own label
element. They should share a common name
attribute. One should have the option of \"indoor\" and the other should have the option of \"outdoor\".",
@@ -1884,6 +1919,7 @@
{
"id": "bad87fee1348bd9aedf08835",
"name": "Waypoint: Create a Set of Checkboxes",
+ "dashedName": "waypoint-create-a-set-of-checkboxes",
"difficulty": 0.044,
"description": [
"Add to your form a set of three checkbox elements. Each checkbox should be wrapped within its own label
element. All three should share the name
attribute of \"personality\".",
@@ -1964,6 +2000,7 @@
{
"id": "bad87fee1348bd9aede18835",
"name": "Waypoint: Clean up your form using Linebreaks",
+ "dashedName": "waypoint-clean-up-your-form-using-linebreaks",
"difficulty": 0.045,
"description": [
"Clean up your form by adding linebreaks between form elements.",
@@ -2043,6 +2080,7 @@
{
"id": "bad87fee1348bd9aedd08835",
"name": "Waypoint: Check Radio Buttons and Checkboxes by Default",
+ "dashedName": "waypoint-check-radio-buttons-and-checkboxes-by-default",
"difficulty": 0.046,
"description": [
"Set the first of your radio buttons and the first of your checkboxes to both be checked by default.",
@@ -2126,6 +2164,7 @@
{
"id": "bad87fee1348bd9aede08835",
"name": "Waypoint: Wrap Many Elements within a Single Div Element",
+ "dashedName": "waypoint-wrap-many-elements-within-a-single-div-element",
"difficulty": 0.047,
"description": [
"Wrap your \"Things cats love\" and \"Things cats hate\" lists all within a single div
element.",
@@ -2214,6 +2253,7 @@
{
"id": "bad87fee1348bd9aede07836",
"name": "Waypoint: Give a Background Color to a Div Element",
+ "dashedName": "waypoint-give-a-background-color-to-a-div-element",
"difficulty": 0.048,
"description": [
"Create a class called \"gray-background\" with the background color of gray. Assign this class to your div
element.",
@@ -2300,6 +2340,7 @@
{
"id": "bad88fee1348bd9aedf08825",
"name": "Waypoint: Adjusting the Padding of an Element",
+ "dashedName": "waypoint-adjusting-the-padding-of-an-element",
"difficulty": 0.064,
"description": [
"These next few Waypoints will give you a brief tour of three important aspects of the space surrounding HTML elements: padding
, margin
, and border
. Change the padding
of your green box to match that of your red box.",
@@ -2361,6 +2402,7 @@
{
"id": "bad87fee1348bd9aedf08822",
"name": "Waypoint: Adjust the Margin of an Element",
+ "dashedName": "waypoint-adjust-the-margin-of-an-element",
"difficulty": 0.065,
"description": [
"Change the margin
of the green box to match that of the red box.",
@@ -2424,6 +2466,7 @@
{
"id": "bad87fee1348bd9aedf08823",
"name": "Waypoint: Add a Negative Margin to an Element",
+ "dashedName": "waypoint-add-a-negative-margin-to-an-element",
"difficulty": 0.066,
"description": [
"Change the margin
of the green box to a negative value, so it fills the entire horizontal width of the yellow box around it.",
@@ -2486,6 +2529,7 @@
{
"id": "bad87fee1348bd9aedf08824",
"name": "Waypoint: Add Different Padding to Each Side of an Element",
+ "dashedName": "waypoint-add-different-padding-to-each-side-of-an-element",
"difficulty": 0.067,
"description": [
"Give the green box a padding
of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.",
@@ -2551,6 +2595,7 @@
{
"id": "bad87fee1248bd9aedf08824",
"name": "Waypoint: Add Different Margins to Each Side of an Element",
+ "dashedName": "waypoint-add-different-margins-to-each-side-of-an-element",
"difficulty": 0.068,
"description": [
"Give the green box a margin
of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.",
@@ -2616,6 +2661,7 @@
{
"id": "bad87fee1348bd9aedf08826",
"name": "Waypoint: Use Clockwise Notation to Specify the Padding of an Element",
+ "dashedName": "waypoint-use-clockwise-notation-to-specify-the-padding-of-an-element",
"difficulty": 0.069,
"description": [
"Use Clockwise Notation to give the \".green-box\" class a padding
of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.",
@@ -2678,6 +2724,7 @@
{
"id": "bad87fee1348bd9aedf08726",
"name": "Waypoint: Use Clockwise Notation to Specify the Margin of an Element",
+ "dashedName": "waypoint-use-clockwise-notation-to-specify-the-margin-of-an-element",
"difficulty": 0.070,
"description": [
"Let's try this again, but with margin
this time. Use Clockwise Notation
to give an element a margin of 40 pixels on its top and left side, but only 20 pixels on its bottom and right side.",
diff --git a/challenges/basic-javascript.json b/challenges/basic-javascript.json
index 2de8349186..e7fe614659 100644
--- a/challenges/basic-javascript.json
+++ b/challenges/basic-javascript.json
@@ -5,6 +5,7 @@
{
"id": "bd7129d8c441eddfaeb5bdef",
"name": "Waypoint: Build an Adventure Game",
+ "dashedName": "waypoint-build-an-adventure-game",
"difficulty": 0.24,
"challengeSeed": ["114604814"],
"description": [
@@ -30,6 +31,7 @@
{
"id": "bd7130d8c441eddfaeb5bdef",
"name": "Waypoint: Build Rock Paper Scissors",
+ "dashedName": "waypoint-build-rock-paper-scissors",
"difficulty": 0.25,
"challengeSeed": ["114604815"],
"description": [
@@ -53,6 +55,7 @@
{
"id": "bd7131d8c441eddfaeb5bdef",
"name": "Waypoint: Learn JavaScript For Loops",
+ "dashedName": "waypoint-learn-javascript-for-loops",
"difficulty": 0.26,
"challengeSeed": ["114614220"],
"description": [
@@ -76,6 +79,7 @@
{
"id": "bd7132d8c441eddfaeb5bdef",
"name": "Waypoint: Learn JavaScript While Loops",
+ "dashedName": "waypoint-learn-javascript-while-loops",
"difficulty": 0.27,
"challengeSeed": ["114612889"],
"description": [
@@ -98,6 +102,7 @@
{
"id": "bd7133d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Control Flow",
+ "dashedName": "waypoint-learn-control-flow",
"difficulty": 0.28,
"challengeSeed": ["114612888"],
"description": [
@@ -122,6 +127,7 @@
{
"id": "bd7134d8c441eddfaeb5bdef",
"name": "Waypoint: Build a Contact List",
+ "dashedName": "waypoint-build-a-contact-list",
"difficulty": 0.29,
"challengeSeed": ["114612887"],
"description": [
@@ -145,6 +151,7 @@
{
"id": "bd7135d8c441eddfaeb5bdef",
"name": "Waypoint: Build an Address Book",
+ "dashedName": "waypoint-build-an-address-book",
"difficulty": 0.30,
"challengeSeed": ["114612885"],
"description": [
@@ -168,6 +175,7 @@
{
"id": "bd7136d8c441eddfaeb5bdef",
"name": "Waypoint: Build a Cash Register",
+ "dashedName": "waypoint-build-a-cash-register",
"difficulty": 0.31,
"challengeSeed": ["114612882"],
"description": [
@@ -191,6 +199,7 @@
{
"id": "bd7118d8c441eddfaeb5bdef",
"name": "Waypoint: Discover Chrome DevTools",
+ "dashedName": "waypoint-discover-chrome-devTools",
"difficulty": 0.32,
"challengeSeed": ["110752743"],
"description": [
@@ -222,6 +231,7 @@
{
"id": "bd7138d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Regular Expressions",
+ "dashedName": "waypoint-learn-regular-expressions",
"difficulty": 0.33,
"challengeSeed": ["112547802"],
"description": [
diff --git a/challenges/bootstrap.json b/challenges/bootstrap.json
index 0f6b940b2f..eeac669f73 100644
--- a/challenges/bootstrap.json
+++ b/challenges/bootstrap.json
@@ -5,6 +5,7 @@
{
"id": "bad87fee1348bd9acde08812",
"name": "Waypoint: Mobile Responsive Images",
+ "dashedName": "waypoint-mobile-responsive-images",
"difficulty": 0.047,
"description": [
"Now let's go back to our Cat Photo App. This time, we'll style it using the popular Twitter Bootstrap responsive CSS framework. First, add a new image with the src
attribute of \"http://bit.ly/fcc-kittens2\", and add the \"img-responsive\" Bootstrap class to that image.",
@@ -91,6 +92,7 @@
{
"id": "bad87fee1348bd8acde08812",
"name": "Waypoint: Center Text with Bootstrap",
+ "dashedName": "waypoint-center-text-with-bootstrap",
"difficulty": 0.048,
"description": [
"Add Bootstrap's \"text-center\" class to your h2
element.",
@@ -174,6 +176,7 @@
{
"id": "bad87fee1348cd8acdf08812",
"name": "Waypoint: Create a Bootstrap Button",
+ "dashedName": "waypoint-create-a-bootstrap-button",
"difficulty": 0.049,
"description": [
"Create a new button
element below your large kitten photo. Give it the class \"btn\" and the text of \"like this photo\".",
@@ -258,6 +261,7 @@
{
"id": "bad87fee1348cd8acef08812",
"name": "Waypoint: Create a Block Element Bootstrap Button",
+ "dashedName": "waypoint-create-a-block-element-bootstrap-button",
"difficulty": 0.050,
"description": [
"Add Bootstrap's \"btn-block\" class to your Bootstrap button.",
@@ -346,6 +350,7 @@
{
"id": "bad87fee1348cd8acef08811",
"name": "Waypoint: Taste the Bootstrap Button Color Rainbow",
+ "dashedName": "waypoint-taste-the-bootstrap-button-color-rainbow",
"difficulty": 0.051,
"description": [
"Add Bootstrap's \"btn-primary\" class to your button.",
@@ -432,6 +437,7 @@
{
"id": "bad87fee1348cd8acef08813",
"name": "Waypoint: Call out Optional Actions with Button Info",
+ "dashedName": "waypoint-call-out-optional-actions-with-button-info",
"difficulty": 0.052,
"description": [
"Create a new block-level Bootstrap button below your \"Like\" button with the text \"Info\", and add Bootstrap's \"btn-info\" and \"btn-block\" classes to it.",
@@ -519,6 +525,7 @@
{
"id": "bad87fee1348ce8acef08814",
"name": "Waypoint: Warn your Users of a Dangerous Action",
+ "dashedName": "waypoint-warn-your-users-of-a-dangerous-action",
"difficulty": 0.053,
"description": [
"Create a button with the text \"Delete\" and give it the class \"btn-danger\".",
@@ -607,6 +614,7 @@
{
"id": "bad88fee1348ce8acef08815",
"name": "Waypoint: Use the Bootstrap Grid to Put Elements Side By Side",
+ "dashedName": "waypoint-use-the-bootstrap-grid-to-put-elements-side-by-side",
"difficulty": 0.054,
"description": [
"Put the \"Like\", \"Info\" and \"Delete\" buttons side-by-side by wrapping all three of them within one <div class=\"row\">
element, then each of them within a <div class=\"col-xs-4\">
element.",
@@ -700,6 +708,7 @@
{
"id": "bad87fee1348bd9aedf08845",
"name": "Waypoint: Ditch Custom CSS for Bootstrap",
+ "dashedName": "waypoint-ditch-custom-css-for-bootstrap",
"difficulty": 0.055,
"description": [
"Delete the \".red-text\", \"p\", and \".smaller-image\" CSS declarations from your style
element so that the only declarations left in your style
element are \"h2\" and \"thick-green-border\". Then Delete the p
element that contains a dead link. Then remove the \"red-text\" class from your h2
element and replace it with the \"text-primary\" Bootstrap class. Finally, remove the \"smaller-image\" class from your first img
element and replace it with the img-responsive
class.",
@@ -799,6 +808,7 @@
{
"id": "bad87fee1348bd9aede08845",
"name": "Waypoint: Create a Custom Heading",
+ "dashedName": "waypoint-create-a-custom-heading",
"difficulty": 0.056,
"description": [
"Wrap your first image and your h2
element within a single <div class='row'>
element. Wrap your h2
text within a <div class='col-xs-8'>
and your image in a <div class='col-xs-4'>
so that they are on the same line.",
@@ -888,6 +898,7 @@
{
"id": "bad87fee1348bd9aedd08845",
"name": "Waypoint: Add Font Awesome Icons to our Buttons",
+ "dashedName": "waypoint-add-font-awesome-icons-to-our-buttons",
"difficulty": 0.057,
"description": [
"Use Font Awesome to add a \"thumbs-up\" icon to your like button by giving it a i
element with the classes \"fa\" and \"fa-thumbs-up\".",
@@ -974,7 +985,8 @@
},
{
"id": "bad87fee1348bd9aedc08845",
- "name": "Waypoint: Add Font Awesome Icons all of our Buttons",
+ "name": "Waypoint: Add Font Awesome Icons to all of our Buttons",
+ "dashedName": "waypoint-add-font-awesome-icons-to-all-of-our-Buttons",
"difficulty": 0.058,
"description": [
"Use Font Awesome to add a \"info-circle\" icon to your info button and a \"trash\" icon to your delete button.",
@@ -1062,6 +1074,7 @@
{
"id": "bad87fee1348bd9aedb08845",
"name": "Waypoint: Responsively Style Radio Buttons",
+ "dashedName": "waypoint-responsively-style-radio-buttons",
"difficulty": 0.059,
"description": [
"Wrap all of your radio buttons within a <div class='row'>
element. Then wrap each of them within a <div class='col-xs-6'>
element.",
@@ -1148,6 +1161,7 @@
{
"id": "bad87fee1348bd9aeda08845",
"name": "Waypoint: Responsively Style Checkboxes",
+ "dashedName": "waypoint-responsively-style-checkboxes",
"difficulty": 0.060,
"description": [
"Wrap all your checkboxes in a <div class='row'>
element. Then wrap each of them in a <div class='col-xs-4'>
element.",
@@ -1241,6 +1255,7 @@
{
"id": "bad87fee1348bd9aed908845",
"name": "Waypoint: Style Text Inputs as Form Controls",
+ "dashedName": "waypoint-style-text-inputs-as-form-controls",
"difficulty": 0.061,
"description": [
"Give your form's text input field a class of \"form-control\". Give your form's submit button the classes \"btn btn-primary\". Also give this button the Font Awesome icon of \"fa-paper-plane\".",
@@ -1344,6 +1359,7 @@
{
"id": "bad87fee1348bd9aec908845",
"name": "Waypoint: Line up Form Elements Responsively with Bootstrap",
+ "dashedName": "waypoint-line-up-form-elements-responsively-with-bootstrap",
"difficulty": 0.062,
"description": [
"Now let's get your form input
and your submission button
on the same line. We'll do this the same way we have previously: by using a div
element with the class \"row\", and other div
elements within it using the \"col-xs-*\" class.",
diff --git a/challenges/computer-science.json b/challenges/computer-science.json
index 25d4565ebd..7f2a11b91d 100644
--- a/challenges/computer-science.json
+++ b/challenges/computer-science.json
@@ -5,6 +5,7 @@
{
"id": "bd7123d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Basic Computer Science",
+ "dashedName": "waypoint-learn-basic-computer-science",
"difficulty": 0.90,
"challengeSeed": ["114628241"],
"description": [
@@ -34,6 +35,7 @@
{
"id": "bd8124d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Loops",
+ "dashedName": "waypoint-learn-loops",
"difficulty": 0.19,
"challengeSeed": ["114597348"],
"description": [
@@ -61,6 +63,7 @@
{
"id": "bd8125d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Computer Hardware",
+ "dashedName": "waypoint-learn-computer-hardware",
"difficulty": 0.20,
"challengeSeed": ["114597347"],
"description": [
@@ -88,6 +91,7 @@
{
"id": "bd8126d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Computer Networking",
+ "dashedName": "waypoint-learn-computer-networking",
"difficulty": 0.21,
"challengeSeed": ["114604811"],
"description": [
@@ -115,6 +119,7 @@
{
"id": "bd8127d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Boolean Logic",
+ "dashedName": "waypoint-learn-boolean-logic",
"difficulty": 0.22,
"challengeSeed": ["114604812"],
"description": [
@@ -142,6 +147,7 @@
{
"id": "bd8128d8c441eddfaeb5bdef",
"name": "Waypoint: Learn Computer Security",
+ "dashedName": "waypoint-learn-computer-security",
"difficulty": 0.23,
"challengeSeed": ["114604813"],
"description": [
diff --git a/challenges/full-stack-javascript.json b/challenges/full-stack-javascript.json
index 4a91042a8c..cbc08ba740 100644
--- a/challenges/full-stack-javascript.json
+++ b/challenges/full-stack-javascript.json
@@ -5,6 +5,7 @@
{
"id": "bd7154d8c441eddfaeb5bdef",
"name": "Waypoint: Get Started with Angular.js",
+ "dashedName": "waypoint-get-started-with-angularjs",
"difficulty": 0.34,
"challengeSeed": ["114684726"],
"description": [
@@ -28,6 +29,7 @@
{
"id": "bd7155d8c441eddfaeb5bdef",
"name": "Waypoint: Apply Angular.js Directives",
+ "dashedName": "waypoint-apply-angularjs-directives",
"difficulty": 0.35,
"challengeSeed": ["114684727"],
"description": [
@@ -51,6 +53,7 @@
{
"id": "bd7156d8c441eddfaeb5bdef",
"name": "Waypoint: Power Forms with Angular.js",
+ "dashedName": "waypoint-power-forms-with-angularjs",
"difficulty": 0.36,
"challengeSeed": ["114684729"],
"description": [
@@ -74,6 +77,7 @@
{
"id": "bd7157d8c441eddfaeb5bdef",
"name": "Waypoint: Customize Angular.js Directives",
+ "dashedName": "waypoint-customize-angularjs-directives",
"difficulty": 0.37,
"challengeSeed": ["114685062"],
"description": [
@@ -96,6 +100,7 @@
{
"id": "bd7158d8c441eddfaeb5bdef",
"name": "Waypoint: Create Angular.js Services",
+ "dashedName": "waypoint-create-angularjs-services",
"difficulty": 0.38,
"challengeSeed": ["114685060"],
"description": [
@@ -119,6 +124,7 @@
{
"id": "bd7153d8c441eddfaeb5bd0f",
"name": "Waypoint: Manage Packages with NPM",
+ "dashedName": "waypoint-manage-packages-with-npm",
"difficulty": 0.39,
"challengeSeed": ["126433450"],
"description": [
@@ -172,6 +178,7 @@
{
"id": "bd7153d8c441eddfaeb5bdff",
"name": "Waypoint: Start a Node.js Server",
+ "dashedName": "waypoint-start-a-nodejs-server",
"difficulty": 0.40,
"challengeSeed": ["126411561"],
"description": [
@@ -214,6 +221,7 @@
{
"id": "bd7153d8c441eddfaeb5bdfe",
"name": "Waypoint: Continue working with Node.js Servers",
+ "dashedName": "waypoint-continue-working-with-nodejs-servers",
"difficulty": 0.41,
"challengeSeed": ["128836506"],
"description": [
@@ -241,6 +249,7 @@
{
"id": "bd7153d8c441eddfaeb5bdfd",
"name": "Waypoint: Finish working with Node.js Servers",
+ "dashedName": "waypoint-finish-working-with-nodejs-servers",
"difficulty": 0.42,
"challengeSeed": ["128836507"],
"description": [
@@ -268,6 +277,7 @@
{
"id": "bd7153d8c441eddfaeb5bd1f",
"name": "Waypoint: Build Web Apps with Express.js",
+ "dashedName": "waypoint-build-web-apps-with-expressjs",
"difficulty": 0.43,
"challengeSeed": ["126411559"],
"description": [
@@ -309,6 +319,7 @@
{
"id": "bd7140d8c441eddfaeb5bdef",
"name": "Waypoint: Manage Source Code with Git",
+ "dashedName": "waypoint-manage-source-code-with-git",
"difficulty": 0.44,
"challengeSeed": ["114635309"],
"description": [
diff --git a/challenges/functional-programming.json b/challenges/functional-programming.json
index 868b626372..a7a60efdf9 100644
--- a/challenges/functional-programming.json
+++ b/challenges/functional-programming.json
@@ -5,6 +5,7 @@
{
"id": "bd7129d8c441eddfbeb5bddf",
"name": "Waypoint: Practice Functional Programming",
+ "dashedName": "waypoint-practice-functional-programming",
"difficulty": 0.01,
"challengeSeed": ["129169463"],
"description": [
diff --git a/challenges/get-set-for-free-code-camp.json b/challenges/get-set-for-free-code-camp.json
index ae7a694a94..83116e1c7f 100644
--- a/challenges/get-set-for-free-code-camp.json
+++ b/challenges/get-set-for-free-code-camp.json
@@ -5,6 +5,7 @@
{
"id": "bd7124d8c441eddfaeb5bdef",
"name": "Waypoint: Learn how Free Code Camp Works",
+ "dashedName": "waypoint-learn-how-free-code-camp-works",
"difficulty": 0.001,
"challengeSeed": ["125407438"],
"description": [
@@ -53,6 +54,7 @@
{
"id": "bd7125d8c441eddfaeb5bd0f",
"name": "Waypoint: Join Our Chat Room",
+ "dashedName": "waypoint-join-our-chat-room",
"difficulty": 0.002,
"challengeSeed": ["124555254"],
"description": [
@@ -107,6 +109,7 @@
{
"id": "bd7125d8c441eddfaeb5bdff",
"name": "Waypoint: Preview our Challenge Map",
+ "dashedName": "waypoint-preview-our-challenge-map",
"difficulty": 0.003,
"challengeSeed": ["125407437"],
"description": [
@@ -149,6 +152,7 @@
{
"id": "bd7125d8c441eddfaeb5bd1f",
"name": "Waypoint: Browse our Field Guide",
+ "dashedName": "waypoint-browse-our-field-guide",
"difficulty": 0.004,
"challengeSeed": ["125407435"],
"description": [
@@ -188,6 +192,7 @@
{
"id": "bd7125d8c441eddfaeb5bd2f",
"name": "Waypoint: Customize your Portfolio Page",
+ "dashedName": "waypoint-customize-your-portfolio-page",
"difficulty": 0.005,
"challengeSeed": ["125407433"],
"description": [
@@ -233,6 +238,7 @@
{
"id": "bd7126d8c441eddfaeb5bd3f",
"name": "Waypoint: Try Camper News",
+ "dashedName": "waypoint-try-camper-news",
"difficulty": 0.006,
"challengeSeed": ["124553410"],
"description": [
@@ -284,6 +290,7 @@
{
"id": "bd7126d8c441eddfaeb5bd3e",
"name": "Waypoint: Meet Other Campers in your City",
+ "dashedName": "waypoint-meet-other-campers-in-your-city",
"difficulty": 0.007,
"challengeSeed": ["127358841"],
"description": [
@@ -332,6 +339,7 @@
{
"id": "bd7137d8c441eddfaeb5bdef",
"name": "Waypoint: Get Help the Hacker Way with RSAP",
+ "dashedName": "waypoint-get-help-the-hacker-way-with-rsap",
"difficulty": 0.008,
"challengeSeed": ["125407432"],
"description": [
diff --git a/challenges/intermediate-bonfires.json b/challenges/intermediate-bonfires.json
index 3c5bf35928..f0e25cb698 100644
--- a/challenges/intermediate-bonfires.json
+++ b/challenges/intermediate-bonfires.json
@@ -5,6 +5,7 @@
{
"id": "a2f1d72d9b908d0bd72bb9f6",
"name": "Bonfire: Make a Person",
+ "dashedName": "bonfire-make-a-person",
"difficulty": "3.01",
"description": [
"Fill in the object constructor with the methods specified in the tests.",
@@ -56,6 +57,7 @@
{
"id": "af4afb223120f7348cdfc9fd",
"name": "Bonfire: Map the Debris",
+ "dashedName": "bonfire-map-the-debris",
"difficulty": "3.02",
"description": [
"Return a new array that transforms the element's average altitude into their orbital periods.",
@@ -96,6 +98,7 @@
{
"id": "a3f503de51cfab748ff001aa",
"name": "Bonfire: Pairwise",
+ "dashedName": "bonfire-pairwise",
"difficulty": "3.03",
"description": [
"Return the sum of all indices of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, return the smallest sum. Once an element has been used, it cannot be reused to pair with another.",
diff --git a/challenges/jquery-ajax-and-json.json b/challenges/jquery-ajax-and-json.json
index a03cb7e7cb..e33edc39b6 100644
--- a/challenges/jquery-ajax-and-json.json
+++ b/challenges/jquery-ajax-and-json.json
@@ -5,6 +5,7 @@
{
"id": "bd7112d8c441eddfaeb5bded",
"name": "Waypoint: Get Started with jQuery",
+ "dashedName": "waypoint-get-started-with-jquery",
"difficulty": 0.13,
"challengeSeed": ["125671865"],
"description": [
@@ -30,6 +31,7 @@
{
"id": "bd7113d8c441eddfaeb5bdef",
"name": "Waypoint: Write Functions with jQuery",
+ "dashedName": "waypoint-write-functions-with-jquery",
"difficulty": 0.14,
"challengeSeed": ["125658029"],
"description": [
@@ -54,6 +56,7 @@
{
"id": "bd7114d8c441eddfaeb5bdef",
"name": "Waypoint: Harness Dynamic HTML",
+ "dashedName": "waypoint-harness-dynamic-html",
"difficulty": 0.15,
"challengeSeed": ["125658028"],
"description": [
@@ -77,6 +80,7 @@
{
"id": "bd7115d8c441eddfaeb5bdef",
"name": "Waypoint: Listen for jQuery Events",
+ "dashedName": "waypoint-listen-for-jquery-events",
"difficulty": 0.16,
"challengeSeed": ["125658027"],
"description": [
@@ -100,6 +104,7 @@
{
"id": "bd7116d8c441eddfaeb5bdef",
"name": "Waypoint: Trigger jQuery Effects",
+ "dashedName": "waypoint-trigger-jquery-effects",
"difficulty": 0.17,
"challengeSeed": ["125658025"],
"description": [
diff --git a/challenges/object-oriented-javascript.json b/challenges/object-oriented-javascript.json
index 75d0f83836..2817126e2f 100644
--- a/challenges/object-oriented-javascript.json
+++ b/challenges/object-oriented-javascript.json
@@ -5,6 +5,7 @@
{
"id": "bd7129d8c441eddfaeb5bddf",
"name": "Waypoint: Scope Your Variables",
+ "dashedName": "waypoint-scope-your-variables",
"difficulty": 0.01,
"challengeSeed": ["128836683"],
"description": [
@@ -31,6 +32,7 @@
{
"id": "bd7131d8c441eddfaeb5bdbf",
"name": "Waypoint: Reference your Current Object with This",
+ "dashedName": "waypoint-reference-your-current-object-with-this",
"difficulty": 0.03,
"challengeSeed": ["128836508"],
"description": [
@@ -57,6 +59,7 @@
{
"id": "bd7132d8c441eddfaeb5bdaf",
"name": "Waypoint: Traverse the Prototype Chain",
+ "dashedName": "waypoint-traverse-the-prototype-chain",
"difficulty": 0.04,
"challengeSeed": ["128836684"],
"description": [
@@ -82,6 +85,7 @@
{
"id": "bd7133d8c441eddfaeb5bd0f",
"name": "Waypoint: Reuse Code with Decorators",
+ "dashedName": "waypoint-reuse-code-with-decorators",
"difficulty": 0.05,
"challengeSeed": ["128836681"],
"description": [
@@ -108,6 +112,7 @@
{
"id": "bd7134d8c441eddfaeb5bd1f",
"name": "Waypoint: Build Objects with Functional Classes",
+ "dashedName": "waypoint-build-objects-with-functional-classes",
"difficulty": 0.06,
"challengeSeed": ["128836503"],
"description": [
@@ -134,6 +139,7 @@
{
"id": "bd7135d8c441eddfaeb5bd2f",
"name": "Waypoint: Build Objects with Prototypal Classes",
+ "dashedName": "waypoint-build-objects-with-prototypal-classes",
"difficulty": 0.07,
"challengeSeed": ["128836505"],
"description": [
@@ -160,6 +166,7 @@
{
"id": "bd7136d8c441eddfaeb5bd3f",
"name": "Waypoint: Understand Pseudoclassical Patterns",
+ "dashedName": "waypoint-understand-pseudoclassical-patterns",
"difficulty": 0.08,
"challengeSeed": ["128836689"],
"description": [
@@ -186,6 +193,7 @@
{
"id": "bd7136d8c441eddfaeb5bd4f",
"name": "Waypoint: Subclass one Object to Another",
+ "dashedName": "waypoint-subclass-one-object-to-another",
"difficulty": 0.09,
"challengeSeed": ["128836686"],
"description": [
@@ -211,6 +219,7 @@
{
"id": "bd7136d8c441eddfaeb5bd5f",
"name": "Waypoint: Use Pseudoclassical Subclasses",
+ "dashedName": "waypoint-use-pseudoclassical-subclasses",
"difficulty": 0.10,
"challengeSeed": ["128836937"],
"description": [
diff --git a/challenges/ziplines.json b/challenges/ziplines.json
index 4382f84e6c..f61a96280e 100644
--- a/challenges/ziplines.json
+++ b/challenges/ziplines.json
@@ -5,6 +5,7 @@
{
"id": "bd7158d8c442eddfbeb5bd1f",
"name": "Waypoint: Get Set for Ziplines",
+ "dashedName": "waypoint-get-set-for-ziplines",
"difficulty": 1.00,
"challengeSeed": ["125658022"],
"description": [
@@ -39,6 +40,7 @@
{
"id": "bd7158d8c442eddfaeb5bd1f",
"name": "Zipline: Use the Twitch.tv JSON API",
+ "dashedName": "zipline-use-the-twitchtv-json-api",
"difficulty": 1.01,
"challengeSeed": ["126411564"],
"description": [
@@ -74,6 +76,7 @@
{
"id": "bd7158d8c442eddfaeb5bd13",
"name": "Zipline: Build a Random Quote Machine",
+ "dashedName": "zipline-build-a-random-quote-machine",
"difficulty": 1.02,
"challengeSeed": ["126415122"],
"description": [
@@ -104,6 +107,7 @@
{
"id": "bd7158d8c442eddfaeb5bd10",
"name": "Zipline: Show the Local Weather",
+ "dashedName": "zipline-show-the-local-weather",
"difficulty": 1.03,
"challengeSeed": ["126415127"],
"description": [
@@ -136,6 +140,7 @@
{
"id": "bd7158d8c442eddfaeb5bd18",
"name": "Zipline: Stylize Stories on Camper News",
+ "dashedName": "zipline-stylize-stories-on-camper-news",
"difficulty": 1.04,
"challengeSeed": ["126415129"],
"description": [
@@ -168,7 +173,8 @@
},
{
"id": "bd7158d8c442eddfaeb5bd19",
- "name": "Zipline: Wikipedia Viewer",
+ "name": "zipline-wikipedia-viewer",
+ "dashedName": "Zipline: Wikipedia Viewer",
"difficulty": 1.05,
"challengeSeed": ["126415131"],
"description": [
@@ -201,6 +207,7 @@
{
"id": "bd7158d8c442eddfaeb5bd0f",
"name": "Zipline: Build a Pomodoro Clock",
+ "dashedName": "zipline-build-a-pomodoro-clock",
"difficulty": 1.06,
"challengeSeed": ["126411567"],
"description": [
@@ -232,6 +239,7 @@
{
"id": "bd7158d8c442eddfaeb5bd17",
"name": "Zipline: Build a JavaScript Calculator",
+ "dashedName": "zipline-build-a-javascript-calculator",
"difficulty": 1.07,
"challengeSeed": ["126411565"],
"description": [
@@ -263,6 +271,7 @@
{
"id": "bd7158d8c442eddfaeb5bd1c",
"name": "Zipline: Build a Tic Tac Toe Game",
+ "dashedName": "zipline-build-a-tic-tac-toe-game",
"difficulty": 1.08,
"challengeSeed": ["126415123"],
"description": [
diff --git a/flattenUser.js b/flattenUser.js
index f919d6b471..fad529cea3 100644
--- a/flattenUser.js
+++ b/flattenUser.js
@@ -1,12 +1,21 @@
/* eslint-disable no-process-exit */
require('dotenv').load();
-var assign = require('lodash/object/assign'),
- Rx = require('rx'),
+var Rx = require('rx'),
+ uuid = require('node-uuid'),
+ assign = require('lodash/object/assign'),
mongodb = require('mongodb'),
secrets = require('../config/secrets');
var MongoClient = mongodb.MongoClient;
+var providers = [
+ 'facebook',
+ 'twitter',
+ 'google',
+ 'github',
+ 'linkedin'
+];
+
function createConnection(URI) {
return Rx.Observable.create(function(observer) {
MongoClient.connect(URI, function(err, database) {
@@ -27,11 +36,14 @@ function createQuery(db, collection, options, batchSize) {
// or schedule getting next batch on nextTick
cursor.each(function (err, doc) {
if (err) {
+ console.log(err);
return observer.onError(err);
}
if (!doc) {
+ console.log('hit complete');
return observer.onCompleted();
}
+ console.log('calling onnext');
observer.onNext(doc);
});
@@ -48,6 +60,7 @@ function insertMany(db, collection, users, options) {
if (err) {
return observer.onError(err);
}
+ observer.onNext();
observer.onCompleted();
});
});
@@ -56,7 +69,8 @@ function insertMany(db, collection, users, options) {
var count = 0;
// will supply our db object
var dbObservable = createConnection(secrets.db).shareReplay();
-dbObservable
+
+var users = dbObservable
.flatMap(function(db) {
// returns user document, n users per loop where n is the batchsize.
return createQuery(db, 'users', {});
@@ -66,7 +80,17 @@ dbObservable
assign(user, user.portfolio, user.profile);
return user;
})
- // batch them into arrays of twenty documents
+ .map(function(user) {
+ if (user.username) {
+ return user;
+ }
+ user.username = 'fcc' + uuid.v4().slice(0, 8);
+ return user;
+ })
+ .shareReplay();
+
+// batch them into arrays of twenty documents
+var userSavesCount = users
.bufferWithCount(20)
// get bd object ready for insert
.withLatestFrom(dbObservable, function(users, db) {
@@ -77,16 +101,53 @@ dbObservable
})
.flatMap(function(dats) {
// bulk insert into new collection for loopback
+ console.log(dats);
return insertMany(dats.db, 'user', dats.users, { w: 1 });
})
// count how many times insert completes
- .count()
+ .count();
+
+// create User Identities
+var userIdentityCount = users
+ .flatMap(function(user) {
+ var ids = providers
+ .map(function(provider) {
+ return {
+ provider: provider,
+ externalId: user[provider],
+ userId: user.id
+ };
+ })
+ .filter(function(ident) {
+ return !!ident.externalId;
+ });
+
+ return Rx.Observable.from(ids);
+ })
+ .bufferWithCount(20)
+ .withLatestFrom(dbObservable, function(identities, db) {
+ return {
+ identities: identities,
+ db: db
+ };
+ })
+ .flatMap(function(dats) {
+ // bulk insert into new collection for loopback
+ return insertMany(dats.db, 'userIdentity', dats.identities, { w: 1 });
+ })
+ // count how many times insert completes
+ .count();
+
+Rx.Observable.merge(
+ userIdentityCount,
+ userSavesCount
+)
.subscribe(
function(_count) {
- count = _count * 20;
+ count += _count * 20;
},
function(err) {
- console.log('an error occured', err);
+ console.log('an error occured', err, err.stack);
},
function() {
console.log('finished with %s documents processed', count);
diff --git a/future-jquery-ajax-json.json b/future-jquery-ajax-json.json
index 97d0504f04..2a3a5d9cd7 100644
--- a/future-jquery-ajax-json.json
+++ b/future-jquery-ajax-json.json
@@ -1,73 +1,231 @@
{
"name": "jQuery, Ajax and JSON",
- "order" : 0.004,
- "challenges": [
- {
+ "order": 0.004,
+ "challenges": [{
"id": "bad87fee1348bd9acdd08826",
"name": "Waypoint: Learn how Script Tags and Document Ready Work",
"difficulty": 0.072,
"description": [
- "Test"
+ "We've simplified our Cat Photo App and removed our style
element. Add a script
element to your page and create a $(document).ready
function within it.",
+ "Add $(document).ready(function() {
to your script
element, and then close it on the following line with });
."
],
"tests": [
- "assert(typeof $('#target').attr('disabled') === 'undefined', 'Change the disabled attribute of the \"target\" button to false');",
- "expect($('#target')).to.exist()"
+ "assert(editor.match(/