UNPKG

nunjucks

Version:

A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)

139 lines (136 loc) 4.72 kB
/* eslint-disable no-console */ 'use strict'; function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var fs = require('fs'); var path = require('path'); var Loader = require('./loader'); var _require = require('./precompiled-loader.js'), PrecompiledLoader = _require.PrecompiledLoader; var chokidar; var FileSystemLoader = /*#__PURE__*/function (_Loader) { _inheritsLoose(FileSystemLoader, _Loader); function FileSystemLoader(searchPaths, opts) { var _this; _this = _Loader.call(this) || this; if (typeof opts === 'boolean') { console.log('[nunjucks] Warning: you passed a boolean as the second ' + 'argument to FileSystemLoader, but it now takes an options ' + 'object. See http://mozilla.github.io/nunjucks/api.html#filesystemloader'); } opts = opts || {}; _this.pathsToNames = {}; _this.noCache = !!opts.noCache; if (searchPaths) { searchPaths = Array.isArray(searchPaths) ? searchPaths : [searchPaths]; // For windows, convert to forward slashes _this.searchPaths = searchPaths.map(path.normalize); } else { _this.searchPaths = ['.']; } if (opts.watch) { // Watch all the templates in the paths and fire an event when // they change try { chokidar = require('chokidar'); // eslint-disable-line global-require } catch (e) { throw new Error('watch requires chokidar to be installed'); } var paths = _this.searchPaths.filter(fs.existsSync); var watcher = chokidar.watch(paths); watcher.on('all', function (event, fullname) { fullname = path.resolve(fullname); if (event === 'change' && fullname in _this.pathsToNames) { _this.emit('update', _this.pathsToNames[fullname], fullname); } }); watcher.on('error', function (error) { console.log('Watcher error: ' + error); }); } return _this; } var _proto = FileSystemLoader.prototype; _proto.getSource = function getSource(name) { var fullpath = null; var paths = this.searchPaths; for (var i = 0; i < paths.length; i++) { var basePath = path.resolve(paths[i]); var p = path.resolve(paths[i], name); // Only allow the current directory and anything // underneath it to be searched if (p.indexOf(basePath) === 0 && fs.existsSync(p)) { fullpath = p; break; } } if (!fullpath) { return null; } this.pathsToNames[fullpath] = name; var source = { src: fs.readFileSync(fullpath, 'utf-8'), path: fullpath, noCache: this.noCache }; this.emit('load', name, source); return source; }; return FileSystemLoader; }(Loader); var NodeResolveLoader = /*#__PURE__*/function (_Loader2) { _inheritsLoose(NodeResolveLoader, _Loader2); function NodeResolveLoader(opts) { var _this2; _this2 = _Loader2.call(this) || this; opts = opts || {}; _this2.pathsToNames = {}; _this2.noCache = !!opts.noCache; if (opts.watch) { try { chokidar = require('chokidar'); // eslint-disable-line global-require } catch (e) { throw new Error('watch requires chokidar to be installed'); } _this2.watcher = chokidar.watch(); _this2.watcher.on('change', function (fullname) { _this2.emit('update', _this2.pathsToNames[fullname], fullname); }); _this2.watcher.on('error', function (error) { console.log('Watcher error: ' + error); }); _this2.on('load', function (name, source) { _this2.watcher.add(source.path); }); } return _this2; } var _proto2 = NodeResolveLoader.prototype; _proto2.getSource = function getSource(name) { // Don't allow file-system traversal if (/^\.?\.?(\/|\\)/.test(name)) { return null; } if (/^[A-Z]:/.test(name)) { return null; } var fullpath; try { fullpath = require.resolve(name); } catch (e) { return null; } this.pathsToNames[fullpath] = name; var source = { src: fs.readFileSync(fullpath, 'utf-8'), path: fullpath, noCache: this.noCache }; this.emit('load', name, source); return source; }; return NodeResolveLoader; }(Loader); module.exports = { FileSystemLoader: FileSystemLoader, PrecompiledLoader: PrecompiledLoader, NodeResolveLoader: NodeResolveLoader };