diff --git a/README.md b/README.md index c23a1cd..4d0aba0 100644 --- a/README.md +++ b/README.md @@ -145,9 +145,7 @@ In your template, the following data is sent : * `path` : the URL path for the folder of the article (without the title) * `realPath` : the system's path for the folder * `escapedTitle` : the code with alphanumeric and underscore characters only -* `error` (error pages only) - * `error` : the error code - * `path` : the resource that caused the error +* `error` (error pages only) : the error code #### 5. Create and init your git source diff --git a/package.json b/package.json index 13fdb88..3b561dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gitblog.md", - "version": "1.2.2", + "version": "1.2.3", "description": "A static blog using Markdown pulled from your git repository.", "main": "src/server.js", "dependencies": { @@ -48,6 +48,7 @@ ] }, "nodemonConfig": { + "verbose": true, "ignore": [ "test/*", "sample_data/*", @@ -55,7 +56,6 @@ "uml/*", "*.log", "README.md" - ], - "delay": "2500" + ] } } diff --git a/sample_data/home/error.ejs b/sample_data/home/error.ejs index 2fdfeea..3bbcdd4 100644 --- a/sample_data/home/error.ejs +++ b/sample_data/home/error.ejs @@ -1,9 +1,8 @@ - - <%= info.title %> - Error <%= error %> <%- include('head'); %> + <%= info.title %> - Error <%= error %>
diff --git a/sample_data/home/head.ejs b/sample_data/home/head.ejs index 0829bed..be46678 100644 --- a/sample_data/home/head.ejs +++ b/sample_data/home/head.ejs @@ -1,21 +1,26 @@ + + + + +<%- `` %> +<%- `` %> <% if(locals.article){ %> + <%- `` %> <%- `` %> <%- `` %> - <%- `` %> - <%- `` %> - <%- `` %> <% if (article.thumbnail) { %> <%- `` %> <%- `` %> <% } %> - + + <% } else { %> + <%- `` %> <%- `` %> <%- `` %> - <%- `` %> - <%- `` %> - <%- `` %> + + <%- `` %> <% } %> diff --git a/sample_data/home/index.ejs b/sample_data/home/index.ejs index 7f975b6..0517fdc 100644 --- a/sample_data/home/index.ejs +++ b/sample_data/home/index.ejs @@ -1,9 +1,8 @@ - - <%= info.title %> - Home <%- include('head'); %> + <%= info.title %> - Home
diff --git a/sample_data/home/template.ejs b/sample_data/home/template.ejs index 6e54334..e2590c1 100644 --- a/sample_data/home/template.ejs +++ b/sample_data/home/template.ejs @@ -1,9 +1,8 @@ - - <%= info.title %> - <%= article.title %> <%- include('head'); %> + <%= info.title %> - <%= article.title %>
diff --git a/src/app.js b/src/app.js index 122ad10..405953c 100644 --- a/src/app.js +++ b/src/app.js @@ -26,6 +26,28 @@ const cons = { }; module.exports = (config) => { + /** + * Fetch articles from the data folder and send success as a response + * @param success + * @param error + */ + let reload; + /** + * Render the page with the view engine and catch errors + * @param req + * @param res + * @param vPath - path of the view + * @param data - data to pass to the view + * @param code - code to send along the page + */ + let render; + /** + * Show an error with the correct page + * @param req + * @param res + * @param code - error code + */ + let showError; const fw = require('./file_walker')(config); const renderer = require('./renderer')(config); @@ -38,12 +60,7 @@ module.exports = (config) => { let lastRSS = ''; let host = config['host']; - /** - * Fetch articles from the data folder and send success as a response - * @param success - * @param error - */ - const reload = (success, error) => { + reload = (success, error) => { fw.fetchArticles((err, dict) => { if (err) { console.error(cons.error, 'error loading articles : ' + err); @@ -65,15 +82,7 @@ module.exports = (config) => { if (config['test']) app.reload = reload; - /** - * Render the page with the view engine and catch errors - * @param req - * @param res - * @param vPath - path of the view - * @param data - data to pass to the view - * @param code - code to send along the page - */ - const render = (req, res, vPath, data, code = 200) => { + render = (req, res, vPath, data, code = 200) => { data.info = { title: config['home']['title'], description: config['home']['description'], @@ -83,27 +92,24 @@ module.exports = (config) => { config: config }; res.render(vPath, data, (err, html) => { - if (err) { + if (err && vPath !== path.join(config['data_dir'], config['home']['error'])) { + console.log(cons.error, `failed to render page ${vPath} : ${err}`); + showError(req, res, 500); + } else if (err) { res.sendStatus(500); - console.log(cons.error, `failed to render ${vPath} : ${err}`); + console.log(cons.error, `failed to render error page : ${err}`); } else res.status(code).send(html); }); }; - /** - * Show an error with the correct page - * @param req - * @param res - * @param code - error code - */ - const showError = (req, res, code) => { + showError = (req, res, code) => { const errorPath = path.join(config['data_dir'], config['home']['error']); fs.access(errorPath, fs.constants.R_OK, (err) => { if (err) res.sendStatus(code); else - render(req, res, errorPath, {error: code, path: req.path}, code); + render(req, res, errorPath, {error: code}, code); }); }; @@ -232,11 +238,10 @@ module.exports = (config) => { }); // catch all hidden file type and return 404 - app.get('*', (req, res, next) => { - if (config['home']['hidden'].includes(path.extname(req.path))) + config['home']['hidden'].forEach(pathMatcher => { + app.get(pathMatcher, (req, res) => { showError(req, res, 404); - else - next(); + }); }); // serve all static files via get diff --git a/src/config.default.json b/src/config.default.json index 4918ed6..0f62c17 100644 --- a/src/config.default.json +++ b/src/config.default.json @@ -18,7 +18,8 @@ "index": "index.ejs", "error": "error.ejs", "hidden": [ - ".ejs" + "*.ejs", + "/.git*" ] }, "article": { diff --git a/test/app.test.js b/test/app.test.js index 1f3e453..b64914b 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -16,16 +16,15 @@ config['data_dir'] = dataDir; config['webhook']['endpoint'] = '/webhooktest'; config['rss']['endpoint'] = '/rsstest'; config['rss']['length'] = 2; -config['home']['index'] = testIndex; config['home']['error'] = testError; config['article']['template'] = testTemplate; const app = require('../src/app')(config); beforeEach((done, fail) => { + config['home']['index'] = testIndex; config['data_dir'] = dataDir; config['article']['index'] = 'index.md'; - config['home']['hidden'] = ['.ejs', '.test']; config['access_log'] = ''; config['error_log'] = ''; config['modules']['rss'] = true; @@ -93,20 +92,20 @@ describe('Test request logging', () => { describe('Test error logging', () => { test('test no log', (done) => { - config['home']['hidden'] = null; - request(app).get('/somefile.txt').then(() => { + config['home']['index'] = null; + request(app).get('/').then(() => { expect(fs.existsSync(path.join(dataDir, 'error.log'))).toBe(false); done(); }); }); test('test null error ', (done) => { - config['home']['hidden'] = null; + config['home']['index'] = null; config['error_log'] = path.join(dataDir, 'error.log'); - request(app).get('/somefile.txt').then(() => { + request(app).get('/').then(() => { fs.readFile(path.join(dataDir, 'error.log'), {encoding: 'UTF-8'}, (err, data) => { expect(err).toBeNull(); const start = data.split('\n').slice(0, 2).join('\n'); - const expected = '500 GET /somefile.txt ' + new Date().toUTCString() + ' ::ffff:127.0.0.1\nTypeError: Cannot read property \'includes\' of null'; + const expected = '500 GET / ' + new Date().toUTCString() + ' ::ffff:127.0.0.1\nTypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type object'; expect(start).toBe(expected); done(); }); @@ -136,6 +135,23 @@ describe('Test root path', () => { done(); }); }); + test('500 render error with page', (done) => { + fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= null.length %>'); + fs.writeFileSync(path.join(dataDir, testError), 'error <%= error %>'); + request(app).get('/').then((response) => { + expect(response.statusCode).toBe(500); + expect(response.text).toBe('error 500'); + done(); + }); + }); + test('500 render error with failing page', (done) => { + fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= null.length %>'); + fs.writeFileSync(path.join(dataDir, testError), 'error <%= null.error %>'); + request(app).get('/').then((response) => { + expect(response.statusCode).toBe(500); + done(); + }); + }); test('200 no articles', (done) => { fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= articles.length %>'); request(app).get('/').then((response) => { @@ -386,8 +402,17 @@ describe('Test static files', () => { }); }); test('404 hidden file', (done) => { - fs.writeFileSync(path.join(dataDir, 'somefile.test'), ''); - request(app).get('/somefile.test').then((response) => { + utils.createEmptyDirs([path.join(dataDir, 'tmp')]); + fs.writeFileSync(path.join(dataDir, 'tmp', 'somefile.ejs'), ''); + request(app).get('/tmp/somefile.ejs').then((response) => { + expect(response.statusCode).toBe(404); + done(); + }); + }); + test('404 hidden folder', (done) => { + utils.createEmptyDirs([path.join(dataDir, '.git')]); + fs.writeFileSync(path.join(dataDir, '.git', 'file.txt'), ''); + request(app).get('/.git/file.txt').then((response) => { expect(response.statusCode).toBe(404); done(); }); diff --git a/test/config.test.js b/test/config.test.js index 04b1bcf..fbe86c0 100644 --- a/test/config.test.js +++ b/test/config.test.js @@ -77,5 +77,5 @@ test('array fix', () => { fs.writeFileSync(configFile, '{"home":{"hidden":{}}}'); const config = require('../src/config')(); expect(config).toBeDefined(); - expect(config['home']['hidden']).toEqual(['.ejs']); + expect(config['home']['hidden']).toEqual(['*.ejs', '/.git*']); }); \ No newline at end of file