diff --git a/bin/server.js b/bin/server.js index 65395c8..fa6344b 100755 --- a/bin/server.js +++ b/bin/server.js @@ -1,16 +1,11 @@ #!/usr/bin/env node const config = require('config'); -const co = require('co'); const app = require('app'); const log = require('log')(); -co(function*() { - - yield* app.waitBootAndListen(config.server.host, config.server.port); - +app.waitBootAndListen(config.server.host, config.server.port).then(() => { log.info("App is listening"); - }).catch(function(err) { log.error(err); process.exit(1); // fatal error, could not boot! @@ -18,14 +13,14 @@ co(function*() { // отслеживаем unhandled ошибки // https://iojs.org/api/process.html#process_event_rejectionhandled -var unhandledRejections = []; +let unhandledRejections = []; process.on('unhandledRejection', function(reason, p) { p.trackRejectionId = Math.random(); setTimeout(function() { // 100 ms to catch up and handle rejection if (p.trackRejectionId) { // if not rejectionHandled yet, report unhandledRejections.push(p); - var report = { + let report = { err: reason, trackRejectionId: p.trackRejectionId, length: unhandledRejections.length diff --git a/manifest/.gitkeep b/cache/.gitkeep similarity index 100% rename from manifest/.gitkeep rename to cache/.gitkeep diff --git a/cache/pack.versions.json b/cache/pack.versions.json new file mode 100644 index 0000000..0ca6e00 --- /dev/null +++ b/cache/pack.versions.json @@ -0,0 +1 @@ +{"footer":"/pack/footer.js?edb029e47f90da7ef027","head":"/pack/head.js?edb029e47f90da7ef027","styles":["/pack/styles.js?edb029e47f90da7ef027","/pack/styles.css?2e4f8132ebec0fb8c5aca3229f00f5ef"],"tutorial":"/pack/tutorial.js?edb029e47f90da7ef027"} \ No newline at end of file diff --git a/dev b/dev index 2a37d23..0e6a5a2 100755 --- a/dev +++ b/dev @@ -9,7 +9,7 @@ export NODE_ENV=development export ASSET_VERSIONING=query export WATCH=1 export SITE_HOST=http://javascript.local -export PORT=80 +export PORT=3000 npm --silent run gulp dev | bunyan -o short -l debug diff --git a/edit b/edit index 7248209..aebd074 100755 --- a/edit +++ b/edit @@ -7,7 +7,7 @@ BRANCH="${1:-$NODE_LANG}" export NODE_LANG=$BRANCH export NODE_ENV=production export TUTORIAL_EDIT=1 -export PORT=80 +export PORT=3000 npm --silent run -- gulp edit --root /js/javascript-tutorial-$BRANCH diff --git a/gulpfile.js b/gulpfile.js index 3b27b04..5058f73 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,7 +9,6 @@ const path = require('path'); const fs = require('fs'); const assert = require('assert'); const runSequence = require('run-sequence'); -const ll = require('gulp-ll'); const config = require('config'); @@ -25,9 +24,9 @@ const jsSources = [ function lazyRequireTask(path) { - var args = [].slice.call(arguments, 1); + let args = [].slice.call(arguments, 1); return function(callback) { - var task = require(path).apply(this, args); + let task = require(path).apply(this, args); return task(callback); }; @@ -61,8 +60,6 @@ function requireModuleTasks(moduleName) { } -ll.tasks('nodemon', 'client:webpack', 'server'); - // usage: gulp db:load --from fixture/init --harmony gulp.task('db:load', lazyRequireTask('./tasks/dbLoad')); gulp.task('db:clear', lazyRequireTask('./tasks/dbClear')); @@ -70,7 +67,7 @@ gulp.task('db:clear', lazyRequireTask('./tasks/dbClear')); gulp.task("nodemon", lazyRequireTask('./tasks/nodemon', { // shared client/server code has require('template.jade) which precompiles template on run // so I have to restart server to pickup the template change - ext: "js,jade", + ext: "js,pug", nodeArgs: process.env.NODE_DEBUG ? ['--debug'] : [], script: "./bin/server.js", @@ -95,7 +92,7 @@ gulp.task("client:livereload", lazyRequireTask("./tasks/livereload", { requireModuleTasks('tutorial'); -var testSrcs = ['{handlers,modules}/**/test/**/*.js']; +let testSrcs = ['{handlers,modules}/**/test/**/*.js']; // on Travis, keys are required for E2E Selenium tests // for PRs there are no keys, so we disable E2E if (!process.env.TEST_E2E || process.env.CI && process.env.TRAVIS_SECURE_ENV_VARS=="false") { @@ -129,17 +126,6 @@ gulp.task("client:sync-resources", lazyRequireTask('./tasks/syncResources', { assets: 'public' })); -// show errors if encountered -gulp.task('client:compile-css', - lazyRequireTask('./tasks/compileCss', { - src: './styles/base.styl', - dst: './public/styles', - publicDst: process.env.STATIC_HOST + '/styles/', // from browser point of view - manifest: path.join(config.manifestRoot, 'styles.versions.json'), - assetVersioning: config.assetVersioning - }) -); - gulp.task('client:minify', lazyRequireTask('./tasks/minify')); gulp.task('client:resize-retina-images', lazyRequireTask('./tasks/resizeRetinaImages')); @@ -158,7 +144,7 @@ gulp.task('edit', ['tutorial:importWatch', "client:sync-resources", 'client:live gulp.task('dev', function(callback) { - runSequence("client:sync-resources", ['nodemon', 'client:livereload', 'client:webpack', 'watch'], callback); + runSequence("tutorial:import", "client:sync-resources", ['nodemon', 'client:livereload', 'client:webpack', 'watch'], callback); }); gulp.on('err', function(gulpErr) { diff --git a/handlers/404.js b/handlers/404.js index 4792ca4..30cc8c8 100755 --- a/handlers/404.js +++ b/handlers/404.js @@ -1,9 +1,9 @@ exports.init = function(app) { - // by default if the router didn't find anything => it yields to next middleware + // by default if the router didn't find anything => it awaits to next middleware // so I throw error here manually app.use(function* (next) { - yield* next; + await next; if (this.status == 404) { // still nothing found? let default errorHandler show 404 diff --git a/handlers/accessLogger.js b/handlers/accessLogger.js index a92a71e..830c96a 100755 --- a/handlers/accessLogger.js +++ b/handlers/accessLogger.js @@ -19,7 +19,7 @@ exports.init = function(app) { }, "--> %s %s", req.method, req.originalUrl || req.url); try { - yield next; + await next; } catch (err) { // log uncaught downstream errors log(this, start, err); diff --git a/handlers/bodyParser.js b/handlers/bodyParser.js index c536bbe..b7ee4a8 100755 --- a/handlers/bodyParser.js +++ b/handlers/bodyParser.js @@ -23,14 +23,14 @@ BodyParser.prototype.middleware = function() { if (!self.ignore.check(this.path)) { this.log.debug("bodyParser will parse"); - yield* self.parser.call(this, next); + await self.parser.call(this, next); this.log.debug("bodyParser done parse"); } else { this.log.debug("bodyParser skip"); } - yield* next; + await next; }; }; diff --git a/handlers/conditional.js b/handlers/conditional.js index 70b19f7..b96985f 100755 --- a/handlers/conditional.js +++ b/handlers/conditional.js @@ -13,7 +13,7 @@ exports.init = function(app) { // set expires to this.expires app.use(function* (next) { - yield *next; + await *next; if (!this.expires) return; diff --git a/handlers/csrfCheck.js b/handlers/csrfCheck.js index 0c880ee..81a9225 100755 --- a/handlers/csrfCheck.js +++ b/handlers/csrfCheck.js @@ -12,7 +12,7 @@ CsrfChecker.prototype.middleware = function() { return function*(next) { // skip these methods if (this.method === 'GET' || this.method === 'HEAD' || this.method === 'OPTIONS') { - return yield* next; + return await next; } var checkCsrf = true; @@ -38,7 +38,7 @@ CsrfChecker.prototype.middleware = function() { this.log.debug("csrf skip"); } - yield* next; + await next; }; }; @@ -56,7 +56,7 @@ exports.init = function(app) { try { // first, do the middleware, maybe authorize user in the process - yield* next; + await next; } finally { // then if we have a user, set XSRF token if (this.req.user) { diff --git a/handlers/dev/index.js b/handlers/dev/index.js new file mode 100755 index 0000000..cec3cee --- /dev/null +++ b/handlers/dev/index.js @@ -0,0 +1,6 @@ +var mountHandlerMiddleware = require('lib/mountHandlerMiddleware'); + +exports.init = function(app) { + app.use( mountHandlerMiddleware('/dev', __dirname) ); +}; + diff --git a/handlers/dev/router.js b/handlers/dev/router.js new file mode 100755 index 0000000..36de535 --- /dev/null +++ b/handlers/dev/router.js @@ -0,0 +1,19 @@ +var Router = require('koa-router'); + +var router = module.exports = new Router(); + +router.get('/', async function(ctx) { + ctx.body = ctx.render('index'); + +}); + +router.get('/die', async function(ctx) { + setTimeout(function() { + throw new Error("die"); + }, 10); +}); + +router.get('/test', async function(ctx) { + ctx.body = Math.round(Date.now() / 1000 / 60); +}); + diff --git a/handlers/dev/tasks/convert.js b/handlers/dev/tasks/convert.js new file mode 100755 index 0000000..0dd6d8b --- /dev/null +++ b/handlers/dev/tasks/convert.js @@ -0,0 +1,19 @@ +var co = require('co'); +var fs = require('fs'); +var path = require('path'); +var log = require('log')(); +var gutil = require('gulp-util'); +var glob = require('glob'); +let exec = require('mz/child_process').exec; +let ini = require('ini'); + +module.exports = function(options) { + + return function() { + + return async function() { + console.log("TEST"); + + }(); + }; +}; diff --git a/handlers/dev/templates/index.pug b/handlers/dev/templates/index.pug new file mode 100755 index 0000000..2cf1262 --- /dev/null +++ b/handlers/dev/templates/index.pug @@ -0,0 +1,12 @@ + +extends /layouts/main + +block append variables + - var sitetoolbar = true + - var title = "Test page" + + +block content + + +b.test + +e.hello HELLO \ No newline at end of file diff --git a/handlers/errorHandler/index.js b/handlers/errorHandler/index.js index d4e34a9..3b408db 100755 --- a/handlers/errorHandler/index.js +++ b/handlers/errorHandler/index.js @@ -7,7 +7,7 @@ var isDevelopment = process.env.NODE_ENV == 'development'; // can be called not from this MW, but from anywhere // this.templateDir can be anything -function renderError(err) { +function renderError(ctx, err) { /*jshint -W040 */ // don't pass just err, because for "stack too deep" errors it leads to logging problems @@ -16,22 +16,22 @@ function renderError(err) { stack: err.stack, errors: err.errors, // for validation errors status: err.status, - referer: this.get('referer'), - cookie: this.get('cookie') + referer: ctx.get('referer'), + cookie: ctx.get('cookie') }; if (!err.expose) { // dev error - report.requestVerbose = this.request; + report.requestVerbose = ctx.request; } - this.log.error(report); + ctx.log.error(report); // may be error if headers are already sent! - this.set('X-Content-Type-Options', 'nosniff'); + ctx.set('X-Content-Type-Options', 'nosniff'); - var preferredType = this.accepts('html', 'json'); + var preferredType = ctx.accepts('html', 'json'); if (err.name == 'ValidationError') { - this.status = 400; + ctx.status = 400; if (preferredType == 'json') { var errors = {}; @@ -40,11 +40,11 @@ function renderError(err) { errors[field] = err.errors[field].message; } - this.body = { + ctx.body = { errors: errors }; } else { - this.body = this.render(path.join(__dirname, "templates/400"), { + ctx.body = ctx.render(path.join(__dirname, "templates/400"), { useAbsoluteTemplatePath: true, error: err }); @@ -54,7 +54,7 @@ function renderError(err) { } if (isDevelopment) { - this.status = err.status || 500; + ctx.status = err.status || 500; var stack = (err.stack || '') .split('\n').slice(1) @@ -63,35 +63,35 @@ function renderError(err) { }).join(''); if (preferredType == 'json') { - this.body = { + ctx.body = { message: err.message, stack: stack }; - this.body.statusCode = err.statusCode || err.status; + ctx.body.statusCode = err.statusCode || err.status; } else { - this.type = 'text/html; charset=utf-8'; - this.body = "
Content
'); }); @@ -40,7 +40,7 @@ describe("TaskRenderer", function() { }); const renderer = new TaskRenderer(); - const result = yield renderer.renderSolution(task, {}); + const result = await renderer.renderSolution(task, {}); result.should.be.eql([{title: 'Part 1', content: 'Content 1
\n'}, {title: 'Part 2', content: 'Content 2
\n'}]); diff --git a/locales/site/en.yml b/locales/site/en.yml index c9d45f2..3bb6461 100755 --- a/locales/site/en.yml +++ b/locales/site/en.yml @@ -14,6 +14,7 @@ share: Share donate: Donate read_before_commenting: read before commenting… +tutorial: Tutorial tutorial_map: Tutorial map additional_articles: Additional articles comment: diff --git a/locales/site/ru.yml b/locales/site/ru.yml index 32de4df..2be104f 100755 --- a/locales/site/ru.yml +++ b/locales/site/ru.yml @@ -15,6 +15,7 @@ share: Поделиться donate: Поддержать read_before_commenting: перед тем как писать… +tutorial: Учебник tutorial_map: Карта учебника additional_articles: Дополнительно comment: diff --git a/modules/bemJade.js b/modules/-bemPug.js similarity index 96% rename from modules/bemJade.js rename to modules/-bemPug.js index 1e75401..31770d4 100755 --- a/modules/bemJade.js +++ b/modules/-bemPug.js @@ -1,8 +1,6 @@ // Adapted from bemto.jade, copyright(c) 2012 Roman Komarovnotfigure
'); }); it(`notfigure ![desc](blank.png)`, function*() { - let result = yield* render(this.test.title); + let result = await render(this.test.title); result.trim().should.be.eql('notfigure
'); }); it(`notfigure ![desc](not-exists.png)`, function*() { - let result = yield* render(this.test.title); + let result = await render(this.test.title); result.trim().should.match(/^notfigure .*?<\/p>$/);
});
it(`notfigure ![desc](error.png)`, function*() {
- let result = yield* render(this.test.title);
+ let result = await render(this.test.title);
result.trim().should.match(/^ notfigure .*?<\/p>$/);
});
it(`notfigure ![desc](1.js)`, function*() {
- let result = yield* render(this.test.title);
+ let result = await render(this.test.title);
result.trim().should.match(/^ notfigure .*?<\/p>$/);
});
it(`![figure|height=100 width=200](/url)`, function*() {
- let result = yield* render(this.test.title);
+ let result = await render(this.test.title);
result.trim().should.be.html(`