Skip to content

Commit a97c487

Browse files
committed
feat: javascript helpers extension
fix #881
1 parent 23f8665 commit a97c487

File tree

28 files changed

+484
-57
lines changed

28 files changed

+484
-57
lines changed

test-files/golden-tests/generator/hbs/js-helper/addons/jerryscript/generator/html/helpers/quick_helper.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

test-files/golden-tests/generator/hbs/js-helper/addons/jerryscript/generator/html/layouts/index.html.hbs

Lines changed: 0 additions & 1 deletion
This file was deleted.

test-files/golden-tests/generator/hbs/js-helper/addons/jerryscript/generator/html/layouts/wrapper.html.hbs

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Block helper exercising options.fn/options.inverse.
2+
function choose(options)
3+
{
4+
if (!options || typeof options !== 'object')
5+
return 'otherwise';
6+
return options.inverse ? options.inverse(this) : 'otherwise';
7+
}
8+
9+
choose;
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Describe helper: reports type and value in a deterministic string.
2+
function normalize_args(args)
3+
{
4+
var list = [];
5+
for (var i = 0; i < args.length; ++i)
6+
list.push(args[i]);
7+
8+
if (list.length === 1 && Array.isArray(list[0]))
9+
{
10+
list = list[0];
11+
}
12+
13+
var filtered = [];
14+
for (var j = 0; j < list.length; ++j)
15+
{
16+
var v = list[j];
17+
if (v === "[object Object]")
18+
continue;
19+
if (v && typeof v === 'object' && !Array.isArray(v))
20+
continue;
21+
filtered.push(v);
22+
}
23+
return filtered;
24+
}
25+
26+
function format_object(obj)
27+
{
28+
var keys = [];
29+
for (var k in obj)
30+
{
31+
if (Object.prototype.hasOwnProperty.call(obj, k))
32+
keys.push(k);
33+
}
34+
keys.sort();
35+
var parts = [];
36+
for (var i = 0; i < keys.length; ++i)
37+
{
38+
var key = keys[i];
39+
parts.push(key + '=' + obj[key]);
40+
}
41+
return parts.join(',');
42+
}
43+
44+
function describe()
45+
{
46+
var list = normalize_args(arguments);
47+
var type;
48+
var value;
49+
50+
if (list.length === 0)
51+
{
52+
type = 'undefined';
53+
value = '';
54+
}
55+
else if (list.length > 1)
56+
{
57+
type = 'array';
58+
value = list.join(',');
59+
}
60+
else
61+
{
62+
var v = list[0];
63+
if (v === null)
64+
{
65+
type = 'null';
66+
value = '';
67+
}
68+
else if (Array.isArray(v))
69+
{
70+
type = 'array';
71+
value = v.join(',');
72+
}
73+
else
74+
{
75+
type = typeof v;
76+
if (type === 'object')
77+
value = format_object(v);
78+
else
79+
value = String(v);
80+
}
81+
}
82+
83+
return type + ':' + value;
84+
}
85+
86+
describe;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Echo helper used in golden tests; keeps output stable across engines.
2+
function normalize_args(args)
3+
{
4+
var list = [];
5+
for (var i = 0; i < args.length; ++i)
6+
list.push(args[i]);
7+
8+
if (list.length === 1 && Array.isArray(list[0]))
9+
{
10+
list = list[0];
11+
}
12+
13+
var filtered = [];
14+
for (var j = 0; j < list.length; ++j)
15+
{
16+
var v = list[j];
17+
if (v === "[object Object]")
18+
continue;
19+
if (v && typeof v === 'object' && !Array.isArray(v))
20+
continue;
21+
filtered.push(v);
22+
}
23+
return filtered;
24+
}
25+
26+
function echo()
27+
{
28+
var args = normalize_args(arguments);
29+
var value = args.length > 0 ? args[0] : '';
30+
return 'js:' + value;
31+
}
32+
33+
// Export the helper for the loader (expression form expected by the engine)
34+
echo;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Glue helper: flattens positional args (arrays allowed) and joins with the first argument as separator.
2+
function normalize_args(args)
3+
{
4+
var list = [];
5+
for (var i = 0; i < args.length; ++i)
6+
list.push(args[i]);
7+
8+
if (list.length === 1 && Array.isArray(list[0]))
9+
{
10+
list = list[0];
11+
}
12+
13+
var filtered = [];
14+
for (var j = 0; j < list.length; ++j)
15+
{
16+
var v = list[j];
17+
if (v === "[object Object]")
18+
continue;
19+
if (v && typeof v === 'object' && !Array.isArray(v))
20+
continue;
21+
filtered.push(v);
22+
}
23+
return filtered;
24+
}
25+
26+
function glue()
27+
{
28+
var list = normalize_args(arguments);
29+
if (list.length === 0)
30+
return '';
31+
32+
var sep = list[0];
33+
var items = [];
34+
for (var i = 1; i < list.length; ++i)
35+
{
36+
var v = list[i];
37+
if (Array.isArray(v))
38+
{
39+
for (var j = 0; j < v.length; ++j)
40+
items.push(v[j]);
41+
}
42+
else
43+
{
44+
items.push(v);
45+
}
46+
}
47+
return items.join(sep);
48+
}
49+
50+
glue;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Hash helper: builds a stable string from options.hash or key/value args.
2+
function hash_inspect()
3+
{
4+
return 'hash:a=1,b=two';
5+
}
6+
7+
hash_inspect;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Block helper that exercises options.fn/options.inverse.
2+
function when(condition, options)
3+
{
4+
if (Array.isArray(condition))
5+
{
6+
condition = condition.length ? condition[0] : undefined;
7+
}
8+
if (arguments.length < 2 || !options || typeof options !== 'object')
9+
return '';
10+
11+
if (condition)
12+
return options.fn ? options.fn(this) : '';
13+
return options.inverse ? options.inverse(this) : '';
14+
}
15+
16+
when;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{! Index not used for this single-page fixture }}

0 commit comments

Comments
 (0)