From 761d3176c47fa8a9e1f3b5b78d9b989a7f1ca38d Mon Sep 17 00:00:00 2001 From: thetutlage Date: Mon, 9 Jul 2018 15:30:16 +0530 Subject: [PATCH] feat(loader): add support for registering template as a string --- src/Contracts/index.ts | 1 + src/Edge/index.ts | 9 ++++++++- src/Loader/index.ts | 23 +++++++++++++++++++++++ test/edge.spec.ts | 19 +++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/Contracts/index.ts b/src/Contracts/index.ts index 69aa959..a897b05 100644 --- a/src/Contracts/index.ts +++ b/src/Contracts/index.ts @@ -10,6 +10,7 @@ export interface ILoader { unmount (diskName: string): void resolve (templatePath: string, withResolver: boolean): { template: string, Presenter?: IPresenterConstructor } makePath (templatePath: string): string + register (templatePath: string, contents: { template: string, Presenter?: IPresenterConstructor }): void } export interface ICompiler { diff --git a/src/Edge/index.ts b/src/Edge/index.ts index 1524cdc..272a73c 100644 --- a/src/Edge/index.ts +++ b/src/Edge/index.ts @@ -11,7 +11,7 @@ import { merge } from 'lodash' import * as Tags from '../Tags' import { Compiler } from '../Compiler' import { Loader } from '../Loader' -import { ILoaderConstructor, ILoader, ITag } from '../Contracts' +import { ILoaderConstructor, ILoader, ITag, IPresenterConstructor } from '../Contracts' import { Template } from '../Template' import { Context } from '../Context' @@ -97,6 +97,13 @@ export class Edge { Tags[Tag.tagName] = Tag } + /** + * Register a template as a string + */ + public static register (templatePath: string, contents: { template: string, Presenter?: IPresenterConstructor }) { + loader!.register(templatePath, contents) + } + /** * Shorthand to `new Edge().render()` or `Edge.newUp().render()` */ diff --git a/src/Loader/index.ts b/src/Loader/index.ts index 3699515..c133d36 100644 --- a/src/Loader/index.ts +++ b/src/Loader/index.ts @@ -16,6 +16,7 @@ import { extractDiskAndTemplateName } from '../utils' export class Loader implements ILoader { private mountedDirs: Map = new Map() + private preRegistered: Map = new Map() /** * Returns an object of mounted directories with their public @@ -70,6 +71,15 @@ export class Loader implements ILoader { public resolve (templatePath: string, withPresenter: boolean): { template: string, Presenter?: IPresenterConstructor } { try { templatePath = isAbsolute(templatePath) ? templatePath : this.makePath(templatePath) + + /** + * Return from pre-registered one's if exists + */ + if (this.preRegistered.get(templatePath)) { + const contents = this.preRegistered.get(templatePath) + return withPresenter ? contents! : { template: contents!.template } + } + const template = readFileSync(templatePath, 'utf-8') const Presenter = withPresenter ? this._getPresenterForTemplate(templatePath) : undefined return { template, Presenter } @@ -82,6 +92,19 @@ export class Loader implements ILoader { } } + /** + * Register a template as a string + */ + public register (templatePath: string, contents: { template: string, Presenter?: IPresenterConstructor }) { + templatePath = isAbsolute(templatePath) ? templatePath : this.makePath(templatePath) + + if (!contents.template) { + throw new Error('Make sure to define the template content for preRegistered template') + } + + this.preRegistered.set(templatePath, contents) + } + /** * Attempts to conventionally load the presenter for a given template * using the same basePath. diff --git a/test/edge.spec.ts b/test/edge.spec.ts index eca611d..f5a060e 100644 --- a/test/edge.spec.ts +++ b/test/edge.spec.ts @@ -88,4 +88,23 @@ test.group('Template', (group) => { assert.equal(tmpl.render('foo', {}).trim(), 'Hello nikk') assert.equal(Edge.render('foo', {}).trim(), 'Hello guest') }) + + test('register a template as a string', async (assert) => { + Edge.mount(viewsDir) + Edge.register('foo', { + template: `Hello {{ username }}`, + }) + + assert.equal(Edge.render('foo', { username: 'virk' }).trim(), 'Hello virk') + }) + + test('register a template on a named disk', async (assert) => { + Edge.mount('hello', viewsDir) + + Edge.register('hello::foo', { + template: `Hello {{ username }}`, + }) + + assert.equal(Edge.render('hello::foo', { username: 'virk' }).trim(), 'Hello virk') + }) })