Socket
Socket
Sign inDemoInstall

vancat

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vancat - npm Package Compare versions

Comparing version 1.0.2 to 1.0.3

2

package.json
{
"name": "vancat",
"version": "1.0.2",
"version": "1.0.3",
"description": "A fast and small templating engine for client side rendering HTML",

@@ -5,0 +5,0 @@ "author": "Serhat Abdulbakioğlu",

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.Vancat = factory());
}(this, (function () { 'use strict';
typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory())
: typeof define === 'function' && define.amd
? define(factory)
: ((global = global || self), (global.Vancat = factory()));
})(this, function () {
'use strict';
/*!
* vancat.js - Fast and small templating engine
* v1.0.2
* https://github.com/serhat359/vancat-js
*/
/*!
* vancat.js - Fast and small templating engine
* v1.0.3
* https://github.com/serhat359/vancat-js
*/
var Vancat = (function () {
const registeredHelpers = {
not: (x) => !x,
};
const registeredPartials = {};
const registerHelper = (name, f) => (registeredHelpers[name] = f);
const registerPartial = (name, template) =>
(registeredPartials[name] = compileToStatements(template));
const compile = (template) => {
const statements = compileToStatements(template);
return (data, helpers = {}) => {
const parts = [];
const writer = (x) => parts.push(x);
const context = {
contextData: { $: data },
get(key) {
return (
this.contextData[key] ??
helpers[key] ??
registeredHelpers[key] ??
this.contextData.$[key]
);
},
set(name, val) {
this.contextData[name] = val;
},
replaceContextData(data) {
const old = this.contextData;
this.contextData = { $: data };
return old;
},
setContextData(data) {
this.contextData = data;
},
var Vancat = (function () {
const registeredHelpers = {
not: (x) => !x,
};
const registeredPartials = {};
const registerHelper = (name, f) => (registeredHelpers[name] = f);
const registerPartial = (name, template) =>
(registeredPartials[name] = compileToStatements(template));
const compile = (template) => {
const statements = compileToStatements(template);
return (data, helpers = {}) => {
const parts = [];
const writer = (x) => parts.push(x);
const context = {
contextData: { $: data },
get(key) {
return (
this.contextData[key] ??
helpers[key] ??
registeredHelpers[key] ??
this.contextData.$[key]
);
},
set(name, val) {
this.contextData[name] = val;
},
getDirect(name) {
return this.contextData[name];
},
replaceContextData(data) {
const old = this.contextData;
this.contextData = { $: data };
return old;
},
setContextData(data) {
this.contextData = data;
},
};
runStatements(writer, context, statements);
return parts.join('');
};
runStatements(writer, context, statements);
return parts.join('');
};
};
const compileToStatements = (template) => {
const statements = [];
let end = 0;
let statement;
while (end < template.length) {
[statement, end] = getStatement(template, end);
if (!statement) err('Unexpected end token');
statements.push(statement);
}
return statements;
};
const getStatement = (template, start) => {
if (start == template.length) err('Expected {{end}} but not found');
const i = template.indexOf('{{', start);
if (i == start) {
if (template[i + 2] === '>') {
// handle partial here
const [tokens, end] = getTokens(template, i + 3);
const templateName = tokens[0];
if (!templateName) err('Template name not specified');
const expr = getExpression(tokens, 1);
const statement = (writer, context) => {
const partialStatements = registeredPartials[templateName];
if (!partialStatements) err(`Partial not registered: ${templateName}`);
const newData = expr(context);
const oldData = context.replaceContextData(newData);
runStatements(writer, context, partialStatements);
context.setContextData(oldData);
};
return [statement, end];
const compileToStatements = (template) => {
const statements = [];
let end = 0;
let statement;
while (end < template.length) {
[statement, end] = getStatement(template, end);
if (!statement) err('Unexpected end token');
statements.push(statement);
}
let [tokens, end] = getTokens(template, i + 2);
const first = tokens[0];
if (first === 'for') {
let loopType = tokens[2];
if (loopType !== 'in') {
const inIndex = tokens.indexOf('in');
if (inIndex > 2) {
tokens = mergeTokens(tokens, inIndex);
loopType = tokens[2];
} else err('Missing "in" in for-loop');
return statements;
};
const getStatement = (template, start) => {
if (start == template.length) err('Expected {{end}} but not found');
const i = template.indexOf('{{', start);
if (i == start) {
if (template[i + 2] === '>') {
// handle partial here
const [tokens, end] = getTokens(template, i + 3);
const templateName = tokens[0];
if (!templateName) err('Template name not specified');
const expr = getExpression(tokens, 1);
const statement = (writer, context) => {
const partialStatements = registeredPartials[templateName];
if (!partialStatements) err(`Partial not registered: ${templateName}`);
const newData = expr(context);
const oldData = context.replaceContextData(newData);
runStatements(writer, context, partialStatements);
context.setContextData(oldData);
};
return [statement, end];
}
const [t1, t2] = tokens[1].split(',');
const loopValuesExpr = getExpression(tokens, 3);
let statements;
[statements, end] = getInnerStatements(template, end);
const forStatement = (writer, context) => {
const loopValues = loopValuesExpr(context);
if (loopValues == null)
err(`Value of '${tokens.slice(3).join(' ')}' was not iterable`);
if (isIterable(loopValues)) {
let i = 0;
for (const val of loopValues) {
context.set(t1, val);
if (t2) context.set(t2, i);
runStatements(writer, context, statements);
i++;
}
} else {
for (const key in loopValues) {
context.set(t2, key);
context.set(t1, loopValues[key]);
runStatements(writer, context, statements);
}
let [tokens, end] = getTokens(template, i + 2);
const first = tokens[0];
if (first === 'for') {
let loopType = tokens[2];
if (loopType !== 'in') {
const inIndex = tokens.indexOf('in');
if (inIndex > 2) {
tokens = mergeTokens(tokens, inIndex);
loopType = tokens[2];
} else err('Missing "in" in for-loop');
}
};
return [forStatement, end];
} else if (first === 'if') {
const ifExpr = getExpression(tokens, 1);
let ifStatements = [];
let elseStatements = [];
let elseIfGroups = [];
let nextType;
let statement;
while (true) {
nextType = getNextStatementType(template, end);
if (nextType === 'else') {
break;
}
end = skipWhiteSpace(template, end);
if (nextType === 'end') {
[statement, end] = getStatement(template, end); // Read {{end}}
const ifStatement = (writer, context) => {
if (ifExpr(context)) runStatements(writer, context, ifStatements);
};
return [ifStatement, end];
} else {
[statement, end] = getStatement(template, end);
ifStatements.push(statement);
}
}
const createIfStatement = () => (writer, context) => {
if (ifExpr(context)) {
runStatements(writer, context, ifStatements);
return;
}
for (const [expr, statements] of elseIfGroups) {
if (expr(context)) {
runStatements(writer, context, statements);
return;
const [t1, t2] = tokens[1].split(',');
const loopValuesExpr = getExpression(tokens, 3);
let statements;
[statements, end] = getInnerStatements(template, end);
const forStatement = (writer, context) => {
const loopValues = loopValuesExpr(context);
if (loopValues == null)
err(`Value of '${tokens.slice(3).join(' ')}' was not iterable`);
const t1Old = context.getDirect(t1);
const t2Old = context.getDirect(t2);
if (isIterable(loopValues)) {
let i = 0;
for (const val of loopValues) {
context.set(t1, val);
if (t2) context.set(t2, i);
runStatements(writer, context, statements);
i++;
}
} else {
for (const key in loopValues) {
context.set(t2, key);
context.set(t1, loopValues[key]);
runStatements(writer, context, statements);
}
}
}
runStatements(writer, context, elseStatements);
};
// Has else here as the next type
while (true) {
[tokens, end] = getTokens(template, end + 2);
if (tokens.length == 1) {
while (true) {
[statement, end] = getStatement(template, end);
if (!statement) break;
elseStatements.push(statement);
}
const ifStatement = createIfStatement();
return [ifStatement, end];
}
// Else-if here
if (tokens[1] !== 'if') err('if missing from else-if statement');
let elseIfExpr = getExpression(tokens, 2);
let elseIfStatements = [];
context.set(t1, t1Old);
context.set(t2, t2Old);
};
return [forStatement, end];
} else if (first === 'if') {
const ifExpr = getExpression(tokens, 1);
let ifStatements = [];
let elseStatements = [];
let elseIfGroups = [];
let nextType;
let statement;
while (true) {
nextType = getNextStatementType(template, end);
if (nextType === 'else') {
elseIfGroups.push([elseIfExpr, elseIfStatements]);
break;
}
end = skipWhiteSpace(template, end);
if (nextType == null) {
if (nextType === 'end') {
[statement, end] = getStatement(template, end); // Read {{end}}
const ifStatement = (writer, context) => {
if (ifExpr(context)) runStatements(writer, context, ifStatements);
};
return [ifStatement, end];
} else {
[statement, end] = getStatement(template, end);
elseIfStatements.push(statement);
continue;
} else if (nextType === 'end') {
elseIfGroups.push([elseIfExpr, elseIfStatements]);
[statement, end] = getStatement(template, end); // Read {{end}}
ifStatements.push(statement);
}
}
const createIfStatement = () => (writer, context) => {
if (ifExpr(context)) {
runStatements(writer, context, ifStatements);
return;
}
for (const [expr, statements] of elseIfGroups) {
if (expr(context)) {
runStatements(writer, context, statements);
return;
}
}
runStatements(writer, context, elseStatements);
};
// Has else here as the next type
while (true) {
[tokens, end] = getTokens(template, end + 2);
if (tokens.length == 1) {
while (true) {
[statement, end] = getStatement(template, end);
if (!statement) break;
elseStatements.push(statement);
}
const ifStatement = createIfStatement();
return [ifStatement, end];
}
err('Tag not closed with }}');
// Else-if here
if (tokens[1] !== 'if') err('if missing from else-if statement');
let elseIfExpr = getExpression(tokens, 2);
let elseIfStatements = [];
while (true) {
nextType = getNextStatementType(template, end);
if (nextType === 'else') {
elseIfGroups.push([elseIfExpr, elseIfStatements]);
break;
}
end = skipWhiteSpace(template, end);
if (nextType == null) {
[statement, end] = getStatement(template, end);
elseIfStatements.push(statement);
continue;
} else if (nextType === 'end') {
elseIfGroups.push([elseIfExpr, elseIfStatements]);
[statement, end] = getStatement(template, end); // Read {{end}}
const ifStatement = createIfStatement();
return [ifStatement, end];
}
err('Tag not closed with }}');
}
}
} else if (first === 'end') {
return [null, end];
} else if (first === 'else') {
err('Unexpected else token');
} else if (first === 'set') {
const varName = tokens[1];
const expr = getExpression(tokens, 2);
const statement = (writer, context) => context.set(varName, expr(context));
return [statement, end];
}
} else if (first === 'end') {
return [null, end];
} else if (first === 'else') {
err('Unexpected else token');
} else if (first === 'set') {
const varName = tokens[1];
const expr = getExpression(tokens, 2);
const statement = (writer, context) => context.set(varName, expr(context));
return [statement, end];
// Get expression as statement
const expr = getExpression(tokens, 0);
const stmt = (writer, context) => writer(htmlEncode(expr(context)));
return [stmt, end];
} else if (i < 0) {
return [template.substring(start), template.length];
} else {
return [template.substring(start, i), i];
}
// Get expression as statement
const expr = getExpression(tokens, 0);
const stmt = (writer, context) => writer(htmlEncode(expr(context)));
return [stmt, end];
} else if (i < 0) {
return [template.substring(start), template.length];
} else {
return [template.substring(start, i), i];
}
};
const getInnerStatements = (template, end) => {
const statements = [];
let statement;
while (true) {
[statement, end] = getStatement(template, end);
if (!statement) break;
statements.push(statement);
}
return [statements, end];
};
const getNextStatementType = (template, start) => {
start = skipWhiteSpace(template, start);
if (start + 1 < template.length && template[start] === '{' && template[start + 1] === '{') {
start += 2;
while (template[start] === ' ') start++;
const tempStart = start++;
while (start < template.length && template[start] !== '}' && template[start] !== ' ')
start++;
return template.substring(tempStart, start);
}
return null;
};
const skipWhiteSpace = (template, start) => {
while (start < template.length && /\s/.test(template[start])) start++;
return start;
};
const getTokens = (template, i) => {
const tokens = [];
while (true) {
while (template[i] === ' ') i++;
if (template[i] === '}' && template[i + 1] === '}') return [tokens, i + 2];
const start = i++;
while (i < template.length && template[i] !== '}' && template[i] !== ' ') i++;
const token = template.substring(start, i);
if (!token) err('Tag not closed with }}');
tokens.push(token);
}
};
const getExpression = (tokens, start) => {
if (tokens.length - start == 0 || tokens[start] === '.') {
if (tokens.length == 0) err('Expression cannot be empty');
else err(`Expression expected after: ${tokens.slice(0, start).join(' ')}`);
}
if (tokens.length - start == 1) return getTokenAsExpression(tokens[start]);
const f = tokens[start];
if (f.includes('.')) err(`Function name cannot contain a dot character: ${f}`);
const argGroups = getArgGroups(tokens, start + 1);
if (argGroups.length == 1) {
const expr = argGroups[0];
};
const getInnerStatements = (template, end) => {
const statements = [];
let statement;
while (true) {
[statement, end] = getStatement(template, end);
if (!statement) break;
statements.push(statement);
}
return [statements, end];
};
const getNextStatementType = (template, start) => {
start = skipWhiteSpace(template, start);
if (start + 1 < template.length && template[start] === '{' && template[start + 1] === '{') {
start += 2;
while (template[start] === ' ') start++;
const tempStart = start++;
while (start < template.length && template[start] !== '}' && template[start] !== ' ')
start++;
return template.substring(tempStart, start);
}
return null;
};
const skipWhiteSpace = (template, start) => {
while (start < template.length && /\s/.test(template[start])) start++;
return start;
};
const getTokens = (template, i) => {
const tokens = [];
while (true) {
while (template[i] === ' ') i++;
if (template[i] === '}' && template[i + 1] === '}') return [tokens, i + 2];
const start = i++;
while (i < template.length && template[i] !== '}' && template[i] !== ' ') i++;
const token = template.substring(start, i);
if (!token) err('Tag not closed with }}');
tokens.push(token);
}
};
const getExpression = (tokens, start) => {
if (tokens.length - start == 0 || tokens[start] === '.') {
if (tokens.length == 0) err('Expression cannot be empty');
else err(`Expression expected after: ${tokens.slice(0, start).join(' ')}`);
}
if (tokens.length - start == 1) return getTokenAsExpression(tokens[start]);
const f = tokens[start];
if (f.includes('.')) err(`Function name cannot contain a dot character: ${f}`);
const argGroups = getArgGroups(tokens, start + 1);
if (argGroups.length == 1) {
const expr = argGroups[0];
return (context) => {
const func = getFunc(f, context);
return func(expr(context));
};
}
return (context) => {
const func = getFunc(f, context);
return func(expr(context));
const args = argGroups.map((expr) => expr(context));
return func.apply(null, args);
};
}
return (context) => {
const func = getFunc(f, context);
const args = argGroups.map((expr) => expr(context));
return func.apply(null, args);
};
};
const getTokenAsExpression = (token) => {
const expr = getTokenAsExpressionInner(token);
return (context) => {
try {
return expr(context);
} catch (e) {
err(`Error while resolving: ${token}`);
const getTokenAsExpression = (token) => {
const expr = getTokenAsExpressionInner(token);
return (context) => {
try {
return expr(context);
} catch (e) {
err(`Error while resolving: ${token}`);
}
};
};
const getTokenAsExpressionInner = (token) => {
const parsedNumber = Number(token);
if (!isNaN(parsedNumber)) return (context) => parsedNumber;
const subTokens = token.split('.');
for (const x of subTokens) {
if (!x) err(`Invalid member access expression: ${token}`);
}
const t = subTokens[0];
if (subTokens.length == 1) {
return (context) => context.get(t);
}
if (subTokens.length == 2) {
const k = subTokens[1];
return (context) => context.get(t)[k];
}
if (subTokens.length == 3) {
const k1 = subTokens[1];
const k2 = subTokens[2];
return (context) => context.get(t)[k1][k2];
}
return (context) => {
let o = context.get(t);
for (let i = 1; i < subTokens.length; i++) o = o[subTokens[i]];
return o;
};
};
};
const getTokenAsExpressionInner = (token) => {
const parsedNumber = Number(token);
if (!isNaN(parsedNumber)) return (context) => parsedNumber;
const subTokens = token.split('.');
for (const x of subTokens) {
if (!x) err(`Invalid member access expression: ${token}`);
}
const t = subTokens[0];
if (subTokens.length == 1) {
return (context) => context.get(t);
}
if (subTokens.length == 2) {
const k = subTokens[1];
return (context) => context.get(t)[k];
}
if (subTokens.length == 3) {
const k1 = subTokens[1];
const k2 = subTokens[2];
return (context) => context.get(t)[k1][k2];
}
return (context) => {
let o = context.get(t);
for (let i = 1; i < subTokens.length; i++) o = o[subTokens[i]];
return o;
const getArgGroups = (tokens, index) => {
const expressions = [];
while (index < tokens.length) expressions.push(getTokenAsExpression(tokens[index++]));
return expressions;
};
};
const getArgGroups = (tokens, index) => {
const expressions = [];
while (index < tokens.length) expressions.push(getTokenAsExpression(tokens[index++]));
return expressions;
};
const getFunc = (f, context) => {
const func = context.get(f);
if (typeof func !== 'function') err(`value of ${f} was not a function`);
return func;
};
const mergeTokens = (tokens, inIndex) => [
tokens[0],
tokens.slice(1, inIndex).join(''),
...tokens.slice(inIndex),
];
const runStatements = (writer, context, statements) => {
for (const stmt of statements)
if (typeof stmt === 'string') writer(stmt);
else stmt(writer, context);
};
const htmlEncode = (s) => {
s = String(s ?? '');
return /[&<>\'\"]/.test(s)
? s
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/'/g, '&#39;')
.replace(/"/g, '&#34;')
: s;
};
const isIterable = (obj) => {
if (obj == null) return false;
return typeof obj[Symbol.iterator] === 'function';
};
const err = (msg) => {
throw new Error(msg);
};
return { compile, registerHelper, registerPartial };
})();
return Vancat;
})));
const getFunc = (f, context) => {
const func = context.get(f);
if (typeof func !== 'function') err(`value of ${f} was not a function`);
return func;
};
const mergeTokens = (tokens, inIndex) => [
tokens[0],
tokens.slice(1, inIndex).join(''),
...tokens.slice(inIndex),
];
const runStatements = (writer, context, statements) => {
for (const stmt of statements)
if (typeof stmt === 'string') writer(stmt);
else stmt(writer, context);
};
const htmlEncode = (s) => {
s = String(s ?? '');
return /[&<>\'\"]/.test(s)
? s
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/'/g, '&#39;')
.replace(/"/g, '&#34;')
: s;
};
const isIterable = (obj) => {
if (obj == null) return false;
return typeof obj[Symbol.iterator] === 'function';
};
const err = (msg) => {
throw new Error(msg);
};
return { compile, registerHelper, registerPartial };
})();
return Vancat;
});

@@ -1,2 +0,2 @@

/* Vancat v1.0.2 */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vancat=t()}(this,function(){return function(){let e={not:e=>!e},t={},n=(t,n)=>e[t]=n,r=(e,n)=>t[e]=i(n),l=t=>{let n=i(t);return(t,r={})=>{let l=[],i=e=>l.push(e);return _(i,{contextData:{$:t},get(t){return this.contextData[t]??r[t]??e[t]??this.contextData.$[t]},set(e,t){this.contextData[e]=t},replaceContextData(e){let t=this.contextData;return this.contextData={$:e},t},setContextData(e){this.contextData=e}},n),l.join("")}},i=e=>{let t=[],n=0,r;for(;n<e.length;)[r,n]=o(e,n),r||D("Unexpected end token"),t.push(r);return t},o=(e,n)=>{n==e.length&&D("Expected {{end}} but not found");let r=e.indexOf("{{",n);if(r==n){if(">"===e[r+2]){let[l,i]=a(e,r+3),p=l[0];p||D("Template name not specified");let g=c(l,1),h=(e,n)=>{let r=t[p];r||D(`Partial not registered: ${p}`);let l=g(n),i=n.replaceContextData(l);_(e,n,r),n.setContextData(i)};return[h,i]}let[d,b]=a(e,r+2),y=d[0];if("for"===y){let w=d[2];if("in"!==w){let j=d.indexOf("in");j>2?w=(d=x(d,j))[2]:D('Missing "in" in for-loop')}let[C,E]=d[1].split(","),k=c(d,3),v;[v,b]=f(e,b);let T=(e,t)=>{let n=k(t);if(null==n&&D(`Value of '${d.slice(3).join(" ")}' was not iterable`),$(n)){let r=0;for(let l of n)t.set(C,l),E&&t.set(E,r),_(e,t,v),r++}else for(let i in n)t.set(E,i),t.set(C,n[i]),_(e,t,v)};return[T,b]}if("if"===y){let O=c(d,1),U=[],V=[],F=[],I,M;for(;"else"!==(I=s(e,b));){if(b=u(e,b),"end"===I){[M,b]=o(e,b);let P=(e,t)=>{O(t)&&_(e,t,U)};return[P,b]}[M,b]=o(e,b),U.push(M)}let q=()=>(e,t)=>{if(O(t)){_(e,t,U);return}for(let[n,r]of F)if(n(t)){_(e,t,r);return}_(e,t,V)};for(;;){if([d,b]=a(e,b+2),1==d.length){for(;[M,b]=o(e,b),M;)V.push(M);let z=q();return[z,b]}"if"!==d[1]&&D("if missing from else-if statement");let A=c(d,2),B=[];for(;;){if("else"===(I=s(e,b))){F.push([A,B]);break}if(b=u(e,b),null==I){[M,b]=o(e,b),B.push(M);continue}if("end"===I){F.push([A,B]),[M,b]=o(e,b);let G=q();return[G,b]}D("Tag not closed with }}")}}}else if("end"===y)return[null,b];else if("else"===y)D("Unexpected else token");else if("set"===y){let H=d[1],J=c(d,2),K=(e,t)=>t.set(H,J(t));return[K,b]}let L=c(d,0),N=(e,t)=>e(m(L(t)));return[N,b]}return r<0?[e.substring(n),e.length]:[e.substring(n,r),r]},f=(e,t)=>{let n=[],r;for(;[r,t]=o(e,t),r;)n.push(r);return[n,t]},s=(e,t)=>{if((t=u(e,t))+1<e.length&&"{"===e[t]&&"{"===e[t+1]){for(t+=2;" "===e[t];)t++;let n=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;return e.substring(n,t)}return null},u=(e,t)=>{for(;t<e.length&&/\s/.test(e[t]);)t++;return t},a=(e,t)=>{let n=[];for(;;){for(;" "===e[t];)t++;if("}"===e[t]&&"}"===e[t+1])return[n,t+2];let r=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;let l=e.substring(r,t);l||D("Tag not closed with }}"),n.push(l)}},c=(e,t)=>{if((e.length-t==0||"."===e[t])&&(0==e.length?D("Expression cannot be empty"):D(`Expression expected after: ${e.slice(0,t).join(" ")}`)),e.length-t==1)return p(e[t]);let n=e[t];n.includes(".")&&D(`Function name cannot contain a dot character: ${n}`);let r=h(e,t+1);if(1==r.length){let l=r[0];return e=>{let t=d(n,e);return t(l(e))}}return e=>{let t=d(n,e),l=r.map(t=>t(e));return t.apply(null,l)}},p=e=>{let t=g(e);return n=>{try{return t(n)}catch(r){D(`Error while resolving: ${e}`)}}},g=e=>{let t=Number(e);if(!isNaN(t))return e=>t;let n=e.split(".");for(let r of n)r||D(`Invalid member access expression: ${e}`);let l=n[0];if(1==n.length)return e=>e.get(l);if(2==n.length){let i=n[1];return e=>e.get(l)[i]}if(3==n.length){let o=n[1],f=n[2];return e=>e.get(l)[o][f]}return e=>{let t=e.get(l);for(let r=1;r<n.length;r++)t=t[n[r]];return t}},h=(e,t)=>{let n=[];for(;t<e.length;)n.push(p(e[t++]));return n},d=(e,t)=>{let n=t.get(e);return"function"!=typeof n&&D(`value of ${e} was not a function`),n},x=(e,t)=>[e[0],e.slice(1,t).join(""),...e.slice(t),],_=(e,t,n)=>{for(let r of n)"string"==typeof r?e(r):r(e,t)},m=e=>(e=String(e??""),/[&<>\'\"]/.test(e)?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&#34;"):e),$=e=>null!=e&&"function"==typeof e[Symbol.iterator],D=e=>{throw Error(e)};return{compile:l,registerHelper:n,registerPartial:r}}()});
/* Vancat v1.0.3 */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vancat=t()}(this,function(){return function(){let e={not:e=>!e},t={},n=(t,n)=>e[t]=n,r=(e,n)=>t[e]=i(n),l=t=>{let n=i(t);return(t,r={})=>{let l=[],i=e=>l.push(e);return _(i,{contextData:{$:t},get(t){return this.contextData[t]??r[t]??e[t]??this.contextData.$[t]},set(e,t){this.contextData[e]=t},getDirect(e){return this.contextData[e]},replaceContextData(e){let t=this.contextData;return this.contextData={$:e},t},setContextData(e){this.contextData=e}},n),l.join("")}},i=e=>{let t=[],n=0,r;for(;n<e.length;)[r,n]=o(e,n),r||$("Unexpected end token"),t.push(r);return t},o=(e,n)=>{n==e.length&&$("Expected {{end}} but not found");let r=e.indexOf("{{",n);if(r==n){if(">"===e[r+2]){let[l,i]=a(e,r+3),g=l[0];g||$("Template name not specified");let h=c(l,1),p=(e,n)=>{let r=t[g];r||$(`Partial not registered: ${g}`);let l=h(n),i=n.replaceContextData(l);_(e,n,r),n.setContextData(i)};return[p,i]}let[d,b]=a(e,r+2),y=d[0];if("for"===y){let w=d[2];if("in"!==w){let j=d.indexOf("in");j>2?w=(d=x(d,j))[2]:$('Missing "in" in for-loop')}let[C,E]=d[1].split(","),k=c(d,3),v;[v,b]=s(e,b);let T=(e,t)=>{let n=k(t);null==n&&$(`Value of '${d.slice(3).join(" ")}' was not iterable`);let r=t.getDirect(C),l=t.getDirect(E);if(m(n)){let i=0;for(let o of n)t.set(C,o),E&&t.set(E,i),_(e,t,v),i++}else for(let s in n)t.set(E,s),t.set(C,n[s]),_(e,t,v);t.set(C,r),t.set(E,l)};return[T,b]}if("if"===y){let O=c(d,1),U=[],V=[],F=[],I,M;for(;"else"!==(I=f(e,b));){if(b=u(e,b),"end"===I){[M,b]=o(e,b);let P=(e,t)=>{O(t)&&_(e,t,U)};return[P,b]}[M,b]=o(e,b),U.push(M)}let q=()=>(e,t)=>{if(O(t)){_(e,t,U);return}for(let[n,r]of F)if(n(t)){_(e,t,r);return}_(e,t,V)};for(;;){if([d,b]=a(e,b+2),1==d.length){for(;[M,b]=o(e,b),M;)V.push(M);let z=q();return[z,b]}"if"!==d[1]&&$("if missing from else-if statement");let A=c(d,2),B=[];for(;;){if("else"===(I=f(e,b))){F.push([A,B]);break}if(b=u(e,b),null==I){[M,b]=o(e,b),B.push(M);continue}if("end"===I){F.push([A,B]),[M,b]=o(e,b);let G=q();return[G,b]}$("Tag not closed with }}")}}}else if("end"===y)return[null,b];else if("else"===y)$("Unexpected else token");else if("set"===y){let H=d[1],J=c(d,2),K=(e,t)=>t.set(H,J(t));return[K,b]}let L=c(d,0),N=(e,t)=>e(D(L(t)));return[N,b]}return r<0?[e.substring(n),e.length]:[e.substring(n,r),r]},s=(e,t)=>{let n=[],r;for(;[r,t]=o(e,t),r;)n.push(r);return[n,t]},f=(e,t)=>{if((t=u(e,t))+1<e.length&&"{"===e[t]&&"{"===e[t+1]){for(t+=2;" "===e[t];)t++;let n=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;return e.substring(n,t)}return null},u=(e,t)=>{for(;t<e.length&&/\s/.test(e[t]);)t++;return t},a=(e,t)=>{let n=[];for(;;){for(;" "===e[t];)t++;if("}"===e[t]&&"}"===e[t+1])return[n,t+2];let r=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;let l=e.substring(r,t);l||$("Tag not closed with }}"),n.push(l)}},c=(e,t)=>{if((e.length-t==0||"."===e[t])&&(0==e.length?$("Expression cannot be empty"):$(`Expression expected after: ${e.slice(0,t).join(" ")}`)),e.length-t==1)return g(e[t]);let n=e[t];n.includes(".")&&$(`Function name cannot contain a dot character: ${n}`);let r=p(e,t+1);if(1==r.length){let l=r[0];return e=>{let t=d(n,e);return t(l(e))}}return e=>{let t=d(n,e),l=r.map(t=>t(e));return t.apply(null,l)}},g=e=>{let t=h(e);return n=>{try{return t(n)}catch(r){$(`Error while resolving: ${e}`)}}},h=e=>{let t=Number(e);if(!isNaN(t))return e=>t;let n=e.split(".");for(let r of n)r||$(`Invalid member access expression: ${e}`);let l=n[0];if(1==n.length)return e=>e.get(l);if(2==n.length){let i=n[1];return e=>e.get(l)[i]}if(3==n.length){let o=n[1],s=n[2];return e=>e.get(l)[o][s]}return e=>{let t=e.get(l);for(let r=1;r<n.length;r++)t=t[n[r]];return t}},p=(e,t)=>{let n=[];for(;t<e.length;)n.push(g(e[t++]));return n},d=(e,t)=>{let n=t.get(e);return"function"!=typeof n&&$(`value of ${e} was not a function`),n},x=(e,t)=>[e[0],e.slice(1,t).join(""),...e.slice(t),],_=(e,t,n)=>{for(let r of n)"string"==typeof r?e(r):r(e,t)},D=e=>(e=String(e??""),/[&<>\'\"]/.test(e)?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&#34;"):e),m=e=>null!=e&&"function"==typeof e[Symbol.iterator],$=e=>{throw Error(e)};return{compile:l,registerHelper:n,registerPartial:r}}()});
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc