(err)
| 41 | }) |
| 42 | |
| 43 | function loadedAnswers(err) { |
| 44 | if (err) throw err |
| 45 | var exNames = Object.keys(exercises) |
| 46 | var exLinks = exNames.map(function(k) { return exercises[k] }) |
| 47 | var exSlugs = exLinks.map(function(k) { return exmap[k] }) |
| 48 | var exFiles = exSlugs.map(function(link, i) { |
| 49 | var dir = path.resolve(root, link) |
| 50 | |
| 51 | return fs.readdirSync(dir).map(function(name) { |
| 52 | return path.resolve(dir, name) |
| 53 | }) |
| 54 | }) |
| 55 | |
| 56 | var exRoutes = exLinks.map(function(link, i) { |
| 57 | return require('./exercises/' + link + '/server.js')(exFiles[i]) |
| 58 | }) |
| 59 | |
| 60 | var menu = beefy({ |
| 61 | cwd: path.join(__dirname, 'menu') |
| 62 | , entries: ['index.js'] |
| 63 | , quiet: false |
| 64 | , watchify: false |
| 65 | }) |
| 66 | |
| 67 | http.createServer(function(req, res) { |
| 68 | // Force the addition of a query string. This |
| 69 | // works around an issue in beefy until it gets fixed: |
| 70 | // https://github.com/stackgl/shader-school/issues/107 |
| 71 | req.url = req.url.indexOf('?') === -1 |
| 72 | ? req.url + '?' |
| 73 | : req.url |
| 74 | |
| 75 | var uri = url.parse(req.url).pathname |
| 76 | var paths = uri.split('/').filter(Boolean) |
| 77 | |
| 78 | if (uri === '/style.css') { |
| 79 | res.setHeader('content-type', 'text/css') |
| 80 | res.end(styles()) |
| 81 | return |
| 82 | } |
| 83 | |
| 84 | if (paths[0] === 'open') { |
| 85 | var exPath = exmap[paths[1]] |
| 86 | if (exPath) { |
| 87 | opener(path.join(root, exPath)) |
| 88 | } |
| 89 | return res.end(closeWindow) |
| 90 | } |
| 91 | |
| 92 | for (var i = 0; i < exLinks.length; i++) { |
| 93 | if (uri.indexOf(exLinks[i]) === 1) { |
| 94 | req.url = req.url |
| 95 | .replace(exLinks[i], '') |
| 96 | .replace(/\/+/g, '/') |
| 97 | |
| 98 | return exRoutes[i](req, res) |
| 99 | } |
| 100 | } |
nothing calls this directly
no outgoing calls
no test coverage detected