Skip to main content
Module

x/denjucks/src/lib.js

Deno templating engine
Latest
File
'use strict';
var ArrayProto = Array.prototype;var ObjProto = Object.prototype;
var escapeMap = { '&': '&amp;', '"': '&quot;', '\'': '&#39;', '<': '&lt;', '>': '&gt;'};
var escapeRegex = /[&"'<>]/g;
var lookupEscape = function(ch) { return escapeMap[ch];};
let exports = {};
exports.prettifyError = function(path, withInternals, err) { // jshint -W022 // http://jslinterrors.com/do-not-assign-to-the-exception-parameter if (!err.Update) { // not one of ours, cast it err = new exports.TemplateError(err); } err.Update(path);
// Unless they marked the dev flag, show them a trace from here if (!withInternals) { var old = err; err = new Error(old.message); err.name = old.name; }
return err;};
exports.TemplateError = function(message, lineno, colno) { var err = this;
if (message instanceof Error) { // for casting regular js errors err = message; message = message.name + ': ' + message.message;
try { if(err.name = '') {} } catch(e) { // If we can't set the name of the error object in this // environment, don't use it err = this; } } else { if(Error.captureStackTrace) { Error.captureStackTrace(err); } }
err.name = 'Template render error'; err.message = message; err.lineno = lineno; err.colno = colno; err.firstUpdate = true;
err.Update = function(path) { var message = '(' + (path || 'unknown path') + ')';
// only show lineno + colno next to path of template // where error occurred if (this.firstUpdate) { if(this.lineno && this.colno) { message += ' [Line ' + this.lineno + ', Column ' + this.colno + ']'; } else if(this.lineno) { message += ' [Line ' + this.lineno + ']'; } }
message += '\n '; if (this.firstUpdate) { message += ' '; }
this.message = message + (this.message || ''); this.firstUpdate = false; return this; };
return err;};
exports.TemplateError.prototype = Error.prototype;
exports.escape = function(val) { return val.replace(escapeRegex, lookupEscape);};
exports.isFunction = function(obj) { return ObjProto.toString.call(obj) === '[object Function]';};
exports.isArray = Array.isArray || function(obj) { return ObjProto.toString.call(obj) === '[object Array]';};
exports.isString = function(obj) { return ObjProto.toString.call(obj) === '[object String]';};
exports.isObject = function(obj) { return ObjProto.toString.call(obj) === '[object Object]';};
exports.groupBy = function(obj, val) { var result = {}; var iterator = exports.isFunction(val) ? val : function(obj) { return obj[val]; }; for(var i=0; i<obj.length; i++) { var value = obj[i]; var key = iterator(value, i); (result[key] || (result[key] = [])).push(value); } return result;};
exports.toArray = function(obj) { return Array.prototype.slice.call(obj);};
exports.without = function(array) { var result = []; if (!array) { return result; } var index = -1, length = array.length, contains = exports.toArray(arguments).slice(1);
while(++index < length) { if(exports.indexOf(contains, array[index]) === -1) { result.push(array[index]); } } return result;};
exports.extend = function(obj, obj2) { for(var k in obj2) { obj[k] = obj2[k]; } return obj;};
exports.repeat = function(char_, n) { var str = ''; for(var i=0; i<n; i++) { str += char_; } return str;};
exports.each = function(obj, func, context) { if(obj == null) { return; }
if(ArrayProto.each && obj.each === ArrayProto.each) { obj.forEach(func, context); } else if(obj.length === +obj.length) { for(var i=0, l=obj.length; i<l; i++) { func.call(context, obj[i], i, obj); } }};
exports.map = function(obj, func) { var results = []; if(obj == null) { return results; }
if(ArrayProto.map && obj.map === ArrayProto.map) { return obj.map(func); }
for(var i=0; i<obj.length; i++) { results[results.length] = func(obj[i], i); }
if(obj.length === +obj.length) { results.length = obj.length; }
return results;};
exports.asyncIter = function(arr, iter, cb) { var i = -1;
function next() { i++;
if(i < arr.length) { iter(arr[i], i, next, cb); } else { cb(); } }
next();};
exports.asyncFor = function(obj, iter, cb) { var keys = exports.keys(obj); var len = keys.length; var i = -1;
function next() { i++; var k = keys[i];
if(i < len) { iter(k, obj[k], i, len, next); } else { cb(); } }
next();};
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Polyfillexports.indexOf = Array.prototype.indexOf ? function (arr, searchElement, fromIndex) { return Array.prototype.indexOf.call(arr, searchElement, fromIndex); } : function (arr, searchElement, fromIndex) { var length = this.length >>> 0; // Hack to convert object.length to a UInt32
fromIndex = +fromIndex || 0;
if(Math.abs(fromIndex) === Infinity) { fromIndex = 0; }
if(fromIndex < 0) { fromIndex += length; if (fromIndex < 0) { fromIndex = 0; } }
for(;fromIndex < length; fromIndex++) { if (arr[fromIndex] === searchElement) { return fromIndex; } }
return -1; };
if(!Array.prototype.map) { Array.prototype.map = function() { throw new Error('map is unimplemented for this js engine'); };}
exports.keys = function(obj) { if(Object.prototype.keys) { return obj.keys(); } else { var keys = []; for(var k in obj) { if(obj.hasOwnProperty(k)) { keys.push(k); } } return keys; }};
exports.inOperator = function (key, val) { if (exports.isArray(val)) { return exports.indexOf(val, key) !== -1; } else if (exports.isObject(val)) { return key in val; } else if (exports.isString(val)) { return val.indexOf(key) !== -1; } else { throw new Error('Cannot use "in" operator to search for "' + key + '" in unexpected types.'); }};
export default {...exports};