| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | const _ = require('lodash'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  | const { | 
					
						
							|  |  |  |   getChallengesForLang, | 
					
						
							|  |  |  |   createChallenge, | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:04 +03:00
										 |  |  |   getChallengesDirForLang | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  | } = require('../../curriculum/getChallenges'); | 
					
						
							|  |  |  | const utils = require('./'); | 
					
						
							| 
									
										
										
										
											2018-10-09 16:46:14 +05:30
										 |  |  | const { locale } = require('../config/env.json'); | 
					
						
							| 
									
										
										
										
											2018-12-03 01:56:18 -08:00
										 |  |  | const { blockNameify } = require('./blockNameify'); | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const dasherize = utils.dasherize; | 
					
						
							|  |  |  | const nameify = utils.nameify; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const arrToString = arr => | 
					
						
							|  |  |  |   Array.isArray(arr) ? arr.join('\n') : _.toString(arr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:04 +03:00
										 |  |  | exports.localeChallengesRootDir = getChallengesDirForLang(locale); | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-18 21:16:09 +03:00
										 |  |  | exports.replaceChallengeNode = | 
					
						
							|  |  |  |   async function replaceChallengeNode(fullFilePath) { | 
					
						
							|  |  |  |     return prepareChallenge(await createChallenge(fullFilePath)); | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  | exports.buildChallenges = async function buildChallenges() { | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  |   const curriculum = await getChallengesForLang(locale); | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |   const superBlocks = Object.keys(curriculum); | 
					
						
							|  |  |  |   const blocks = superBlocks | 
					
						
							|  |  |  |     .map(superBlock => curriculum[superBlock].blocks) | 
					
						
							|  |  |  |     .reduce((blocks, superBlock) => { | 
					
						
							|  |  |  |       const currentBlocks = Object.keys(superBlock).map(key => superBlock[key]); | 
					
						
							|  |  |  |       return blocks.concat(_.flatten(currentBlocks)); | 
					
						
							|  |  |  |     }, []); | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  |   const builtChallenges = blocks | 
					
						
							|  |  |  |     .filter(block => !block.isPrivate) | 
					
						
							| 
									
										
										
										
											2018-11-18 21:16:09 +03:00
										 |  |  |     .map(({ challenges }) => challenges.map(prepareChallenge)) | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  |     .reduce((accu, current) => accu.concat(current), []); | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |   return builtChallenges; | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2018-11-18 21:16:09 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | function prepareChallenge(challenge) { | 
					
						
							|  |  |  |   challenge.name = nameify(challenge.title); | 
					
						
							|  |  |  |   if (challenge.files) { | 
					
						
							|  |  |  |     challenge.files = _.reduce( | 
					
						
							|  |  |  |       challenge.files, | 
					
						
							|  |  |  |       (map, file) => { | 
					
						
							|  |  |  |         map[file.key] = { | 
					
						
							|  |  |  |           ...file, | 
					
						
							|  |  |  |           head: arrToString(file.head), | 
					
						
							|  |  |  |           contents: arrToString(file.contents), | 
					
						
							|  |  |  |           tail: arrToString(file.tail) | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         return map; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       {} | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   challenge.block = dasherize(challenge.block); | 
					
						
							| 
									
										
										
										
											2018-12-03 01:56:18 -08:00
										 |  |  |   challenge.superBlock = blockNameify(challenge.superBlock); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:16:09 +03:00
										 |  |  |   return challenge; | 
					
						
							|  |  |  | } |