From b4084f94ffe5f18fbc02188c29200f9323341fe2 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Wed, 29 Nov 2017 15:44:51 -0800 Subject: [PATCH] feat: react challenges (#16099) * chore(packages): Update redux utils * feat(Panes): Invert control of panes map creation * feat(Modern): Add view * feat(Panes): Decouple panes from Challenges * fix(Challenges): Decouple challenge views from panes map * fix(Challenge/views): PanesMap => mapStateToPanesMap This clarifies what these functions are doing * fix(Challenges): Add view type * fix(Panes): Remove unneeded panes container * feat(Panes): Invert control of pane content render This decouples the Panes from the content they render, allowing for greater flexibility. * feat(Modern): Add side panel This is common between modern and classic * feat(seed): Array to string file content * fix(files): Modern files should be polyvinyls * feat(Modern): Create editors per file * fix(seed/React): Incorrect keyfile name * feat(Modern): Highligh jsx correctly This adds highlighting for jsx. Unfortunately, this disables linting for non-javascript files as jshint will only work for those * feat(rechallenge): Add jsx ext to babel transformer * feat(seed): Normalize challenge files head/tail/content * refactor(rechallenge/build): Rename function * fix(code-storage): Pull in files from localStorage * feat(Modern/React): Add Enzyme to test runner This enables testing of React challenges * feat(Modern): Add submission type * refactor(Panes): Rename panes map update action --- challenges/03-front-end-libraries/react.json | 13 +++++++++---- index.js | 13 +++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/challenges/03-front-end-libraries/react.json b/challenges/03-front-end-libraries/react.json index c254a3f852d..fc6adf8d7a7 100644 --- a/challenges/03-front-end-libraries/react.json +++ b/challenges/03-front-end-libraries/react.json @@ -3,6 +3,11 @@ "order": 5, "time": "5 hours", "helpRoom": "Help", + "required": [ + { + "src": "https://cdnjs.cloudflare.com/ajax/libs/react/16.1.1/umd/react.development.js" + } + ], "challenges": [ { "id": "587d7dbc367417b2b2512bb1", @@ -17,7 +22,7 @@ ], "files": { "indexjsx": { - "key": "indexjxs", + "key": "indexjsx", "ext": "jsx", "name": "index", "contents": [ @@ -28,11 +33,11 @@ } }, "tests": [ - "assert(Enzyme.shallow(jsx).type === 'h1', 'message: The constant JSX should return an h1 element.');", - "assert(Enzyme.shallow(jsx).children() === 'Hello JSX!', 'message: The h1 tag should include the text Hello JSX!');" + "assert(Enzyme.shallow(jsx).type() === 'h1', 'message: The constant JSX should return an h1 element.');", + "assert(Enzyme.shallow(jsx).contains( 'Hello JSX!'), 'message: The h1 tag should include the text Hello JSX!');" ], "type": "modern", - "isRequired": true, + "isRequired": false, "translations": {} } ] diff --git a/index.js b/index.js index e2de5da8230..e1d7f79a07b 100644 --- a/index.js +++ b/index.js @@ -23,6 +23,8 @@ var createChallenges = var Block = app.models.Block; var destroyBlocks = Observable.fromNodeCallback(Block.destroyAll, Block); var createBlocks = Observable.fromNodeCallback(Block.create, Block); +const arrToString = arr => + Array.isArray(arr) ? arr.join('\n') : _.toString(arr); Observable.combineLatest( destroyChallenges(), @@ -82,6 +84,17 @@ Observable.combineLatest( ) ); + 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.fileName = fileName; challenge.helpRoom = helpRoom; challenge.order = order;