UNPKG

3.25 kBJavaScriptView Raw
1'use strict';
2
3var _ = require('lodash');
4
5function helper(paper) {
6 paper.handlebars.registerHelper('unless', function () {
7 const options = arguments[arguments.length - 1];
8 arguments[arguments.length - 1] = Object.assign({}, options, {
9 fn: options.inverse || (() => false),
10 inverse: options.fn || (() => true),
11 hash: options.hash
12 });
13
14 return paper.handlebars.helpers['if'].apply(this, arguments);
15 });
16
17 paper.handlebars.registerHelper('if', function (lvalue, operator, rvalue) {
18 const options = arguments[arguments.length - 1];
19 let result;
20
21 function isOptions(obj) {
22 return _.isObject(obj) && obj.fn;
23 }
24
25 // Only parameter
26 if (isOptions(operator)) {
27 // If an array is passed as the only parameter
28 if (_.isArray(lvalue)) {
29 result = !!lvalue.length;
30 }
31 // If an empty object is passed, treat as false
32 else if (_.isEmpty(lvalue) && _.isObject(lvalue)) {
33 result = false;
34 }
35 // Everything else
36 else {
37 result = !!lvalue;
38 }
39 } else {
40
41 if (isOptions(rvalue)) {
42 // @TODO: this is block is for backwards compatibility with 'compare' helper
43 // Remove after operator='==' is removed from stencil theme
44 rvalue = operator;
45 operator = options.hash.operator || "==";
46 }
47
48 switch (operator) {
49 case '==':
50 result = (lvalue == rvalue);
51 break;
52
53 case '===':
54 result = (lvalue === rvalue);
55 break;
56
57 case '!=':
58 result = (lvalue != rvalue);
59 break;
60
61 case '!==':
62 result = (lvalue !== rvalue);
63 break;
64
65 case '<':
66 result = (lvalue < rvalue);
67 break;
68
69 case '>':
70 result = (lvalue > rvalue);
71 break;
72
73 case '<=':
74 result = (lvalue <= rvalue);
75 break;
76
77 case '>=':
78 result = (lvalue >= rvalue);
79 break;
80
81 case 'gtnum':
82 if ((typeof lvalue === 'string') && (typeof(rvalue) === 'string') && (!isNaN(lvalue)) && (!isNaN(rvalue))) {
83 result = (parseInt(lvalue) > parseInt(rvalue));
84 break;
85 } else {
86 throw new Error("Handlerbars Helper if gtnum accepts ONLY valid number string");
87 }
88
89 case 'typeof':
90 result = (typeof lvalue === rvalue);
91 break;
92
93 default:
94 throw new Error("Handlerbars Helper 'if' doesn't know the operator " + operator);
95 }
96 }
97
98 if (!options.fn || !options.inverse) {
99 options.fn = () => true;
100 options.inverse = () => false;
101 }
102
103 if (result) {
104 return options.fn(this);
105 } else {
106 return options.inverse(this);
107 }
108 });
109}
110
111module.exports = helper;