From 1642c631de06af91b541bce786169e528d0ca811 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Tue, 14 Dec 2021 17:16:23 +0100 Subject: [PATCH] refactor: drop superorder from metas (#44422) * refactor: create superOrder from superblock * chore: drop superOrders from meta * fix: return null for 'certifications' * fix: only set superOrder if it is needed * fix(tests): remove filter from order tests * test: use getSuperOrder, since superOrder has gone * test: ignore certificates * fix: getSuperOrder throw for 'certifications' * test: remove certificate special case It wasn't necessary, anyway (it had never been working because I put certificate not certification) Co-authored-by: Nicholas Carrigan --- .../_meta/advanced-node-and-express/meta.json | 1 - .../challenges/_meta/algorithms/meta.json | 1 - .../_meta/applied-accessibility/meta.json | 1 - .../_meta/applied-visual-design/meta.json | 1 - .../meta.json | 1 - .../_meta/basic-algorithm-scripting/meta.json | 1 - .../challenges/_meta/basic-css/meta.json | 1 - .../_meta/basic-data-structures/meta.json | 1 - .../_meta/basic-html-and-html5/meta.json | 1 - .../_meta/basic-javascript-rpg-game/meta.json | 1 - .../_meta/basic-javascript/meta.json | 1 - .../_meta/basic-node-and-express/meta.json | 1 - .../challenges/_meta/bootstrap/meta.json | 1 - .../challenges/_meta/css-flexbox/meta.json | 1 - .../challenges/_meta/css-grid/meta.json | 1 - .../challenges/_meta/d3-dashboard/meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../_meta/data-structures/meta.json | 1 - .../data-visualization-projects/meta.json | 1 - .../data-visualization-with-d3/meta.json | 1 - .../challenges/_meta/debugging/meta.json | 1 - curriculum/challenges/_meta/es6/meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../_meta/functional-programming/meta.json | 1 - .../_meta/how-neural-networks-work/meta.json | 1 - .../information-security-projects/meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - curriculum/challenges/_meta/jquery/meta.json | 1 - .../_meta/json-apis-and-ajax/meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 3 +- .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../learn-relational-databases/meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../meta.json | 1 - .../managing-packages-with-npm/meta.json | 1 - .../_meta/mongodb-and-mongoose/meta.json | 1 - curriculum/challenges/_meta/numpy/meta.json | 1 - .../object-oriented-programming/meta.json | 1 - .../challenges/_meta/project-euler/meta.json | 1 - .../_meta/python-for-everybody/meta.json | 1 - .../python-for-penetration-testing/meta.json | 1 - .../meta.json | 1 - .../quality-assurance-projects/meta.json | 1 - .../_meta/react-and-redux/meta.json | 1 - curriculum/challenges/_meta/react/meta.json | 1 - curriculum/challenges/_meta/redux/meta.json | 1 - .../_meta/regular-expressions/meta.json | 1 - .../meta.json | 1 - .../responsive-web-design-projects/meta.json | 1 - .../challenges/_meta/rosetta-code/meta.json | 1 - curriculum/challenges/_meta/sass/meta.json | 1 - .../meta.json | 1 - .../_meta/take-home-projects/meta.json | 1 - .../challenges/_meta/tensorflow/meta.json | 1 - curriculum/getChallenges.js | 5 ++- curriculum/test/test-challenges.js | 16 +++---- curriculum/utils.js | 29 +++++++++++++ curriculum/utils.test.js | 43 +++++++++++++++++++ 74 files changed, 81 insertions(+), 84 deletions(-) create mode 100644 curriculum/utils.test.js diff --git a/curriculum/challenges/_meta/advanced-node-and-express/meta.json b/curriculum/challenges/_meta/advanced-node-and-express/meta.json index f4b486be17..70b21a8d6a 100644 --- a/curriculum/challenges/_meta/advanced-node-and-express/meta.json +++ b/curriculum/challenges/_meta/advanced-node-and-express/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "quality-assurance", - "superOrder": 6, "challengeOrder": [ [ "5895f700f9fc0f352b528e63", diff --git a/curriculum/challenges/_meta/algorithms/meta.json b/curriculum/challenges/_meta/algorithms/meta.json index e1472c08ff..e9429d9c42 100644 --- a/curriculum/challenges/_meta/algorithms/meta.json +++ b/curriculum/challenges/_meta/algorithms/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "coding-interview-prep", - "superOrder": 11, "challengeOrder": [ [ "a3f503de51cf954ede28891d", diff --git a/curriculum/challenges/_meta/applied-accessibility/meta.json b/curriculum/challenges/_meta/applied-accessibility/meta.json index fe736d9e60..b0242507e7 100644 --- a/curriculum/challenges/_meta/applied-accessibility/meta.json +++ b/curriculum/challenges/_meta/applied-accessibility/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "587d774c367417b2b2512a9c", diff --git a/curriculum/challenges/_meta/applied-visual-design/meta.json b/curriculum/challenges/_meta/applied-visual-design/meta.json index 10628457de..8377a93085 100644 --- a/curriculum/challenges/_meta/applied-visual-design/meta.json +++ b/curriculum/challenges/_meta/applied-visual-design/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "587d7791367417b2b2512ab3", diff --git a/curriculum/challenges/_meta/back-end-development-and-apis-projects/meta.json b/curriculum/challenges/_meta/back-end-development-and-apis-projects/meta.json index b98c47331b..2bd4ace104 100644 --- a/curriculum/challenges/_meta/back-end-development-and-apis-projects/meta.json +++ b/curriculum/challenges/_meta/back-end-development-and-apis-projects/meta.json @@ -5,7 +5,6 @@ "order": 3, "time": "150 hours", "superBlock": "back-end-development-and-apis", - "superOrder": 5, "challengeOrder": [ [ "bd7158d8c443edefaeb5bdef", diff --git a/curriculum/challenges/_meta/basic-algorithm-scripting/meta.json b/curriculum/challenges/_meta/basic-algorithm-scripting/meta.json index 13ae51c2c5..9e3d3e3e4b 100644 --- a/curriculum/challenges/_meta/basic-algorithm-scripting/meta.json +++ b/curriculum/challenges/_meta/basic-algorithm-scripting/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "56533eb9ac21ba0edf2244b3", diff --git a/curriculum/challenges/_meta/basic-css/meta.json b/curriculum/challenges/_meta/basic-css/meta.json index 7588a3366c..ed2d3447ef 100644 --- a/curriculum/challenges/_meta/basic-css/meta.json +++ b/curriculum/challenges/_meta/basic-css/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "bad87fee1348bd9aedf08803", diff --git a/curriculum/challenges/_meta/basic-data-structures/meta.json b/curriculum/challenges/_meta/basic-data-structures/meta.json index cf6faa9741..4a53c0ce37 100644 --- a/curriculum/challenges/_meta/basic-data-structures/meta.json +++ b/curriculum/challenges/_meta/basic-data-structures/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "587d7b7e367417b2b2512b20", diff --git a/curriculum/challenges/_meta/basic-html-and-html5/meta.json b/curriculum/challenges/_meta/basic-html-and-html5/meta.json index 75958d960b..98791626c6 100644 --- a/curriculum/challenges/_meta/basic-html-and-html5/meta.json +++ b/curriculum/challenges/_meta/basic-html-and-html5/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "bd7123c8c441eddfaeb5bdef", diff --git a/curriculum/challenges/_meta/basic-javascript-rpg-game/meta.json b/curriculum/challenges/_meta/basic-javascript-rpg-game/meta.json index 2290767470..2ac4f74265 100644 --- a/curriculum/challenges/_meta/basic-javascript-rpg-game/meta.json +++ b/curriculum/challenges/_meta/basic-javascript-rpg-game/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/basic-javascript/meta.json b/curriculum/challenges/_meta/basic-javascript/meta.json index 3ddf7324f9..6c58d20dd3 100644 --- a/curriculum/challenges/_meta/basic-javascript/meta.json +++ b/curriculum/challenges/_meta/basic-javascript/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "bd7123c9c441eddfaeb4bdef", diff --git a/curriculum/challenges/_meta/basic-node-and-express/meta.json b/curriculum/challenges/_meta/basic-node-and-express/meta.json index 9f83d0bf11..8fccbfe5a8 100644 --- a/curriculum/challenges/_meta/basic-node-and-express/meta.json +++ b/curriculum/challenges/_meta/basic-node-and-express/meta.json @@ -5,7 +5,6 @@ "order": 1, "time": "5 hours", "superBlock": "back-end-development-and-apis", - "superOrder": 5, "challengeOrder": [ [ "587d7fb0367417b2b2512bed", diff --git a/curriculum/challenges/_meta/bootstrap/meta.json b/curriculum/challenges/_meta/bootstrap/meta.json index 38a9de6012..a445f13f32 100644 --- a/curriculum/challenges/_meta/bootstrap/meta.json +++ b/curriculum/challenges/_meta/bootstrap/meta.json @@ -11,7 +11,6 @@ } ], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "bad87fee1348bd9acde08712", diff --git a/curriculum/challenges/_meta/css-flexbox/meta.json b/curriculum/challenges/_meta/css-flexbox/meta.json index 443b731e1d..801cc94bda 100644 --- a/curriculum/challenges/_meta/css-flexbox/meta.json +++ b/curriculum/challenges/_meta/css-flexbox/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "587d78ab367417b2b2512af0", diff --git a/curriculum/challenges/_meta/css-grid/meta.json b/curriculum/challenges/_meta/css-grid/meta.json index b3b6a05bd4..2b2c9851a2 100644 --- a/curriculum/challenges/_meta/css-grid/meta.json +++ b/curriculum/challenges/_meta/css-grid/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "5a858944d96184f06fd60d61", diff --git a/curriculum/challenges/_meta/d3-dashboard/meta.json b/curriculum/challenges/_meta/d3-dashboard/meta.json index fcc015e22d..c6752b0923 100644 --- a/curriculum/challenges/_meta/d3-dashboard/meta.json +++ b/curriculum/challenges/_meta/d3-dashboard/meta.json @@ -12,7 +12,6 @@ } ], "superBlock": "data-visualization", - "superOrder": 3, "challengeOrder": [ [ "5d8a4cfbe6b6180ed9a1c9de", diff --git a/curriculum/challenges/_meta/data-analysis-with-python-course/meta.json b/curriculum/challenges/_meta/data-analysis-with-python-course/meta.json index 9e12e855d5..3f3c16fb84 100644 --- a/curriculum/challenges/_meta/data-analysis-with-python-course/meta.json +++ b/curriculum/challenges/_meta/data-analysis-with-python-course/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "data-analysis-with-python", - "superOrder": 8, "challengeOrder": [ [ "5e9a093a74c4063ca6f7c14c", diff --git a/curriculum/challenges/_meta/data-analysis-with-python-projects/meta.json b/curriculum/challenges/_meta/data-analysis-with-python-projects/meta.json index 4b278b79ba..f9b65cb74d 100644 --- a/curriculum/challenges/_meta/data-analysis-with-python-projects/meta.json +++ b/curriculum/challenges/_meta/data-analysis-with-python-projects/meta.json @@ -5,7 +5,6 @@ "order": 2, "time": "150 hours", "superBlock": "data-analysis-with-python", - "superOrder": 8, "challengeOrder": [ [ "5e46f7e5ac417301a38fb928", diff --git a/curriculum/challenges/_meta/data-structures/meta.json b/curriculum/challenges/_meta/data-structures/meta.json index 70435b85e8..f3416838d6 100644 --- a/curriculum/challenges/_meta/data-structures/meta.json +++ b/curriculum/challenges/_meta/data-structures/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "coding-interview-prep", - "superOrder": 11, "challengeOrder": [ [ "587d8253367417b2b2512c6a", diff --git a/curriculum/challenges/_meta/data-visualization-projects/meta.json b/curriculum/challenges/_meta/data-visualization-projects/meta.json index 2a0d30ada5..4e4646beda 100644 --- a/curriculum/challenges/_meta/data-visualization-projects/meta.json +++ b/curriculum/challenges/_meta/data-visualization-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "data-visualization", - "superOrder": 3, "challengeOrder": [ [ "bd7168d8c242eddfaeb5bd13", diff --git a/curriculum/challenges/_meta/data-visualization-with-d3/meta.json b/curriculum/challenges/_meta/data-visualization-with-d3/meta.json index 98aea4b2d6..71b68b7816 100644 --- a/curriculum/challenges/_meta/data-visualization-with-d3/meta.json +++ b/curriculum/challenges/_meta/data-visualization-with-d3/meta.json @@ -11,7 +11,6 @@ } ], "superBlock": "data-visualization", - "superOrder": 3, "challengeOrder": [ ["587d7fa6367417b2b2512bc2", "Add Document Elements with D3"], ["587d7fa6367417b2b2512bc3", "Select a Group of Elements with D3"], diff --git a/curriculum/challenges/_meta/debugging/meta.json b/curriculum/challenges/_meta/debugging/meta.json index dda04007d5..ac4ebdd875 100644 --- a/curriculum/challenges/_meta/debugging/meta.json +++ b/curriculum/challenges/_meta/debugging/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "587d7b83367417b2b2512b33", diff --git a/curriculum/challenges/_meta/es6/meta.json b/curriculum/challenges/_meta/es6/meta.json index cb64aa55c8..fa11e53c13 100644 --- a/curriculum/challenges/_meta/es6/meta.json +++ b/curriculum/challenges/_meta/es6/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "587d7b87367417b2b2512b40", diff --git a/curriculum/challenges/_meta/front-end-development-libraries-projects/meta.json b/curriculum/challenges/_meta/front-end-development-libraries-projects/meta.json index 1a619ae5ce..da95c741f4 100644 --- a/curriculum/challenges/_meta/front-end-development-libraries-projects/meta.json +++ b/curriculum/challenges/_meta/front-end-development-libraries-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "bd7158d8c442eddfaeb5bd13", diff --git a/curriculum/challenges/_meta/functional-programming-spreadsheet/meta.json b/curriculum/challenges/_meta/functional-programming-spreadsheet/meta.json index 699412c7d6..b8bbc2ee29 100644 --- a/curriculum/challenges/_meta/functional-programming-spreadsheet/meta.json +++ b/curriculum/challenges/_meta/functional-programming-spreadsheet/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/functional-programming/meta.json b/curriculum/challenges/_meta/functional-programming/meta.json index 8f6e16dce3..f66cec96cb 100644 --- a/curriculum/challenges/_meta/functional-programming/meta.json +++ b/curriculum/challenges/_meta/functional-programming/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "587d7b8d367417b2b2512b5b", diff --git a/curriculum/challenges/_meta/how-neural-networks-work/meta.json b/curriculum/challenges/_meta/how-neural-networks-work/meta.json index 312606b0f0..ef4b26308c 100644 --- a/curriculum/challenges/_meta/how-neural-networks-work/meta.json +++ b/curriculum/challenges/_meta/how-neural-networks-work/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "machine-learning-with-python", - "superOrder": 10, "challengeOrder": [ [ "5e9a0e9ef99a403d019610ca", diff --git a/curriculum/challenges/_meta/information-security-projects/meta.json b/curriculum/challenges/_meta/information-security-projects/meta.json index 8cbbf5579d..ffd3dd18a2 100644 --- a/curriculum/challenges/_meta/information-security-projects/meta.json +++ b/curriculum/challenges/_meta/information-security-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "information-security", - "superOrder": 9, "challengeOrder": [ [ "587d824a367417b2b2512c44", diff --git a/curriculum/challenges/_meta/information-security-with-helmetjs/meta.json b/curriculum/challenges/_meta/information-security-with-helmetjs/meta.json index fe06f1364c..11aef89254 100644 --- a/curriculum/challenges/_meta/information-security-with-helmetjs/meta.json +++ b/curriculum/challenges/_meta/information-security-with-helmetjs/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "information-security", - "superOrder": 9, "challengeOrder": [ [ "587d8247367417b2b2512c36", diff --git a/curriculum/challenges/_meta/intermediate-algorithm-scripting/meta.json b/curriculum/challenges/_meta/intermediate-algorithm-scripting/meta.json index 1a768f9a60..ec326942ba 100644 --- a/curriculum/challenges/_meta/intermediate-algorithm-scripting/meta.json +++ b/curriculum/challenges/_meta/intermediate-algorithm-scripting/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "a3566b1109230028080c9345", diff --git a/curriculum/challenges/_meta/intermediate-javascript-calorie-counter/meta.json b/curriculum/challenges/_meta/intermediate-javascript-calorie-counter/meta.json index e42df9ec3b..107e7d616d 100644 --- a/curriculum/challenges/_meta/intermediate-javascript-calorie-counter/meta.json +++ b/curriculum/challenges/_meta/intermediate-javascript-calorie-counter/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "5ddb965c65d27e1512d44d9a", diff --git a/curriculum/challenges/_meta/javascript-algorithms-and-data-structures-projects/meta.json b/curriculum/challenges/_meta/javascript-algorithms-and-data-structures-projects/meta.json index 99d79245c0..5589df7551 100644 --- a/curriculum/challenges/_meta/javascript-algorithms-and-data-structures-projects/meta.json +++ b/curriculum/challenges/_meta/javascript-algorithms-and-data-structures-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "aaa48de84e1ecc7c742e1124", diff --git a/curriculum/challenges/_meta/jquery/meta.json b/curriculum/challenges/_meta/jquery/meta.json index 31fb7943cc..82675a180a 100644 --- a/curriculum/challenges/_meta/jquery/meta.json +++ b/curriculum/challenges/_meta/jquery/meta.json @@ -11,7 +11,6 @@ } ], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "bad87fee1348bd9acdd08826", diff --git a/curriculum/challenges/_meta/json-apis-and-ajax/meta.json b/curriculum/challenges/_meta/json-apis-and-ajax/meta.json index 5d13766cb3..f7d8b24f9a 100644 --- a/curriculum/challenges/_meta/json-apis-and-ajax/meta.json +++ b/curriculum/challenges/_meta/json-apis-and-ajax/meta.json @@ -11,7 +11,6 @@ } ], "superBlock": "data-visualization", - "superOrder": 3, "challengeOrder": [ [ "587d7fad367417b2b2512be1", diff --git a/curriculum/challenges/_meta/learn-accessibility-by-building-a-quiz/meta.json b/curriculum/challenges/_meta/learn-accessibility-by-building-a-quiz/meta.json index f3206de957..b98701ffe6 100644 --- a/curriculum/challenges/_meta/learn-accessibility-by-building-a-quiz/meta.json +++ b/curriculum/challenges/_meta/learn-accessibility-by-building-a-quiz/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-basic-css-by-building-a-cafe-menu/meta.json b/curriculum/challenges/_meta/learn-basic-css-by-building-a-cafe-menu/meta.json index 89f4f58cc5..7a139f3401 100644 --- a/curriculum/challenges/_meta/learn-basic-css-by-building-a-cafe-menu/meta.json +++ b/curriculum/challenges/_meta/learn-basic-css-by-building-a-cafe-menu/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-css-animation-by-building-a-ferris-wheel/meta.json b/curriculum/challenges/_meta/learn-css-animation-by-building-a-ferris-wheel/meta.json index b453f5ff9b..131d23f3f9 100644 --- a/curriculum/challenges/_meta/learn-css-animation-by-building-a-ferris-wheel/meta.json +++ b/curriculum/challenges/_meta/learn-css-animation-by-building-a-ferris-wheel/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-css-flexbox-by-building-a-photo-gallery/meta.json b/curriculum/challenges/_meta/learn-css-flexbox-by-building-a-photo-gallery/meta.json index fc85269266..42a800df5b 100644 --- a/curriculum/challenges/_meta/learn-css-flexbox-by-building-a-photo-gallery/meta.json +++ b/curriculum/challenges/_meta/learn-css-flexbox-by-building-a-photo-gallery/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-css-grid-by-building-a-magazine/meta.json b/curriculum/challenges/_meta/learn-css-grid-by-building-a-magazine/meta.json index 2ad433081b..4ae209c001 100644 --- a/curriculum/challenges/_meta/learn-css-grid-by-building-a-magazine/meta.json +++ b/curriculum/challenges/_meta/learn-css-grid-by-building-a-magazine/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-css-transforms-by-building-a-penguin/meta.json b/curriculum/challenges/_meta/learn-css-transforms-by-building-a-penguin/meta.json index 9243b878d7..a396ab53e1 100644 --- a/curriculum/challenges/_meta/learn-css-transforms-by-building-a-penguin/meta.json +++ b/curriculum/challenges/_meta/learn-css-transforms-by-building-a-penguin/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 1, "isBeta": true, "challengeOrder": [ [ @@ -428,4 +427,4 @@ "Step 104" ] ] -} \ No newline at end of file +} diff --git a/curriculum/challenges/_meta/learn-css-variables-by-building-a-city-skyline/meta.json b/curriculum/challenges/_meta/learn-css-variables-by-building-a-city-skyline/meta.json index 97f9c7ca0d..409c39852e 100644 --- a/curriculum/challenges/_meta/learn-css-variables-by-building-a-city-skyline/meta.json +++ b/curriculum/challenges/_meta/learn-css-variables-by-building-a-city-skyline/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "5d822fd413a79914d39e98c9", diff --git a/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json b/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json index 8c09f3cf87..7128761f4f 100644 --- a/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json +++ b/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json b/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json index b180c971a0..56bdb3b3a8 100644 --- a/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json +++ b/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-intermediate-css-by-building-a-picasso-painting/meta.json b/curriculum/challenges/_meta/learn-intermediate-css-by-building-a-picasso-painting/meta.json index 7f238ddc3d..89866e64fe 100644 --- a/curriculum/challenges/_meta/learn-intermediate-css-by-building-a-picasso-painting/meta.json +++ b/curriculum/challenges/_meta/learn-intermediate-css-by-building-a-picasso-painting/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/meta.json b/curriculum/challenges/_meta/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/meta.json index f023fedd9e..81bfd8f97f 100644 --- a/curriculum/challenges/_meta/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/meta.json +++ b/curriculum/challenges/_meta/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 1, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-relational-databases/meta.json b/curriculum/challenges/_meta/learn-relational-databases/meta.json index bd1221db00..8860e4d943 100644 --- a/curriculum/challenges/_meta/learn-relational-databases/meta.json +++ b/curriculum/challenges/_meta/learn-relational-databases/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "relational-databases", - "superOrder": 4, "challengeOrder": [ [ "5ea8adfab628f68d805bfc5e", diff --git a/curriculum/challenges/_meta/learn-responsive-web-design-by-building-a-piano/meta.json b/curriculum/challenges/_meta/learn-responsive-web-design-by-building-a-piano/meta.json index 457782a676..ea91978a79 100644 --- a/curriculum/challenges/_meta/learn-responsive-web-design-by-building-a-piano/meta.json +++ b/curriculum/challenges/_meta/learn-responsive-web-design-by-building-a-piano/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-the-css-box-model-by-building-a-rothko-painting/meta.json b/curriculum/challenges/_meta/learn-the-css-box-model-by-building-a-rothko-painting/meta.json index ebd21cc8eb..ee18cc9481 100644 --- a/curriculum/challenges/_meta/learn-the-css-box-model-by-building-a-rothko-painting/meta.json +++ b/curriculum/challenges/_meta/learn-the-css-box-model-by-building-a-rothko-painting/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json b/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json index 60970e5089..323a4f00bc 100644 --- a/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json +++ b/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json @@ -8,7 +8,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "isBeta": true, "challengeOrder": [ [ diff --git a/curriculum/challenges/_meta/machine-learning-with-python-projects/meta.json b/curriculum/challenges/_meta/machine-learning-with-python-projects/meta.json index 3c37b48e39..f11889802e 100644 --- a/curriculum/challenges/_meta/machine-learning-with-python-projects/meta.json +++ b/curriculum/challenges/_meta/machine-learning-with-python-projects/meta.json @@ -5,7 +5,6 @@ "order": 2, "time": "150 hours", "superBlock": "machine-learning-with-python", - "superOrder": 10, "challengeOrder": [ [ "5e46f8d6ac417301a38fb92d", diff --git a/curriculum/challenges/_meta/managing-packages-with-npm/meta.json b/curriculum/challenges/_meta/managing-packages-with-npm/meta.json index be6dfc34aa..cc3bd08d1b 100644 --- a/curriculum/challenges/_meta/managing-packages-with-npm/meta.json +++ b/curriculum/challenges/_meta/managing-packages-with-npm/meta.json @@ -5,7 +5,6 @@ "order": 0, "time": "5 hours", "superBlock": "back-end-development-and-apis", - "superOrder": 5, "challengeOrder": [ [ "587d7fb3367417b2b2512bfb", diff --git a/curriculum/challenges/_meta/mongodb-and-mongoose/meta.json b/curriculum/challenges/_meta/mongodb-and-mongoose/meta.json index d0595af72e..ea86f4a2ef 100644 --- a/curriculum/challenges/_meta/mongodb-and-mongoose/meta.json +++ b/curriculum/challenges/_meta/mongodb-and-mongoose/meta.json @@ -5,7 +5,6 @@ "order": 2, "time": "5 hours", "superBlock": "back-end-development-and-apis", - "superOrder": 5, "challengeOrder": [ [ "587d7fb6367417b2b2512c06", diff --git a/curriculum/challenges/_meta/numpy/meta.json b/curriculum/challenges/_meta/numpy/meta.json index f923414dd3..20b855a87b 100644 --- a/curriculum/challenges/_meta/numpy/meta.json +++ b/curriculum/challenges/_meta/numpy/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "data-analysis-with-python", - "superOrder": 8, "challengeOrder": [ [ "5e9a0a8e09c5df3cc3600ed2", diff --git a/curriculum/challenges/_meta/object-oriented-programming/meta.json b/curriculum/challenges/_meta/object-oriented-programming/meta.json index bd24c6809f..76950368f5 100644 --- a/curriculum/challenges/_meta/object-oriented-programming/meta.json +++ b/curriculum/challenges/_meta/object-oriented-programming/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "587d7dac367417b2b2512b73", diff --git a/curriculum/challenges/_meta/project-euler/meta.json b/curriculum/challenges/_meta/project-euler/meta.json index 0330e83bcb..4e57d51912 100644 --- a/curriculum/challenges/_meta/project-euler/meta.json +++ b/curriculum/challenges/_meta/project-euler/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "coding-interview-prep", - "superOrder": 11, "challengeOrder": [ [ "5900f36e1000cf542c50fe80", diff --git a/curriculum/challenges/_meta/python-for-everybody/meta.json b/curriculum/challenges/_meta/python-for-everybody/meta.json index 33fb79eb45..cea2fcb1c1 100644 --- a/curriculum/challenges/_meta/python-for-everybody/meta.json +++ b/curriculum/challenges/_meta/python-for-everybody/meta.json @@ -5,7 +5,6 @@ "order": 0, "time": "15 hours", "superBlock": "scientific-computing-with-python", - "superOrder": 7, "challengeOrder": [ [ "5e6a54a558d3af90110a60a0", diff --git a/curriculum/challenges/_meta/python-for-penetration-testing/meta.json b/curriculum/challenges/_meta/python-for-penetration-testing/meta.json index 07274e80a0..953f55e1e8 100644 --- a/curriculum/challenges/_meta/python-for-penetration-testing/meta.json +++ b/curriculum/challenges/_meta/python-for-penetration-testing/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "information-security", - "superOrder": 9, "challengeOrder": [ [ "5ea9997bbec2e9bc47e94dae", diff --git a/curriculum/challenges/_meta/quality-assurance-and-testing-with-chai/meta.json b/curriculum/challenges/_meta/quality-assurance-and-testing-with-chai/meta.json index ef94496080..829b268edb 100644 --- a/curriculum/challenges/_meta/quality-assurance-and-testing-with-chai/meta.json +++ b/curriculum/challenges/_meta/quality-assurance-and-testing-with-chai/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "quality-assurance", - "superOrder": 6, "challengeOrder": [ [ "587d824a367417b2b2512c46", diff --git a/curriculum/challenges/_meta/quality-assurance-projects/meta.json b/curriculum/challenges/_meta/quality-assurance-projects/meta.json index e95e1b4259..b8d579ba2b 100644 --- a/curriculum/challenges/_meta/quality-assurance-projects/meta.json +++ b/curriculum/challenges/_meta/quality-assurance-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "quality-assurance", - "superOrder": 6, "challengeOrder": [ [ "587d8249367417b2b2512c41", diff --git a/curriculum/challenges/_meta/react-and-redux/meta.json b/curriculum/challenges/_meta/react-and-redux/meta.json index f9e3d4b60e..fec9173d44 100644 --- a/curriculum/challenges/_meta/react-and-redux/meta.json +++ b/curriculum/challenges/_meta/react-and-redux/meta.json @@ -20,7 +20,6 @@ } ], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "5a24c314108439a4d4036141", diff --git a/curriculum/challenges/_meta/react/meta.json b/curriculum/challenges/_meta/react/meta.json index f37c2efffb..b56b4ba737 100644 --- a/curriculum/challenges/_meta/react/meta.json +++ b/curriculum/challenges/_meta/react/meta.json @@ -14,7 +14,6 @@ } ], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "587d7dbc367417b2b2512bb1", diff --git a/curriculum/challenges/_meta/redux/meta.json b/curriculum/challenges/_meta/redux/meta.json index a2c60da1e6..fa4ff76aa0 100644 --- a/curriculum/challenges/_meta/redux/meta.json +++ b/curriculum/challenges/_meta/redux/meta.json @@ -14,7 +14,6 @@ } ], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "5a24c314108439a4d403614b", diff --git a/curriculum/challenges/_meta/regular-expressions/meta.json b/curriculum/challenges/_meta/regular-expressions/meta.json index 5bac9d5c92..d7c808b5de 100644 --- a/curriculum/challenges/_meta/regular-expressions/meta.json +++ b/curriculum/challenges/_meta/regular-expressions/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "javascript-algorithms-and-data-structures", - "superOrder": 1, "challengeOrder": [ [ "587d7db3367417b2b2512b8e", diff --git a/curriculum/challenges/_meta/responsive-web-design-principles/meta.json b/curriculum/challenges/_meta/responsive-web-design-principles/meta.json index 8520fe24a8..dc6d1f4a95 100644 --- a/curriculum/challenges/_meta/responsive-web-design-principles/meta.json +++ b/curriculum/challenges/_meta/responsive-web-design-principles/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "587d78b0367417b2b2512b08", diff --git a/curriculum/challenges/_meta/responsive-web-design-projects/meta.json b/curriculum/challenges/_meta/responsive-web-design-projects/meta.json index fc19124d21..b4519a19f9 100644 --- a/curriculum/challenges/_meta/responsive-web-design-projects/meta.json +++ b/curriculum/challenges/_meta/responsive-web-design-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "responsive-web-design", - "superOrder": 0, "challengeOrder": [ [ "bd7158d8c442eddfaeb5bd18", diff --git a/curriculum/challenges/_meta/rosetta-code/meta.json b/curriculum/challenges/_meta/rosetta-code/meta.json index f18b86e75c..bbc73b9bd2 100644 --- a/curriculum/challenges/_meta/rosetta-code/meta.json +++ b/curriculum/challenges/_meta/rosetta-code/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "coding-interview-prep", - "superOrder": 11, "challengeOrder": [ [ "594810f028c0303b75339acb", diff --git a/curriculum/challenges/_meta/sass/meta.json b/curriculum/challenges/_meta/sass/meta.json index ce9586d41f..430380d816 100644 --- a/curriculum/challenges/_meta/sass/meta.json +++ b/curriculum/challenges/_meta/sass/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "front-end-development-libraries", - "superOrder": 2, "challengeOrder": [ [ "587d7dbd367417b2b2512bb4", diff --git a/curriculum/challenges/_meta/scientific-computing-with-python-projects/meta.json b/curriculum/challenges/_meta/scientific-computing-with-python-projects/meta.json index d93cd39020..25dc151516 100644 --- a/curriculum/challenges/_meta/scientific-computing-with-python-projects/meta.json +++ b/curriculum/challenges/_meta/scientific-computing-with-python-projects/meta.json @@ -5,7 +5,6 @@ "order": 1, "time": "150 hours", "superBlock": "scientific-computing-with-python", - "superOrder": 7, "challengeOrder": [ [ "5e44412c903586ffb414c94c", diff --git a/curriculum/challenges/_meta/take-home-projects/meta.json b/curriculum/challenges/_meta/take-home-projects/meta.json index 19606885b1..e6d74a8170 100644 --- a/curriculum/challenges/_meta/take-home-projects/meta.json +++ b/curriculum/challenges/_meta/take-home-projects/meta.json @@ -7,7 +7,6 @@ "template": "", "required": [], "superBlock": "coding-interview-prep", - "superOrder": 11, "challengeOrder": [ [ "bd7158d8c442eddfaeb5bd10", diff --git a/curriculum/challenges/_meta/tensorflow/meta.json b/curriculum/challenges/_meta/tensorflow/meta.json index ba00be4fc9..d28ae876ba 100644 --- a/curriculum/challenges/_meta/tensorflow/meta.json +++ b/curriculum/challenges/_meta/tensorflow/meta.json @@ -5,7 +5,6 @@ "order": 0, "time": "15 hours", "superBlock": "machine-learning-with-python", - "superOrder": 10, "challengeOrder": [ [ "5e8f2f13c4cdbe86b5c72d87", diff --git a/curriculum/getChallenges.js b/curriculum/getChallenges.js index 0ce7a378ba..7d254af58f 100644 --- a/curriculum/getChallenges.js +++ b/curriculum/getChallenges.js @@ -4,6 +4,7 @@ const util = require('util'); const yaml = require('js-yaml'); const { findIndex } = require('lodash'); const readDirP = require('readdirp'); +const { getSuperOrder } = require('./utils'); const { helpCategoryMap } = require('../client/utils/challenge-types'); const { showUpcomingChanges } = require('../config/env.json'); const { curriculum: curriculumLangs } = @@ -296,7 +297,6 @@ ${getFullPath('english')} const { name: blockName, order, - superOrder, isPrivate, required = [], template, @@ -305,7 +305,8 @@ ${getFullPath('english')} } = meta; challenge.block = dasherize(blockName); challenge.order = order; - challenge.superOrder = superOrder; + const superOrder = getSuperOrder(superBlock); + if (superOrder !== null) challenge.superOrder = superOrder; challenge.superBlock = superBlock; challenge.challengeOrder = challengeOrder; challenge.isPrivate = challenge.isPrivate || isPrivate; diff --git a/curriculum/test/test-challenges.js b/curriculum/test/test-challenges.js index a014058772..abe4f2c849 100644 --- a/curriculum/test/test-challenges.js +++ b/curriculum/test/test-challenges.js @@ -50,7 +50,7 @@ const { getTranslatableComments } = require('../getChallenges'); const { challengeSchemaValidator } = require('../schema/challengeSchema'); -const { testedLang } = require('../utils'); +const { testedLang, getSuperOrder } = require('../utils'); const ChallengeTitles = require('./utils/challengeTitles'); const MongoIds = require('./utils/mongoIds'); const createPseudoWorker = require('./utils/pseudo-worker'); @@ -268,22 +268,16 @@ function populateTestsForLang({ lang, challenges, meta }) { ]); superBlocks.forEach(superBlock => { const filteredMeta = Object.values(meta) - /** - * Exclude any meta which doesn't have a superOrder, as these shouldn't - * appear on the learn map and thus don't need to be validated. - */ - .filter( - el => - el.superBlock === superBlock && typeof el.superOrder !== 'undefined' - ) + .filter(el => el.superBlock === superBlock) .sort((a, b) => a.order - b.order); if (!filteredMeta.length) { return; } it(`${superBlock} should have the same order in every meta`, function () { - const firstOrder = filteredMeta[0].superOrder; + const firstOrder = getSuperOrder(filteredMeta[0].superBlock); + assert.isNumber(firstOrder); assert.isTrue( - filteredMeta.every(el => el.superOrder === firstOrder), + filteredMeta.every(el => getSuperOrder(el.superBlock) === firstOrder), 'The superOrder properties are mismatched.' ); }); diff --git a/curriculum/utils.js b/curriculum/utils.js index 481117478c..2e8109eb80 100644 --- a/curriculum/utils.js +++ b/curriculum/utils.js @@ -16,3 +16,32 @@ exports.testedLang = function testedLang() { throw Error('LOCALE must be set for testing'); } }; + +// TODO: migrate to TS and use the SuperBlocks enum from +// config/certification-settings.ts + +const superBlockToOrder = { + 'responsive-web-design': 0, + 'javascript-algorithms-and-data-structures': 1, + 'front-end-development-libraries': 2, + 'data-visualization': 3, + 'relational-databases': 4, + 'back-end-development-and-apis': 5, + 'quality-assurance': 6, + 'scientific-computing-with-python': 7, + 'data-analysis-with-python': 8, + 'information-security': 9, + 'machine-learning-with-python': 10, + 'coding-interview-prep': 11 +}; + +function getSuperOrder(superblock, { isLegacy } = { isLegacy: false }) { + if (typeof superblock !== 'string') + throw Error('superblock must be a string'); + const order = superBlockToOrder[superblock]; + if (typeof order === 'undefined') + throw Error(`${superblock} is not a valid superblock`); + return isLegacy ? order + 12 : order; +} + +exports.getSuperOrder = getSuperOrder; diff --git a/curriculum/utils.test.js b/curriculum/utils.test.js new file mode 100644 index 0000000000..fdcd643f62 --- /dev/null +++ b/curriculum/utils.test.js @@ -0,0 +1,43 @@ +import { getSuperOrder } from './utils'; + +describe('getSuperOrder', () => { + it('returns a number for valid superblocks', () => { + expect.assertions(1); + expect(typeof getSuperOrder('responsive-web-design')).toBe('number'); + }); + + it('throws for unknown superblocks', () => { + expect.assertions(4); + expect(() => getSuperOrder()).toThrow(); + expect(() => getSuperOrder(null)).toThrow(); + expect(() => getSuperOrder('')).toThrow(); + expect(() => getSuperOrder('respansive-wib-desoin')).toThrow(); + }); + + it('throws for "certifications"', () => { + expect.assertions(2); + expect(() => getSuperOrder('certifications')).toThrow(); + expect(() => getSuperOrder('certifications', { isLegacy: true })).toThrow(); + }); + + it('returns unique numbers for all current superblocks', () => { + expect.assertions(12); + expect(getSuperOrder('responsive-web-design')).toBe(0); + expect(getSuperOrder('javascript-algorithms-and-data-structures')).toBe(1); + expect(getSuperOrder('front-end-development-libraries')).toBe(2); + expect(getSuperOrder('data-visualization')).toBe(3); + expect(getSuperOrder('relational-databases')).toBe(4); + expect(getSuperOrder('back-end-development-and-apis')).toBe(5); + expect(getSuperOrder('quality-assurance')).toBe(6); + expect(getSuperOrder('scientific-computing-with-python')).toBe(7); + expect(getSuperOrder('data-analysis-with-python')).toBe(8); + expect(getSuperOrder('information-security')).toBe(9); + expect(getSuperOrder('machine-learning-with-python')).toBe(10); + expect(getSuperOrder('coding-interview-prep')).toBe(11); + }); + + it('returns unique numbers for all legacy superblocks', () => { + expect.assertions(1); + expect(getSuperOrder('responsive-web-design', { isLegacy: true })).toBe(12); + }); +});