@grafana/create-plugin 2.11.2 → 2.12.0-canary.658.dabaee1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/run.js +13 -18
- package/dist/commands/generate/prettify-files.js +15 -70
- package/dist/commands/generate/print-success-message.js +28 -31
- package/dist/commands/generate/prompt-user.js +23 -91
- package/dist/commands/generate/update-go-sdk-and-packages.js +36 -105
- package/dist/commands/generate.command.js +122 -240
- package/dist/commands/index.js +5 -21
- package/dist/commands/migrate.command.js +71 -134
- package/dist/commands/provisioning.command.js +30 -85
- package/dist/commands/types.js +1 -2
- package/dist/commands/update.command.js +44 -97
- package/dist/commands/version.command.js +16 -57
- package/dist/constants.js +37 -32
- package/dist/utils/tests/utils.files.test.js +21 -23
- package/dist/utils/tests/utils.handlebars.test.js +24 -26
- package/dist/utils/tests/utils.npm.test.js +103 -95
- package/dist/utils/tests/utils.plugin.test.js +11 -13
- package/dist/utils/tests/utils.templates.test.js +16 -18
- package/dist/utils/utils.config.js +30 -32
- package/dist/utils/utils.console.js +25 -31
- package/dist/utils/utils.files.js +38 -104
- package/dist/utils/utils.handlebars.js +30 -65
- package/dist/utils/utils.npm.js +75 -118
- package/dist/utils/utils.os.js +3 -7
- package/dist/utils/utils.packageManager.js +31 -37
- package/dist/utils/utils.packagejson.js +13 -22
- package/dist/utils/utils.path.js +7 -14
- package/dist/utils/utils.plugin.js +6 -13
- package/dist/utils/utils.templates.js +58 -80
- package/dist/utils/utils.version.js +9 -11
- package/package.json +20 -6
- package/src/bin/run.ts +2 -2
- package/src/commands/generate/prettify-files.ts +1 -1
- package/src/commands/generate/print-success-message.ts +4 -4
- package/src/commands/generate/prompt-user.ts +2 -2
- package/src/commands/generate/update-go-sdk-and-packages.ts +2 -2
- package/src/commands/generate.command.ts +15 -15
- package/src/commands/index.ts +5 -5
- package/src/commands/migrate.command.ts +6 -6
- package/src/commands/provisioning.command.ts +6 -6
- package/src/commands/types.ts +1 -1
- package/src/commands/update.command.ts +5 -5
- package/src/commands/version.command.ts +5 -2
- package/src/constants.ts +4 -1
- package/src/utils/tests/utils.files.test.ts +2 -2
- package/src/utils/tests/utils.handlebars.test.ts +2 -2
- package/src/utils/tests/utils.npm.test.ts +43 -34
- package/src/utils/tests/utils.plugin.test.ts +2 -2
- package/src/utils/tests/utils.templates.test.ts +2 -2
- package/src/utils/utils.config.ts +3 -3
- package/src/utils/utils.console.ts +16 -11
- package/src/utils/utils.files.ts +3 -3
- package/src/utils/utils.handlebars.ts +3 -3
- package/src/utils/utils.npm.ts +3 -3
- package/src/utils/utils.packageManager.ts +3 -3
- package/src/utils/utils.packagejson.ts +5 -5
- package/src/utils/utils.path.ts +3 -3
- package/src/utils/utils.plugin.ts +2 -3
- package/src/utils/utils.templates.ts +10 -10
- package/src/utils/utils.version.ts +5 -2
- package/tsconfig.json +5 -0
- package/vitest.config.ts +10 -0
|
@@ -1,48 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var TerminalRenderer = require('marked-terminal');
|
|
7
|
-
var _a = require('enquirer'), Confirm = _a.Confirm, Select = _a.Select;
|
|
1
|
+
import { marked } from 'marked';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import TerminalRenderer from 'marked-terminal';
|
|
4
|
+
import Enquirer from 'enquirer';
|
|
5
|
+
const { prompt } = Enquirer;
|
|
8
6
|
marked.setOptions({
|
|
9
7
|
renderer: new TerminalRenderer({
|
|
10
8
|
firstHeading: chalk.hex('#ff9900').underline.bold,
|
|
11
9
|
}),
|
|
12
10
|
});
|
|
13
|
-
function displayAsMarkdown(msg) {
|
|
11
|
+
export function displayAsMarkdown(msg) {
|
|
14
12
|
return marked(msg);
|
|
15
13
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return " - ".concat(files.map(function (t) { return "`".concat(t, "`"); }).join('\n - '));
|
|
14
|
+
export function displayArrayAsList(files) {
|
|
15
|
+
return ` - ${files.map((t) => `\`${t}\``).join('\n - ')}`;
|
|
19
16
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
console.log(displayAsMarkdown("\n".concat(msg)));
|
|
17
|
+
export function printMessage(msg) {
|
|
18
|
+
console.log(displayAsMarkdown(`\n${msg}`));
|
|
23
19
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
console.log(displayAsMarkdown("\n\u2714 ".concat(msg)).trim());
|
|
20
|
+
export function printSuccessMessage(msg) {
|
|
21
|
+
console.log(displayAsMarkdown(`\n✔ ${msg}`).trim());
|
|
27
22
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.error(displayAsMarkdown("\n\u274C ".concat(error)));
|
|
23
|
+
export function printError(error) {
|
|
24
|
+
console.error(displayAsMarkdown(`\n❌ ${error}`));
|
|
31
25
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
export async function confirmPrompt(message) {
|
|
27
|
+
const question = await prompt({
|
|
28
|
+
name: 'confirmPrompt',
|
|
29
|
+
type: 'confirm',
|
|
36
30
|
message: displayAsMarkdown(message),
|
|
37
31
|
});
|
|
38
|
-
return
|
|
32
|
+
return question['confirmPrompt'];
|
|
39
33
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
export async function selectPrompt(message, choices) {
|
|
35
|
+
const question = await prompt({
|
|
36
|
+
name: 'selectPrompt',
|
|
37
|
+
type: 'select',
|
|
38
|
+
choices,
|
|
44
39
|
message: displayAsMarkdown(message),
|
|
45
40
|
});
|
|
46
|
-
return
|
|
41
|
+
return question['selectPrompt'];
|
|
47
42
|
}
|
|
48
|
-
exports.selectPrompt = selectPrompt;
|
|
@@ -1,143 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
-
};
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.isFileStartingWith = exports.getExportFileName = exports.getExportTemplateName = exports.removeFilesInCwd = exports.getOnlyNotExistingInCwd = exports.getOnlyExistingInCwd = exports.directoryExists = exports.readJsonFile = exports.isFile = exports.filterOutCommonFiles = void 0;
|
|
43
|
-
var path_1 = __importDefault(require("path"));
|
|
44
|
-
var fs_1 = __importDefault(require("fs"));
|
|
45
|
-
var constants_1 = require("../constants");
|
|
46
|
-
var promises_1 = require("fs/promises");
|
|
47
|
-
function filterOutCommonFiles(files, pluginType) {
|
|
48
|
-
var isFileCommonAndOverriden = function (file) {
|
|
49
|
-
return file.includes(constants_1.TEMPLATE_PATHS.common) &&
|
|
50
|
-
files.includes(file.replace(constants_1.TEMPLATE_PATHS.common, constants_1.TEMPLATE_PATHS[pluginType]));
|
|
51
|
-
};
|
|
52
|
-
return files.filter(function (file) { return (isFileCommonAndOverriden(file) ? false : true); });
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { TEMPLATE_PATHS } from '../constants.js';
|
|
4
|
+
import { access, constants } from 'fs/promises';
|
|
5
|
+
export function filterOutCommonFiles(files, pluginType) {
|
|
6
|
+
const isFileCommonAndOverriden = (file) => file.includes(TEMPLATE_PATHS.common) &&
|
|
7
|
+
files.includes(file.replace(TEMPLATE_PATHS.common, TEMPLATE_PATHS[pluginType]));
|
|
8
|
+
return files.filter((file) => (isFileCommonAndOverriden(file) ? false : true));
|
|
53
9
|
}
|
|
54
|
-
|
|
55
|
-
function isFile(path) {
|
|
10
|
+
export function isFile(path) {
|
|
56
11
|
try {
|
|
57
|
-
return
|
|
12
|
+
return fs.lstatSync(path).isFile();
|
|
58
13
|
}
|
|
59
14
|
catch (e) {
|
|
60
15
|
return false;
|
|
61
16
|
}
|
|
62
17
|
}
|
|
63
|
-
|
|
64
|
-
function readJsonFile(filename) {
|
|
18
|
+
export function readJsonFile(filename) {
|
|
65
19
|
if (!isFile(filename)) {
|
|
66
|
-
throw new Error(
|
|
20
|
+
throw new Error(`There is no "${path.basename(filename)}" file found at "${filename}". Make sure you run this command from a plugins root directory.`);
|
|
67
21
|
}
|
|
68
22
|
try {
|
|
69
|
-
return JSON.parse(
|
|
23
|
+
return JSON.parse(fs.readFileSync(filename).toString());
|
|
70
24
|
}
|
|
71
25
|
catch (error) {
|
|
72
|
-
error.message =
|
|
26
|
+
error.message = `Cannot parse the "${path.basename(filename)}" file at ${filename}.`;
|
|
73
27
|
throw error;
|
|
74
28
|
}
|
|
75
29
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return [4, (0, promises_1.access)(path, promises_1.constants.F_OK)];
|
|
85
|
-
case 1:
|
|
86
|
-
_a.sent();
|
|
87
|
-
return [2, true];
|
|
88
|
-
case 2:
|
|
89
|
-
e_1 = _a.sent();
|
|
90
|
-
return [2, false];
|
|
91
|
-
case 3: return [2];
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
});
|
|
30
|
+
export async function directoryExists(path) {
|
|
31
|
+
try {
|
|
32
|
+
await access(path, constants.F_OK);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
95
38
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return files.filter(function (file) { return fs_1.default.existsSync(path_1.default.join(process.cwd(), file)); });
|
|
39
|
+
export function getOnlyExistingInCwd(files) {
|
|
40
|
+
return files.filter((file) => fs.existsSync(path.join(process.cwd(), file)));
|
|
99
41
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return files.filter(function (file) { return !fs_1.default.existsSync(path_1.default.join(process.cwd(), file)); });
|
|
42
|
+
export function getOnlyNotExistingInCwd(files) {
|
|
43
|
+
return files.filter((file) => !fs.existsSync(path.join(process.cwd(), file)));
|
|
103
44
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
var file = files_1[_i];
|
|
108
|
-
fs_1.default.rmSync(path_1.default.join(process.cwd(), file), { recursive: true, force: true });
|
|
45
|
+
export function removeFilesInCwd(files) {
|
|
46
|
+
for (const file of files) {
|
|
47
|
+
fs.rmSync(path.join(process.cwd(), file), { recursive: true, force: true });
|
|
109
48
|
}
|
|
110
49
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
for (var _i = 0, _a = Object.entries(configFileNamesMap); _i < _a.length; _i++) {
|
|
115
|
-
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
50
|
+
export function getExportTemplateName(f) {
|
|
51
|
+
const baseName = path.basename(f);
|
|
52
|
+
for (const [key, value] of Object.entries(configFileNamesMap)) {
|
|
116
53
|
if (value === baseName) {
|
|
117
54
|
return key;
|
|
118
55
|
}
|
|
119
56
|
}
|
|
120
57
|
return baseName;
|
|
121
58
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
var baseName = path_1.default.basename(f);
|
|
59
|
+
export function getExportFileName(f) {
|
|
60
|
+
const baseName = path.basename(f);
|
|
125
61
|
if (Object.keys(configFileNamesMap).includes(baseName)) {
|
|
126
62
|
return configFileNamesMap[baseName];
|
|
127
63
|
}
|
|
128
|
-
return
|
|
64
|
+
return path.extname(f) === '.hbs' ? path.basename(f, '.hbs') : baseName;
|
|
129
65
|
}
|
|
130
|
-
|
|
131
|
-
var configFileNamesMap = {
|
|
66
|
+
const configFileNamesMap = {
|
|
132
67
|
gitignore: '.gitignore',
|
|
133
68
|
npmrc: '.npmrc',
|
|
134
69
|
_eslintrc: '.eslintrc',
|
|
135
70
|
'_package.json': 'package.json',
|
|
136
71
|
};
|
|
137
|
-
function isFileStartingWith(file, filter) {
|
|
72
|
+
export function isFileStartingWith(file, filter) {
|
|
138
73
|
if (Array.isArray(filter)) {
|
|
139
|
-
return filter.some(
|
|
74
|
+
return filter.some((f) => file.startsWith(f));
|
|
140
75
|
}
|
|
141
76
|
return file.startsWith(filter);
|
|
142
77
|
}
|
|
143
|
-
exports.isFileStartingWith = isFileStartingWith;
|
|
@@ -1,87 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
1
|
+
import Handlebars from 'handlebars';
|
|
2
|
+
import * as changeCase from 'change-case';
|
|
3
|
+
import titleCase from 'title-case';
|
|
4
|
+
import upperCase from 'upper-case';
|
|
5
|
+
import lowerCase from 'lower-case';
|
|
6
|
+
import { PARTIALS_DIR } from '../constants.js';
|
|
7
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { basename, join } from 'node:path';
|
|
9
|
+
export const ifEq = (a, b, options) => {
|
|
10
|
+
return a === b ? options.fn(this) : options.inverse(this);
|
|
24
11
|
};
|
|
25
|
-
|
|
26
|
-
|
|
12
|
+
export const normalizeId = (pluginName, orgName, type) => {
|
|
13
|
+
const re = new RegExp(`-?${type}$`, 'i');
|
|
14
|
+
const nameRegex = new RegExp('[^0-9a-zA-Z]', 'g');
|
|
15
|
+
const newPluginName = pluginName.replace(re, '').replace(nameRegex, '');
|
|
16
|
+
const newOrgName = orgName.replace(nameRegex, '');
|
|
17
|
+
return changeCase.lowerCase(newOrgName) + '-' + changeCase.lowerCase(newPluginName) + `-${type}`;
|
|
27
18
|
};
|
|
28
|
-
var _this = this;
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.renderHandlebarsTemplate = exports.normalizeId = exports.ifEq = void 0;
|
|
31
|
-
var handlebars_1 = __importDefault(require("handlebars"));
|
|
32
|
-
var changeCase = __importStar(require("change-case"));
|
|
33
|
-
var title_case_1 = __importDefault(require("title-case"));
|
|
34
|
-
var upper_case_1 = __importDefault(require("upper-case"));
|
|
35
|
-
var lower_case_1 = __importDefault(require("lower-case"));
|
|
36
|
-
var constants_1 = require("../constants");
|
|
37
|
-
var fs_1 = require("fs");
|
|
38
|
-
var path_1 = require("path");
|
|
39
|
-
var ifEq = function (a, b, options) {
|
|
40
|
-
return a === b ? options.fn(_this) : options.inverse(_this);
|
|
41
|
-
};
|
|
42
|
-
exports.ifEq = ifEq;
|
|
43
|
-
var normalizeId = function (pluginName, orgName, type) {
|
|
44
|
-
var re = new RegExp("-?".concat(type, "$"), 'i');
|
|
45
|
-
var nameRegex = new RegExp('[^0-9a-zA-Z]', 'g');
|
|
46
|
-
var newPluginName = pluginName.replace(re, '').replace(nameRegex, '');
|
|
47
|
-
var newOrgName = orgName.replace(nameRegex, '');
|
|
48
|
-
return changeCase.lowerCase(newOrgName) + '-' + changeCase.lowerCase(newPluginName) + "-".concat(type);
|
|
49
|
-
};
|
|
50
|
-
exports.normalizeId = normalizeId;
|
|
51
19
|
registerHandlebarsHelpers();
|
|
52
20
|
registerHandlebarsPartials();
|
|
53
21
|
function registerHandlebarsHelpers() {
|
|
54
|
-
|
|
22
|
+
const helpers = {
|
|
55
23
|
camelCase: changeCase.camelCase,
|
|
56
24
|
snakeCase: changeCase.snakeCase,
|
|
57
25
|
dotCase: changeCase.dotCase,
|
|
58
26
|
pathCase: changeCase.pathCase,
|
|
59
|
-
lowerCase:
|
|
60
|
-
upperCase:
|
|
27
|
+
lowerCase: lowerCase,
|
|
28
|
+
upperCase: upperCase,
|
|
61
29
|
sentenceCase: changeCase.sentenceCase,
|
|
62
30
|
constantCase: changeCase.constantCase,
|
|
63
|
-
titleCase:
|
|
31
|
+
titleCase: titleCase,
|
|
64
32
|
dashCase: changeCase.paramCase,
|
|
65
33
|
kabobCase: changeCase.paramCase,
|
|
66
34
|
kebabCase: changeCase.paramCase,
|
|
67
35
|
properCase: changeCase.pascalCase,
|
|
68
36
|
pascalCase: changeCase.pascalCase,
|
|
69
|
-
if_eq:
|
|
70
|
-
normalize_id:
|
|
37
|
+
if_eq: ifEq,
|
|
38
|
+
normalize_id: normalizeId,
|
|
71
39
|
};
|
|
72
|
-
Object.keys(helpers).forEach(
|
|
73
|
-
return handlebars_1.default.registerHelper(helperName, helpers[helperName]);
|
|
74
|
-
});
|
|
40
|
+
Object.keys(helpers).forEach((helperName) => Handlebars.registerHelper(helperName, helpers[helperName]));
|
|
75
41
|
}
|
|
76
42
|
function registerHandlebarsPartials() {
|
|
77
|
-
|
|
78
|
-
partialFiles.forEach(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
43
|
+
const partialFiles = readdirSync(PARTIALS_DIR);
|
|
44
|
+
partialFiles.forEach((fileName) => {
|
|
45
|
+
const name = basename(fileName, '.md');
|
|
46
|
+
const template = readFileSync(join(PARTIALS_DIR, fileName), 'utf-8');
|
|
47
|
+
Handlebars.registerPartial(name, template);
|
|
82
48
|
});
|
|
83
49
|
}
|
|
84
|
-
function renderHandlebarsTemplate(template, data) {
|
|
85
|
-
return
|
|
50
|
+
export function renderHandlebarsTemplate(template, data) {
|
|
51
|
+
return Handlebars.compile(template)(data);
|
|
86
52
|
}
|
|
87
|
-
exports.renderHandlebarsTemplate = renderHandlebarsTemplate;
|