feat(seed): add dasherized titles to unpacked filenames
This commit is contained in:
committed by
Mrugesh Mohapatra
parent
7133fd8516
commit
d01e0e421e
@ -499,6 +499,8 @@ When editing the unpacked files, you must only insert or edit lines between comm
|
|||||||
|
|
||||||
Unpacked lines that begin with `//--JSON:` are parsed and inserted verbatim.
|
Unpacked lines that begin with `//--JSON:` are parsed and inserted verbatim.
|
||||||
|
|
||||||
|
If you want to **add a challenge**, **change the order** of challenges in a block, or **edit the title** or any other fields of a challenge, you must do that work *inside the main seed JSON file* and then re-run `unpack`.
|
||||||
|
|
||||||
## Challenge Template
|
## Challenge Template
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -539,9 +541,9 @@ see also
|
|||||||
|
|
||||||
- [Challenge Style Guide](seed/challenge-style-guide.md)
|
- [Challenge Style Guide](seed/challenge-style-guide.md)
|
||||||
|
|
||||||
- [Challenge schema](../common/models/challenge.json) - lists all of the fields inside challenge, and describes some of them
|
- [Challenge schema](./common/models/challenge.json) - lists all of the fields inside challenge, and describes some of them
|
||||||
|
|
||||||
- [Challenge types](../common/ap/utils/challengeTypes.js) - what the numeric challenge type values mean (enum)
|
- [Challenge types](./common/ap/utils/challengeTypes.js) - what the numeric challenge type values mean (enum)
|
||||||
|
|
||||||
|
|
||||||
### How We Review and Merge Pull Requests
|
### How We Review and Merge Pull Requests
|
||||||
@ -595,9 +597,9 @@ Be sure to post in the PR conversation that you have made the requested changes.
|
|||||||
|
|
||||||
- [Contributing to FreeCodeCamp - Writing ES6 Challenge Tests ](https://www.youtube.com/watch?v=iOdD84OSfAE#t=2h49m55s) - a video following [Ethan Arrowood](https://twitter.com/ArrowoodTech) as he contributes to the curriculum
|
- [Contributing to FreeCodeCamp - Writing ES6 Challenge Tests ](https://www.youtube.com/watch?v=iOdD84OSfAE#t=2h49m55s) - a video following [Ethan Arrowood](https://twitter.com/ArrowoodTech) as he contributes to the curriculum
|
||||||
|
|
||||||
- [Challenge schema](../common/models/challenge.json) - lists all of the fields inside challenge, and describes some of them
|
- [Challenge schema](./common/models/challenge.json) - lists all of the fields inside challenge, and describes some of them
|
||||||
|
|
||||||
- [Challenge types](../common/ap/utils/challengeTypes.js) - what the numeric challenge type values mean (enum)
|
- [Challenge types](./common/ap/utils/challengeTypes.js) - what the numeric challenge type values mean (enum)
|
||||||
|
|
||||||
* Bugs and Issues:
|
* Bugs and Issues:
|
||||||
|
|
||||||
|
@ -5,3 +5,6 @@ export function dashify(str) {
|
|||||||
.replace(/[^a-z0-9\-\.]/gi, '')
|
.replace(/[^a-z0-9\-\.]/gi, '')
|
||||||
.replace(/\:/g, '');
|
.replace(/\:/g, '');
|
||||||
}
|
}
|
||||||
|
// todo: unify with server/utils/index.js:dasherize
|
||||||
|
const dasherize = dashify;
|
||||||
|
export { dasherize };
|
||||||
|
@ -3,10 +3,8 @@ import fs from 'fs-extra';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import {UnpackedChallenge, ChallengeFile} from './unpackedChallenge';
|
import {UnpackedChallenge, ChallengeFile} from './unpackedChallenge';
|
||||||
|
|
||||||
const jsdiff = require('diff');
|
|
||||||
|
|
||||||
// Repack all challenges from all
|
// Repack all challenges from all
|
||||||
// seed/unpacked/00-foo/bar/000-id.html files
|
// seed/unpacked/00-foo/bar/000-xxx-id.html files
|
||||||
// into
|
// into
|
||||||
// seed/challenges/00-foo/bar.json files
|
// seed/challenges/00-foo/bar.json files
|
||||||
|
|
||||||
|
@ -15,9 +15,10 @@ import {UnpackedChallenge, ChallengeFile} from './unpackedChallenge';
|
|||||||
// todo: figure out embedded images etc. served from elsewhere in the project
|
// todo: figure out embedded images etc. served from elsewhere in the project
|
||||||
// todo: prettier/clearer CSS
|
// todo: prettier/clearer CSS
|
||||||
|
|
||||||
|
let unpackedDir = path.join(__dirname, 'unpacked');
|
||||||
|
|
||||||
// bundle up the test-running JS
|
// bundle up the test-running JS
|
||||||
function createUnpackedBundle() {
|
function createUnpackedBundle() {
|
||||||
let unpackedDir = path.join(__dirname, 'unpacked');
|
|
||||||
fs.mkdirp(unpackedDir, (err) => {
|
fs.mkdirp(unpackedDir, (err) => {
|
||||||
if (err && err.code !== 'EEXIST') {
|
if (err && err.code !== 'EEXIST') {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
@ -44,20 +45,34 @@ function createUnpackedBundle() {
|
|||||||
|
|
||||||
let currentlyUnpackingDir = null;
|
let currentlyUnpackingDir = null;
|
||||||
|
|
||||||
|
async function cleanUnpackedDir(unpackedChallengeBlockDir) {
|
||||||
|
let promiseToDelete = function(filePath) {
|
||||||
|
filePath = path.join(unpackedChallengeBlockDir, filePath);
|
||||||
|
return new Promise(() => fs.unlink(filePath));
|
||||||
|
};
|
||||||
|
let promises = fs.readdirSync(unpackedChallengeBlockDir)
|
||||||
|
.filter(filePath => (/\.html$/i).test(filePath))
|
||||||
|
.map(promiseToDelete);
|
||||||
|
await Promise.all(promises);
|
||||||
|
}
|
||||||
|
|
||||||
function unpackChallengeBlock(challengeBlock) {
|
function unpackChallengeBlock(challengeBlock) {
|
||||||
let challengeBlockPath = path.parse(challengeBlock.fileName);
|
let challengeBlockPath = path.parse(challengeBlock.fileName);
|
||||||
let unpackedChallengeBlockDir = path.join(
|
let unpackedChallengeBlockDir = path.join(
|
||||||
__dirname,
|
unpackedDir,
|
||||||
'unpacked',
|
|
||||||
challengeBlockPath.dir,
|
challengeBlockPath.dir,
|
||||||
challengeBlockPath.name
|
challengeBlockPath.name
|
||||||
);
|
);
|
||||||
|
|
||||||
fs.mkdirp(unpackedChallengeBlockDir, (err) => {
|
fs.mkdirp(unpackedChallengeBlockDir, (err) => {
|
||||||
if (err && err.code !== 'EEXIST') {
|
if (err && err.code !== 'EEXIST') {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove existing unpacked files
|
||||||
|
cleanUnpackedDir(unpackedChallengeBlockDir);
|
||||||
|
|
||||||
if (currentlyUnpackingDir !== challengeBlockPath.dir) {
|
if (currentlyUnpackingDir !== challengeBlockPath.dir) {
|
||||||
currentlyUnpackingDir = challengeBlockPath.dir;
|
currentlyUnpackingDir = challengeBlockPath.dir;
|
||||||
console.log(`Unpacking into ${currentlyUnpackingDir}:`);
|
console.log(`Unpacking into ${currentlyUnpackingDir}:`);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
import fs from 'fs-extra';
|
import fs from 'fs-extra';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
import { dasherize } from '../common/utils';
|
||||||
|
|
||||||
const jsonLinePrefix = '//--JSON:';
|
const jsonLinePrefix = '//--JSON:';
|
||||||
const paragraphBreak = '<!--break-->';
|
const paragraphBreak = '<!--break-->';
|
||||||
@ -28,7 +29,6 @@ class ChallengeFile {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
readChunks() {
|
readChunks() {
|
||||||
// todo: make this work async
|
// todo: make this work async
|
||||||
// todo: make sure it works with encodings
|
// todo: make sure it works with encodings
|
||||||
@ -142,7 +142,7 @@ class UnpackedChallenge {
|
|||||||
// eslint-disable-next-line no-nested-ternary
|
// eslint-disable-next-line no-nested-ternary
|
||||||
let prefix = ((this.index < 10) ? '00' : (this.index < 100) ? '0' : '')
|
let prefix = ((this.index < 10) ? '00' : (this.index < 100) ? '0' : '')
|
||||||
+ this.index;
|
+ this.index;
|
||||||
return `${prefix}-${this.challenge.id}`;
|
return `${prefix}-${dasherize(this.challenge.title)}-${this.challenge.id}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
expandedDescription() {
|
expandedDescription() {
|
||||||
|
Reference in New Issue
Block a user