@ -322,18 +322,46 @@ $(document).ready(function() {
|
||||
}
|
||||
|
||||
$('#nav-wiki-btn').on('click', function(event) {
|
||||
if (!(event.ctrlKey || event.metaKey)) {
|
||||
toggleWiki();
|
||||
}
|
||||
if (!(event.ctrlKey || event.metaKey)) {
|
||||
toggleWiki();
|
||||
}
|
||||
});
|
||||
|
||||
$('.wiki-aside-action-collapse').on('click', collapseWiki);
|
||||
|
||||
function getWikiPath() {
|
||||
if (!window.common) {
|
||||
return false;
|
||||
}
|
||||
var challengeType = window.common.challengeType;
|
||||
var dashedName = window.common.dashedName;
|
||||
var prefix = '';
|
||||
// Get wiki prefix depending on type of challenge
|
||||
// Type 0, 1 typically have solutions on the wiki prefixed with 'challenge-'
|
||||
// Type 5 typically has a solution on the wiki prefixed with algorithm-'
|
||||
if (challengeType === '0' || challengeType === '1') {
|
||||
prefix = 'challenge-';
|
||||
return prefix + dashedName;
|
||||
}
|
||||
if (challengeType === '5') {
|
||||
prefix = 'algorithm-';
|
||||
return prefix + dashedName;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function showWiki() {
|
||||
if (!main.isWikiAsideLoad) {
|
||||
var wikiURL = '//freecodecamp.github.io/wiki/en/';
|
||||
var lang = window.location.toString().match(/\/\w{2}\//);
|
||||
lang = (lang) ? lang[0] : '/en/';
|
||||
var wikiURL = '//freecodecamp.github.io/wiki' + lang;
|
||||
var wikiPath = getWikiPath();
|
||||
if (wikiPath) {
|
||||
wikiURL = wikiURL + wikiPath + '/';
|
||||
} else if (lang !== '/en/') {
|
||||
// Strip default '/en/' language ending and add the user's language
|
||||
wikiURL = wikiURL.substr(0, wikiURL.length - 4) + lang;
|
||||
}
|
||||
var wikiAside = $('<iframe>');
|
||||
wikiAside.attr({
|
||||
src: wikiURL,
|
||||
|
@ -6,6 +6,7 @@ import { createSelector } from 'reselect';
|
||||
import Lecture from './Lecture.jsx';
|
||||
import Questions from './Questions.jsx';
|
||||
import { resetHike } from '../redux/actions';
|
||||
import { updateTitle } from '../../../redux/actions';
|
||||
import { getCurrentHike } from '../redux/selectors';
|
||||
|
||||
const mapStateToProps = createSelector(
|
||||
@ -27,9 +28,15 @@ export class Hike extends React.Component {
|
||||
// ui
|
||||
title: PropTypes.string,
|
||||
params: PropTypes.object,
|
||||
shouldShowQuestions: PropTypes.bool
|
||||
shouldShowQuestions: PropTypes.bool,
|
||||
updateTitle: PropTypes.func
|
||||
};
|
||||
|
||||
componentWillMount() {
|
||||
const { updateTitle } = this.props;
|
||||
updateTitle(this.props.title);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.props.resetHike();
|
||||
}
|
||||
@ -71,4 +78,4 @@ export class Hike extends React.Component {
|
||||
}
|
||||
|
||||
// export redux aware component
|
||||
export default connect(mapStateToProps, { resetHike })(Hike);
|
||||
export default connect(mapStateToProps, { resetHike, updateTitle })(Hike);
|
||||
|
@ -6,7 +6,6 @@ import { createSelector } from 'reselect';
|
||||
// import debug from 'debug';
|
||||
|
||||
import HikesMap from './Map.jsx';
|
||||
import { updateTitle } from '../../../redux/actions';
|
||||
import { fetchHikes } from '../redux/actions';
|
||||
|
||||
import contain from '../../../utils/professor-x';
|
||||
@ -41,15 +40,9 @@ export class Hikes extends PureComponent {
|
||||
static propTypes = {
|
||||
children: PropTypes.element,
|
||||
hikes: PropTypes.array,
|
||||
params: PropTypes.object,
|
||||
updateTitle: PropTypes.func
|
||||
params: PropTypes.object
|
||||
};
|
||||
|
||||
componentWillMount() {
|
||||
const { updateTitle } = this.props;
|
||||
updateTitle('Hikes');
|
||||
}
|
||||
|
||||
renderMap(hikes) {
|
||||
return (
|
||||
<HikesMap hikes={ hikes }/>
|
||||
@ -73,6 +66,6 @@ export class Hikes extends PureComponent {
|
||||
|
||||
// export redux and fetch aware component
|
||||
export default compose(
|
||||
connect(mapStateToProps, { fetchHikes, updateTitle }),
|
||||
connect(mapStateToProps, { fetchHikes }),
|
||||
contain(fetchOptions)
|
||||
)(Hikes);
|
||||
|
@ -88,7 +88,7 @@ module.exports = function(User) {
|
||||
User.afterRemote('confirm', function(ctx) {
|
||||
ctx.req.flash('success', {
|
||||
msg: [
|
||||
'You\'re email has been confirmed!'
|
||||
'Your email has been confirmed!'
|
||||
]
|
||||
});
|
||||
ctx.res.redirect('/');
|
||||
@ -209,7 +209,7 @@ module.exports = function(User) {
|
||||
return res.redirect(redirectTo);
|
||||
}
|
||||
|
||||
req.flash('success', { msg: 'Success! You are logged in.' });
|
||||
req.flash('success', { msg: 'Success! You are now logged in.' });
|
||||
return res.redirect('/');
|
||||
});
|
||||
});
|
||||
|
@ -104,7 +104,7 @@
|
||||
"passport-local": "^1.0.0",
|
||||
"passport-oauth": "^1.0.0",
|
||||
"passport-twitter": "^1.0.3",
|
||||
"pmx": "~0.5.5",
|
||||
"pmx": "~0.6.2",
|
||||
"react": "^15.0.2",
|
||||
"react-bootstrap": "~0.29.4",
|
||||
"react-dom": "^15.0.2",
|
||||
|
@ -201,7 +201,7 @@
|
||||
"function updateInventory(arr1, arr2) {\n arr2.forEach(function(item) {\n createOrUpdate(arr1, item);\n });\n // All inventory must be accounted for or you're fired!\n return arr1;\n}\n\nfunction createOrUpdate(arr1, item) {\n var index = -1;\n while (++index < arr1.length) {\n if (arr1[index][1] === item[1]) {\n arr1[index][0] += item[0];\n return;\n }\n if (arr1[index][1] > item[1]) {\n break;\n }\n }\n arr1.splice(index, 0, item);\n}\n\n// Example inventory lists\nvar curInv = [\n [21, 'Bowling Ball'],\n [2, 'Dirty Sock'],\n [1, 'Hair Pin'],\n [5, 'Microphone']\n];\n\nvar newInv = [\n [2, 'Hair Pin'],\n [3, 'Half-Eaten Apple'],\n [67, 'Bowling Ball'],\n [7, 'Toothpaste']\n];\n\nupdateInventory(curInv, newInv);\n"
|
||||
],
|
||||
"tests": [
|
||||
"assert.isArray(updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [[2, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [67, \"Bowling Ball\"], [7, \"Toothpaste\"]]), 'message: <code>updateInventory()</code> should return an array.');",
|
||||
"assert.isArray(updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [[2, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [67, \"Bowling Ball\"], [7, \"Toothpaste\"]]), 'message: The function <code>updateInventory</code> should return an array.');",
|
||||
"assert.equal(updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [[2, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [67, \"Bowling Ball\"], [7, \"Toothpaste\"]]).length, 6, 'message: <code>updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [[2, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [67, \"Bowling Ball\"], [7, \"Toothpaste\"]]).length</code> should return an array with a length of 6.');",
|
||||
"assert.deepEqual(updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [[2, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [67, \"Bowling Ball\"], [7, \"Toothpaste\"]]), [[88, \"Bowling Ball\"], [2, \"Dirty Sock\"], [3, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [5, \"Microphone\"], [7, \"Toothpaste\"]], 'message: <code>updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [[2, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [67, \"Bowling Ball\"], [7, \"Toothpaste\"]])</code> should return <code>[[88, \"Bowling Ball\"], [2, \"Dirty Sock\"], [3, \"Hair Pin\"], [3, \"Half-Eaten Apple\"], [5, \"Microphone\"], [7, \"Toothpaste\"]]</code>.');",
|
||||
"assert.deepEqual(updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], []), [[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], 'message: <code>updateInventory([[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]], [])</code> should return <code>[[21, \"Bowling Ball\"], [2, \"Dirty Sock\"], [1, \"Hair Pin\"], [5, \"Microphone\"]]</code>.');",
|
||||
|
@ -459,7 +459,8 @@
|
||||
"assert.deepEqual(chunkArrayInGroups([0, 1, 2, 3, 4, 5], 2), [[0, 1], [2, 3], [4, 5]], 'message: <code>chunkArrayInGroups([0, 1, 2, 3, 4, 5], 2)</code> should return <code>[[0, 1], [2, 3], [4, 5]]</code>.');",
|
||||
"assert.deepEqual(chunkArrayInGroups([0, 1, 2, 3, 4, 5], 4), [[0, 1, 2, 3], [4, 5]], 'message: <code>chunkArrayInGroups([0, 1, 2, 3, 4, 5], 4)</code> should return <code>[[0, 1, 2, 3], [4, 5]]</code>.');",
|
||||
"assert.deepEqual(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3), [[0, 1, 2], [3, 4, 5], [6]], 'message: <code>chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3)</code> should return <code>[[0, 1, 2], [3, 4, 5], [6]]</code>.');",
|
||||
"assert.deepEqual(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 4), [[0, 1, 2, 3], [4, 5, 6, 7], [8]], 'message: <code>chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 4)</code> should return <code>[[0, 1, 2, 3], [4, 5, 6, 7], [8]]</code>.');"
|
||||
"assert.deepEqual(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 4), [[0, 1, 2, 3], [4, 5, 6, 7], [8]], 'message: <code>chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 4)</code> should return <code>[[0, 1, 2, 3], [4, 5, 6, 7], [8]]</code>.');",
|
||||
"assert.deepEqual(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2), [[0, 1], [2, 3], [4, 5], [6, 7], [8]], 'message: <code>chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2)</code> should return <code>[[0, 1], [2, 3], [4, 5], [6, 7], [8]]</code>.');"
|
||||
],
|
||||
"type": "bonfire",
|
||||
"isRequired": true,
|
||||
|
@ -642,8 +642,9 @@
|
||||
"var remainder = 11 % 3;"
|
||||
],
|
||||
"tests": [
|
||||
"assert(/var\\s+?remainder/.test(code), 'message: The variable <code>remainder</code> should be initialized');",
|
||||
"assert(remainder === 2, 'message: The value of <code>remainder</code> should be <code>2</code>');",
|
||||
"assert(/var\\s*?remainder\\s*?=\\s*?.*%.*;/.test(code), 'message: You should use the <code>%</code> operator');"
|
||||
"assert(/\\s+?remainder\\s*?=\\s*?.*%.*;/.test(code), 'message: You should use the <code>%</code> operator');"
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 1,
|
||||
@ -973,7 +974,7 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert(code.match(/\\\\\"/g).length === 4 && code.match(/[^\\\\]\"/g).length === 2, 'message: You should use two double quotes (<code>"</code>) and four escaped double quotes (<code>\"</code>).');",
|
||||
"assert(myStr === \"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\".\", 'message: Variable myStr should equal to (<code>I am a \"double quoted\" string inside \"double quotes\".</code>).');"
|
||||
"assert(myStr === \"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\".\", 'message: Variable myStr should contain the string: <code>I am a \"double quoted\" string inside \"double quotes\".</code>');"
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 1,
|
||||
@ -1738,7 +1739,7 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert((function(){if(typeof myArray != 'undefined' && myArray[0] == 3 && myArray[1] == 2 && myArray[2] == 3){return true;}else{return false;}})(), 'message: <code>myArray</code> should now be [3,2,3].');",
|
||||
"assert((function(){if(code.match(/myArray\\[0\\]\\s?=\\s?/g)){return true;}else{return false;}})(), 'message: You should be using correct index to modify the value in <code>myArray</code>.');"
|
||||
"assert((function(){if(code.match(/myArray\\[0\\]\\s*=\\s*/g)){return true;}else{return false;}})(), 'message: You should be using correct index to modify the value in <code>myArray</code>.');"
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 1,
|
||||
@ -3205,7 +3206,7 @@
|
||||
"function testElse(val) {\n var result = \"\";\n if(val > 5) {\n result = \"Bigger than 5\";\n } else {\n result = \"5 or Smaller\";\n }\n return result;\n}"
|
||||
],
|
||||
"tests": [
|
||||
"assert(code.match(/if/g).length === 1, 'message: You should only have one <code>if</code> statement');",
|
||||
"assert(code.match(/if/g).length === 1, 'message: You should only have one <code>if</code> statement in the editor');",
|
||||
"assert(/else/g.test(code), 'message: You should use an <code>else</code> statement');",
|
||||
"assert(testElse(4) === \"5 or Smaller\", 'message: <code>testElse(4)</code> should return \"5 or Smaller\"');",
|
||||
"assert(testElse(5) === \"5 or Smaller\", 'message: <code>testElse(5)</code> should return \"5 or Smaller\"');",
|
||||
@ -4583,7 +4584,7 @@
|
||||
"For loops are declared with three optional expressions separated by semicolons:",
|
||||
"<code>for ([initialization]; [condition]; [final-expression])</code>",
|
||||
"The <code>initialization</code> statement is executed one time only before the loop starts. It is typically used to define and setup your loop variable.",
|
||||
"The <code>condition</code> statement is evaluated at the beginning of every loop iteration and will continue as long as it evalutes to <code>true</code>. When <code>condition</code> is <code>false</code> at the start of the iteration, the loop will stop executing. This means if <code>condition</code> starts as <code>false</code>, your loop will never execute.",
|
||||
"The <code>condition</code> statement is evaluated at the beginning of every loop iteration and will continue as long as it evaluates to <code>true</code>. When <code>condition</code> is <code>false</code> at the start of the iteration, the loop will stop executing. This means if <code>condition</code> starts as <code>false</code>, your loop will never execute.",
|
||||
"The <code>final-expression</code> is executed at the end of each loop iteration, prior to the next <code>condition</code> check and is usually used to increment or decrement your loop counter.",
|
||||
"In the following example we initialize with <code>i = 0</code> and iterate while our condition <code>i < 5</code> is true. We'll increment <code>i</code> by <code>1</code> in each loop iteration with <code>i++</code> as our <code>final-expression</code>.",
|
||||
"<blockquote>var ourArray = [];<br>for (var i = 0; i < 5; i++) {<br> ourArray.push(i);<br>}</blockquote>",
|
||||
@ -5483,7 +5484,7 @@
|
||||
"assert(typeof(runSlots($(\".slot\"))[0]) === \"number\" && runSlots($(\".slot\"))[0] > 0 && runSlots($(\".slot\"))[0] < 4, '<code>slotOne</code> should be a random number.')",
|
||||
"assert(typeof(runSlots($(\".slot\"))[1]) === \"number\" && runSlots($(\".slot\"))[1] > 0 && runSlots($(\".slot\"))[1] < 4, '<code>slotTwo</code> should be a random number.')",
|
||||
"assert(typeof(runSlots($(\".slot\"))[2]) === \"number\" && runSlots($(\".slot\"))[2] > 0 && runSlots($(\".slot\"))[2] < 4, '<code>slotThree</code> should be a random number.')",
|
||||
"assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1/gi) !== null){return editor.match(/slot.*?=.*?\\(.*?\\).*?/gi).length >= 3;}else{return false;}})(), 'You should have used <code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code> three times to generate your random numbers.')"
|
||||
"assert((function(){if(editor.match(/Math\\.floor\\(\\s*Math\\.random\\(\\)\\s*\\*\\s*\\(\\s*3\\s*\\-\\s*1\\s*\\+\\s*1\\s*\\)\\s*\\)\\s*\\+\\s*1/gi) !== null){return editor.match(/slot.*?=.*?\\(.*?\\).*?/gi).length >= 3;}else{return false;}})(), 'You should have used <code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code> three times to generate your random numbers.')"
|
||||
],
|
||||
"type": "waypoint",
|
||||
"challengeType": 0,
|
||||
|
@ -4532,7 +4532,7 @@
|
||||
"</style>"
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'message: Your <code>body</code> element should have an black background.');",
|
||||
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'message: Your <code>body</code> element should have a black background.');",
|
||||
"assert(code.match(/rgb\\s*\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/ig), 'message: Use <code>rgb</code> to give your <code>body</code> element a color of black. For example <code>body { background-color: rgb(255, 165, 0); }</code>');"
|
||||
],
|
||||
"descriptionPtBR": [
|
||||
|
@ -587,8 +587,8 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert.deepEqual(spinalCase(\"This Is Spinal Tap\"), \"this-is-spinal-tap\", 'message: <code>spinalCase(\"This Is Spinal Tap\")</code> should return <code>\"this-is-spinal-tap\"</code>.');",
|
||||
"assert.strictEqual(spinalCase('thisIsSpinalTap'), \"this-is-spinal-tap\", 'message: <code>spinalCase(\"thisIsSpinalTap\")</code> should return <code>\"this-is-spinal-tap\"</code>.');",
|
||||
"assert.strictEqual(spinalCase(\"The_Andy_Griffith_Show\"), \"the-andy-griffith-show\", 'message: <code>spinalCase(\"The_Andy_Griffith_Show\")</code> should return <code>\"the-andy-griffith-show\"</code>.');",
|
||||
"assert.strictEqual(spinalCase('thisIsSpinalTap'), \"this-is-spinal-tap\", 'message: <code>spinalCase(\"thisIsSpinal<wbr>Tap\")</code> should return <code>\"this-is-spinal-tap\"</code>.');",
|
||||
"assert.strictEqual(spinalCase(\"The_Andy_Griffith_Show\"), \"the-andy-griffith-show\", 'message: <code>spinalCase(\"The_Andy_<wbr>Griffith_Show\")</code> should return <code>\"the-andy-griffith-show\"</code>.');",
|
||||
"assert.strictEqual(spinalCase(\"Teletubbies say Eh-oh\"), \"teletubbies-say-eh-oh\", 'message: <code>spinalCase(\"Teletubbies say Eh-oh\")</code> should return <code>\"teletubbies-say-eh-oh\"</code>.');",
|
||||
"assert.strictEqual(spinalCase(\"AllThe-small Things\"), \"all-the-small-things\", 'message: <code>spinalCase(\"AllThe-small Things\")</code> should return <code>\"all-the-small-things\"</code>.');"
|
||||
],
|
||||
|
@ -254,7 +254,7 @@
|
||||
],
|
||||
"tests": [
|
||||
"assert($(\"#target3\").hasClass(\"animated\"), 'message: Select the <code>button</code> element with the <code>id</code> of <code>target3</code> and use the jQuery <code>addClass()</code> function to give it the class of <code>animated</code>.');",
|
||||
"assert(($(\"#target3\").hasClass(\"fadeOut\") || $(\"#target3\").hasClass(\"fadeout\")) && code.match(/\\$\\(.#target3.\\)/g), 'message: Target the element with the id <code>target3</code> and use the jQuery <code>addClass()</code> function to give it the class <code>fadeOut</code>.');",
|
||||
"assert(($(\"#target3\").hasClass(\"fadeOut\") || $(\"#target3\").hasClass(\"fadeout\")) && code.match(/\\$\\(\\s*.#target3.\\s*\\)/g), 'message: Target the element with the id <code>target3</code> and use the jQuery <code>addClass()</code> function to give it the class <code>fadeOut</code>.');",
|
||||
"assert(!code.match(/class.*animated/g), 'message: Only use jQuery to add these classes to the element.');"
|
||||
],
|
||||
"type": "waypoint",
|
||||
|
@ -6,35 +6,41 @@
|
||||
"challenges": [
|
||||
{
|
||||
"id": "bd7153d8c441eddfaeb5bd0f",
|
||||
"title": "Manage Packages with NPM",
|
||||
"title": "Manage Packages with npm",
|
||||
"description": [
|
||||
"We'll build this Waypoint on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
|
||||
"If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
"If you don't already have a Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
|
||||
"Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
|
||||
"Click on Create New Workspace at the top right of the c9.io page, then click on the \"Create a new workspace\" popup that appears below it the button after you click on it.",
|
||||
"Give your workspace a name.",
|
||||
"Choose Node.js in the selection area below the name field.",
|
||||
"Click on the \"+\" icon at the top right of the c9.io page to create a new workspace.",
|
||||
"Give your workspace a name and an optional description.",
|
||||
"Choose \"Blank\" in the template section.",
|
||||
"Click the Create button. Then click into your new workspace.",
|
||||
"In the lower right hand corner you should see a terminal window. In this window use the following commands. You don't need to know what these mean at this point.",
|
||||
"Install <code>how-to-npm</code> with this command: <code>npm install -g how-to-npm</code>",
|
||||
"Install <code>how-to-npm</code> with this command: <code>npm install -g how-to-npm</code>.",
|
||||
"Now start the tutorial by running <code>how-to-npm</code>.",
|
||||
"Note that you can resize the c9.io's windows by dragging their borders.",
|
||||
"Make sure that you are always in your project's \"workspace\" directory. You can always navigate back to this directory by running this command: <code>cd ~/workspace</code>.",
|
||||
"Note that you can only add dist tags to the specific version numbers published in steps 8 and 10. If you receive a 403 or 404 error, run <code>how-to-npm</code> and try again.",
|
||||
"Also, if you experience a bug, and you think you understand the concept, you can skip a step by running <code>how-to-npm verify skip</code> in the terminal.",
|
||||
"You can view this Node School module's source code on GitHub at <a href='https://github.com/npm/how-to-npm'>https://github.com/npm/how-to-npm</a>.",
|
||||
"Complete \"Install NPM\"",
|
||||
"Complete \"Install npm\"",
|
||||
"Complete \"Dev Environment\"",
|
||||
"Complete \"Login\"",
|
||||
"Complete \"Start a Project\"",
|
||||
"Complete \"Install a Module\"",
|
||||
"Complete \"Start A Project\"",
|
||||
"Complete \"Install A Module\"",
|
||||
"Complete \"Listing Dependencies\"",
|
||||
"Complete \"NPM Test\"",
|
||||
"Complete \"npm Test\"",
|
||||
"Complete \"Package Niceties\"",
|
||||
"Complete \"Publish\"",
|
||||
"Complete \"Version\"",
|
||||
"Complete \"Publish Again\"",
|
||||
"Note Once you've completed these steps, you can skip the rest (which are currently buggy) and move on to our next challenge."
|
||||
"Complete \"Dist Tag\"",
|
||||
"Complete \"Dist Tag Removal\"",
|
||||
"Complete \"Outdated\"",
|
||||
"Complete \"Update\"",
|
||||
"Complete \"Rm\"",
|
||||
"Complete \"Finale\"",
|
||||
"Once you've completed these steps, move on to our next challenge."
|
||||
],
|
||||
"challengeSeed": [
|
||||
"yIz8RTe-bZk"
|
||||
@ -82,11 +88,12 @@
|
||||
"Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
|
||||
"Click on the \"+\" icon at the top right of the c9.io page to create a new workspace.",
|
||||
"Give your workspace a name and an optional description.",
|
||||
"Choose Node.js in the selection area below the name field.",
|
||||
"Choose \"Blank\" in the template section.",
|
||||
"Click the \"Create workspace\" button.",
|
||||
"Once C9 builds and loads your workspace, you should see a terminal window in the lower right hand corner. In this window use the following commands. You don't need to know what these mean at this point.",
|
||||
"Run this command: <code>sudo npm install -g learnyounode</code>",
|
||||
"Now start this tutorial by running <code>learnyounode</code>",
|
||||
"Update <code>npm</code> with this command: <code>npm install -g npm</code>.",
|
||||
"Install <code>learnyounode</code> with this command: <code>npm install -g learnyounode</code>.",
|
||||
"Now start this tutorial by running <code>learnyounode</code>.",
|
||||
"Note that you can resize the c9.io's windows by dragging their borders.",
|
||||
"Make sure that you are always in your project's \"workspace\" directory. You can always navigate back to this directory by running this command: <code>cd ~/workspace</code>.",
|
||||
"You can view this Node School module's source code on GitHub at <a href='https://github.com/workshopper/learnyounode'>https://github.com/workshopper/learnyounode</a>.",
|
||||
|
@ -84,7 +84,7 @@
|
||||
"Keep calm and code on!",
|
||||
"Even sad panda smiles!",
|
||||
"Even grumpy cat approves!",
|
||||
"Kool Aid Man says oh yeah!",
|
||||
"Kool-Aid Man says oh yeah!",
|
||||
"Bullseye!",
|
||||
"Far out!",
|
||||
"You're heating up!",
|
||||
|
@ -8,7 +8,7 @@ block content
|
||||
p In short: <bold>Be nice. No harassment, trolling, or spamming.</bold>
|
||||
ul
|
||||
li <bold>Harassment</bold> includes sexual language and imagery, deliberate intimidation, stalking, unwelcome sexual attention, libel and any malicious hacking or social engineering. Free Code Camp should be a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, national origin, or religion (or lack thereof).
|
||||
li <bold>Trolling</bold> includes posting inflamitory comments to provoke an emotional response or disrupt discussions.
|
||||
li <bold>Trolling</bold> includes posting inflammatory comments to provoke an emotional response or disrupt discussions.
|
||||
li <bold>Spamming</bold> includes posting off-topic messages to disrupt discussions or promote a product.
|
||||
p If you see someone harass, troll, or spam anywhere on Free Code Camp's online media (Gitter, YouTube, Facebook, etc.), notify us in our  
|
||||
a(href='https://gitter.im/freecodecamp/admin' target='_blank') Admin room in Gitter
|
||||
|
@ -31,4 +31,4 @@ block content
|
||||
<p>If in the future we show ads, ads appearing on any of our websites may be delivered to users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This Privacy Policy covers the use of cookies by Free Code Camp and does not cover the use of cookies by any advertisers.</p>
|
||||
<h3><a id="Privacy_Policy_Changes_53"></a>Privacy Policy Changes</h3>
|
||||
<p>Although most changes are likely to be minor, Free Code Camp may change its Privacy Policy from time to time, and in Free Code Camp’s sole discretion. Free Code Camp encourages visitors to frequently check this page for any changes to its Privacy Policy. If you have a <a href="http://FreeCodeCamp.com">FreeCodeCamp.com</a> account, you should also check your blog’s dashboard for alerts to these changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.</p>
|
||||
<p>This privacy policy is adopted from the Automattic (Free Code Camp) <a href='https://github.com/Free Code Camp/legalmattic'>open source terms</a> and are subject to the <a href='http://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International license</a>. We thank them for making this available.</p>
|
||||
<p>This privacy policy is adopted from the Automattic (Free Code Camp) <a href='https://automattic.com/privacy/'>open source terms</a> and are subject to the <a href='http://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International license</a>. We thank them for making this available.</p>
|
||||
|
Reference in New Issue
Block a user