/* These test cases were imported from https://github.com/DefinitelyTyped/DefinitelyTyped * and includes previous contributions from the DefinitelyTyped community. * For full history prior to their migration to handlebars.js, please see: * https://github.com/DefinitelyTyped/DefinitelyTyped/commits/1ce60bdc07f10e0b076778c6c953271c072bc894/types/handlebars/handlebars-tests.ts */ import Handlebars from 'handlebars'; import { HandlebarsTemplateDelegate, hbs } from 'handlebars'; const context = { author: { firstName: 'Alan', lastName: 'Johnson' }, body: 'I Love Handlebars', comments: [{ author: { firstName: 'Yehuda', lastName: 'Katz' }, body: 'Me too!' }] }; Handlebars.registerHelper('fullName', (person: typeof context.author) => { return person.firstName + ' ' + person.lastName; }); Handlebars.registerHelper('agree_button', function(this: any) { return new Handlebars.SafeString( '' ); }); const source1 = '

Hello, my name is {{name}}. I am from {{hometown}}. I have ' + '{{kids.length}} kids:

' + ''; const template1 = Handlebars.compile(source1); template1({ name: "Alan", hometown: "Somewhere, TX", kids: [{name: "Jimmy", age: 12}, {name: "Sally", age: 4}]}); Handlebars.registerHelper('link_to', (context: typeof post) => { return '' + context.body + ''; }); const post = { url: "/hello-world", body: "Hello World!" }; const context2 = { posts: [post] }; const source2 = ''; const template2: HandlebarsTemplateDelegate<{ posts: { url: string, body: string }[] }> = Handlebars.compile(source2); template2(context2); Handlebars.registerHelper('link_to', (title: string, context: typeof post) => { return '' + title + '!'; }); const context3 = { posts: [{url: '/hello-world', body: 'Hello World!'}] }; const source3 = ''; const template3 = Handlebars.compile(source3); template3(context3); const source4 = ''; Handlebars.registerHelper('link', function(this: any, context: any) { return '' + context.fn(this) + ''; }); const template4 = Handlebars.compile<{ people: { name: string, id: number }[] }>(source4); const data2 = { 'people': [ { 'name': 'Alan', 'id': 1 }, { 'name': 'Yehuda', 'id': 2 } ]}; template4(data2); const source5 = ''; Handlebars.registerPartial('link', '{{name}}'); const template5 = Handlebars.compile(source5); const data3 = { 'people': [ { 'name': 'Alan', 'id': 1 }, { 'name': 'Yehuda', 'id': 2 } ]}; template5(data3); const source6 = '{{#list nav}}{{title}}{{/list}}'; const template6 = Handlebars.compile(source6); Handlebars.registerHelper('list', (context, options: Handlebars.HelperOptions) => { let ret = ""; }); template6([{url:"", title:""}]); const escapedExpression = Handlebars.Utils.escapeExpression(''); Handlebars.helpers !== undefined; const parsedTmpl = Handlebars.parse('

Hello, my name is {{name}}.

', { srcName: "/foo/bar/baz.hbs", ignoreStandalone: true }); const parsedTmplWithoutOptions = Handlebars.parse('

Hello, my name is {{name}}.

'); // Custom partial resolution. const originalResolvePartial = Handlebars.VM.resolvePartial; Handlebars.VM.resolvePartial = (partial: HandlebarsTemplateDelegate | undefined, context: any, options: Handlebars.ResolvePartialOptions): HandlebarsTemplateDelegate => { const name = options.name.replace(/my/,'your'); // transform name. options.name = name; return originalResolvePartial(partial, context, options); }; // #1544, allow custom helpers in knownHelpers Handlebars.compile('test', { knownHelpers: { each: true, customHelper: true } }); Handlebars.compile('test')({},{allowCallsToHelperMissing: true}); Handlebars.compile('test')({},{}); const allthings = {} as hbs.AST.MustacheStatement | hbs.AST.BlockStatement | hbs.AST.PartialStatement | hbs.AST.PartialBlockStatement | hbs.AST.ContentStatement | hbs.AST.CommentStatement | hbs.AST.SubExpression | hbs.AST.PathExpression | hbs.AST.StringLiteral | hbs.AST.BooleanLiteral | hbs.AST.NumberLiteral | hbs.AST.UndefinedLiteral | hbs.AST.NullLiteral | hbs.AST.Hash | hbs.AST.HashPair; switch(allthings.type) { case "MustacheStatement": let mustacheStatement: hbs.AST.MustacheStatement; mustacheStatement = allthings; break; case "BlockStatement": let blockStatement: hbs.AST.BlockStatement; blockStatement = allthings; break; case "PartialStatement": let partialStatement: hbs.AST.PartialStatement; partialStatement = allthings; break; case "PartialBlockStatement": let partialBlockStatement: hbs.AST.PartialBlockStatement; partialBlockStatement = allthings; break; case "ContentStatement": let ContentStatement: hbs.AST.ContentStatement; ContentStatement = allthings; break; case "CommentStatement": let CommentStatement: hbs.AST.CommentStatement; CommentStatement = allthings; break; case "SubExpression": let SubExpression: hbs.AST.SubExpression; SubExpression = allthings; break; case "PathExpression": let PathExpression: hbs.AST.PathExpression; PathExpression = allthings; break; case "StringLiteral": let StringLiteral: hbs.AST.StringLiteral; StringLiteral = allthings; break; case "BooleanLiteral": let BooleanLiteral: hbs.AST.BooleanLiteral; BooleanLiteral = allthings; break; case "NumberLiteral": let NumberLiteral: hbs.AST.NumberLiteral; NumberLiteral = allthings; break; case "UndefinedLiteral": let UndefinedLiteral: hbs.AST.UndefinedLiteral; UndefinedLiteral = allthings; break; case "NullLiteral": let NullLiteral: hbs.AST.NullLiteral; NullLiteral = allthings; break; case "Hash": let Hash: hbs.AST.Hash; Hash = allthings; break; case "HashPair": let HashPair: hbs.AST.HashPair; HashPair = allthings; break; default: break; } function testParseWithoutProcessing() { const parsedTemplate: hbs.AST.Program = Handlebars.parseWithoutProcessing('

Hello, my name is {{name}}.

', { srcName: "/foo/bar/baz.hbs", }); const parsedTemplateWithoutOptions: hbs.AST.Program = Handlebars.parseWithoutProcessing('

Hello, my name is {{name}}.

'); } function testExceptionTypings() { // Test exception constructor with a single argument - message. let exception: Handlebars.Exception = new Handlebars.Exception('message'); // Fields let message: string = exception.message; let lineNumber: number = exception.lineNumber; let column: number = exception.column; let endLineNumber: number = exception.endLineNumber; let endColumn: number = exception.endColumn; let description = exception.description; let name: string = exception.name; let fileName: string = exception.fileName; let stack: string | undefined = exception.stack; } function testExceptionWithNodeTypings() { // Test exception constructor with both arguments. const exception: Handlebars.Exception = new Handlebars.Exception('message', { type: 'MustacheStatement', loc: { source: 'source', start: { line: 1, column: 5 }, end: { line: 10, column: 2 } } }); // Fields let message: string = exception.message; let lineNumber: number = exception.lineNumber; let column: number = exception.column; let endLineNumber: number = exception.endLineNumber; let endColumn: number = exception.endColumn; let description = exception.description; let name: string = exception.name; let fileName: string = exception.fileName; let stack: string | undefined = exception.stack; } function testProtoAccessControlControlOptions() { Handlebars.compile('test')( {}, { allowedProtoMethods: { allowedMethod: true, forbiddenMethod: false }, allowedProtoProperties: { allowedProperty: true, forbiddenProperty: false }, allowProtoMethodsByDefault: true, allowProtoPropertiesByDefault: false, partials: { link: '{{name}}' } } ); } function testHandlebarsVersion() { let version: string = Handlebars.VERSION; }