Skip to content

Commit

Permalink
Emit 'load' events on Loader and Environment instances
Browse files Browse the repository at this point in the history
refs #1153
  • Loading branch information
fdintino committed Mar 4, 2019
1 parent b828158 commit 35e3ad7
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 29 deletions.
2 changes: 1 addition & 1 deletion nunjucks/src/compiler.js
Expand Up @@ -5,7 +5,7 @@ const transformer = require('./transformer');
const nodes = require('./nodes');
const {TemplateError} = require('./lib');
const {Frame} = require('./runtime');
const Obj = require('./object');
const {Obj} = require('./object');

// These are all the same for now, but shouldn't be passed straight
// through
Expand Down
24 changes: 17 additions & 7 deletions nunjucks/src/environment.js
Expand Up @@ -8,7 +8,7 @@ const filters = require('./filters');
const {FileSystemLoader, WebLoader, PrecompiledLoader} = require('./loaders');
const tests = require('./tests');
const globals = require('./globals');
const Obj = require('./object');
const {Obj, EmitterObj} = require('./object');
const globalRuntime = require('./runtime');
const {handleError, Frame} = globalRuntime;
const expressApp = require('./express-app');
Expand Down Expand Up @@ -37,7 +37,7 @@ const noopTmplSrc = {
}
};

class Environment extends Obj {
class Environment extends EmitterObj {
init(loaders, opts) {
// The dev flag determines the trace that'll be shown on errors.
// If set to true, returns the full trace from the error point,
Expand Down Expand Up @@ -82,7 +82,7 @@ class Environment extends Obj {
);
}

this.initCache();
this._initLoaders();

this.globals = globals();
this.filters = {};
Expand All @@ -95,18 +95,28 @@ class Environment extends Obj {
lib._entries(tests).forEach(([name, test]) => this.addTest(name, test));
}

initCache() {
// Caching and cache busting
_initLoaders() {
this.loaders.forEach((loader) => {
// Caching and cache busting
loader.cache = {};
if (typeof loader.on === 'function') {
loader.on('update', (template) => {
loader.cache[template] = null;
loader.on('update', (name, fullname) => {
loader.cache[name] = null;
this.emit('update', name, fullname, loader);
});
loader.on('load', (name, source) => {
this.emit('load', name, source, loader);
});
}
});
}

invalidateCache() {
this.loaders.forEach((loader) => {
loader.cache = {};
});
}

addExtension(name, extension) {
extension.__name = name;
this.extensions[name] = extension;
Expand Down
18 changes: 2 additions & 16 deletions nunjucks/src/loader.js
@@ -1,23 +1,9 @@
'use strict';

const path = require('path');
const Obj = require('./object');

module.exports = class Loader extends Obj {
on(name, func) {
this.listeners = this.listeners || {};
this.listeners[name] = this.listeners[name] || [];
this.listeners[name].push(func);
}

emit(name, ...args) {
if (this.listeners && this.listeners[name]) {
this.listeners[name].forEach((listener) => {
listener(...args);
});
}
}
const {EmitterObj} = require('./object');

module.exports = class Loader extends EmitterObj {
resolve(from, to) {
return path.resolve(path.dirname(from), to);
}
Expand Down
6 changes: 4 additions & 2 deletions nunjucks/src/node-loaders.js
Expand Up @@ -45,7 +45,7 @@ class FileSystemLoader extends Loader {
watcher.on('all', (event, fullname) => {
fullname = path.resolve(fullname);
if (event === 'change' && fullname in this.pathsToNames) {
this.emit('update', this.pathsToNames[fullname]);
this.emit('update', this.pathsToNames[fullname], fullname);
}
});
watcher.on('error', (error) => {
Expand Down Expand Up @@ -76,11 +76,13 @@ class FileSystemLoader extends Loader {

this.pathsToNames[fullpath] = name;

return {
const source = {
src: fs.readFileSync(fullpath, 'utf-8'),
path: fullpath,
noCache: this.noCache
};
this.emit('load', name, source);
return source;
}
}

Expand Down
2 changes: 1 addition & 1 deletion nunjucks/src/nodes.js
@@ -1,6 +1,6 @@
'use strict';

const Obj = require('./object');
const {Obj} = require('./object');

function traverseAndCheck(obj, type, results) {
if (obj instanceof type) {
Expand Down
25 changes: 24 additions & 1 deletion nunjucks/src/object.js
@@ -1,6 +1,7 @@
'use strict';

// A simple class system, more documentation to come
const EventEmitter = require('events');
const lib = require('./lib');

function parentWrap(parent, prop) {
Expand Down Expand Up @@ -59,4 +60,26 @@ class Obj {
}
}

module.exports = Obj;
class EmitterObj extends EventEmitter {
constructor(...args) {
super();
// Unfortunately necessary for backwards compatibility
this.init(...args);
}

init() {}

get typename() {
return this.constructor.name;
}

static extend(name, props) {
if (typeof name === 'object') {
props = name;
name = 'anonymous';
}
return extendClass(this, name, props);
}
}

module.exports = { Obj, EmitterObj };
2 changes: 1 addition & 1 deletion nunjucks/src/parser.js
Expand Up @@ -2,7 +2,7 @@

var lexer = require('./lexer');
var nodes = require('./nodes');
var Obj = require('./object');
var Obj = require('./object').Obj;
var lib = require('./lib');

class Parser extends Obj {
Expand Down
1 change: 1 addition & 0 deletions nunjucks/src/web-loaders.js
Expand Up @@ -45,6 +45,7 @@ class WebLoader extends Loader {
path: name,
noCache: !useCache
};
this.emit('load', name, result);
if (cb) {
cb(null, result);
}
Expand Down

0 comments on commit 35e3ad7

Please sign in to comment.