summaryrefslogtreecommitdiff
path: root/dev/lib/handlebars/src/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dev/lib/handlebars/src/utils.ts')
-rw-r--r--dev/lib/handlebars/src/utils.ts69
1 files changed, 69 insertions, 0 deletions
diff --git a/dev/lib/handlebars/src/utils.ts b/dev/lib/handlebars/src/utils.ts
new file mode 100644
index 00000000..f55bd98a
--- /dev/null
+++ b/dev/lib/handlebars/src/utils.ts
@@ -0,0 +1,69 @@
+/*
+ * Elasticsearch B.V licenses this file to you under the MIT License.
+ * See `packages/kbn-handlebars/LICENSE` for more information.
+ */
+
+// @ts-expect-error: Could not find a declaration file for module
+import { createFrame } from 'handlebars/dist/cjs/handlebars/utils';
+
+import type { AmbiguousHelperOptions, DecoratorOptions } from './types';
+
+export function isBlock(node: hbs.AST.Node): node is hbs.AST.BlockStatement {
+ return 'program' in node || 'inverse' in node;
+}
+
+export function isDecorator(
+ node: hbs.AST.Node
+): node is hbs.AST.Decorator | hbs.AST.DecoratorBlock {
+ return node.type === 'Decorator' || node.type === 'DecoratorBlock';
+}
+
+export function toDecoratorOptions(options: AmbiguousHelperOptions) {
+ // There's really no tests/documentation on this, but to match the upstream codebase we'll remove `lookupProperty` from the decorator context
+ delete (options as any).lookupProperty;
+
+ return options as DecoratorOptions;
+}
+
+export function noop() {
+ return '';
+}
+
+// liftet from handlebars lib/handlebars/runtime.js
+export function initData(context: any, data: any) {
+ if (!data || !('root' in data)) {
+ data = data ? createFrame(data) : {};
+ data.root = context;
+ }
+ return data;
+}
+
+// liftet from handlebars lib/handlebars/compiler/compiler.js
+export function transformLiteralToPath(node: { path: hbs.AST.PathExpression | hbs.AST.Literal }) {
+ const pathIsLiteral = 'parts' in node.path === false;
+
+ if (pathIsLiteral) {
+ const literal = node.path;
+ // @ts-expect-error: Not all `hbs.AST.Literal` sub-types has an `original` property, but that's ok, in that case we just want `undefined`
+ const original = literal.original;
+ // Casting to string here to make false and 0 literal values play nicely with the rest
+ // of the system.
+ node.path = {
+ type: 'PathExpression',
+ data: false,
+ depth: 0,
+ parts: [original + ''],
+ original: original + '',
+ loc: literal.loc,
+ };
+ }
+}
+
+export function allowUnsafeEval() {
+ try {
+ new Function();
+ return true;
+ } catch (e) {
+ return false;
+ }
+}