diff --git a/configurer/view b/configurer/view index 06960db..41a889c 100644 --- a/configurer/view +++ b/configurer/view @@ -10,8 +10,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck -import { Env } from '@athenna/config' import { Path } from '@athenna/common' +import { Env, Config } from '@athenna/config' export default { /* @@ -24,6 +24,7 @@ export default { | ```typescript | // Render the Path.views('home.edge') file | View.render('home') + | | // Render the Path.views('pages/posts/post.edge') file | View.render('pages/posts/post') | ``` @@ -50,21 +51,33 @@ export default { /* |-------------------------------------------------------------------------- - | View components + | In memory view components |-------------------------------------------------------------------------- | | Here you may define your in-memory components. Components works exactly - | like the `disk` to be rendered, the only difference is that they are - | saved in-memory. - | - | ```typescript - | View.render('button', { content: 'Login' }) - | ``` + | like any other view, the only difference is that they are saved in-memory + | instead of reloading the view file every-time. | */ components: {}, + /* + |-------------------------------------------------------------------------- + | Shared global properties + |-------------------------------------------------------------------------- + | + | Here you may define the properties you want to be available between all + | your views. By default, we have already set the `env` and `config` + | helpers for you. + | + */ + + properties: { + env: Env, + config: Config + }, + /* |-------------------------------------------------------------------------- | Edge options diff --git a/package-lock.json b/package-lock.json index 5ff9dc5..1fde3df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/view", - "version": "4.18.1", + "version": "4.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/view", - "version": "4.18.1", + "version": "4.19.0", "license": "MIT", "dependencies": { "edge.js": "^6.0.1" diff --git a/package.json b/package.json index 10a229e..43ed123 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/view", - "version": "4.18.1", + "version": "4.19.0", "description": "The Athenna template engine. Built on top of Edge.js.", "license": "MIT", "author": "João Lenon ", diff --git a/src/providers/ViewProvider.ts b/src/providers/ViewProvider.ts index 55ee7dd..908b6f5 100644 --- a/src/providers/ViewProvider.ts +++ b/src/providers/ViewProvider.ts @@ -7,7 +7,7 @@ * file that was distributed with this source code. */ -import { Env, Config } from '@athenna/config' +import { Config } from '@athenna/config' import { ViewImpl } from '#src/views/ViewImpl' import { ServiceProvider } from '@athenna/ioc' @@ -15,9 +15,6 @@ export class ViewProvider extends ServiceProvider { public register() { const view = new ViewImpl() - view.addProperty('Env', Env) - view.addProperty('Config', Config) - this.container.instance('Athenna/Core/View', view) if (Config.exists('view.disk')) { @@ -28,6 +25,10 @@ export class ViewProvider extends ServiceProvider { Object.keys(disks).forEach(k => view.createViewDisk(k, disks[k])) + const properties = Config.get('view.properties', {}) + + Object.keys(properties).forEach(k => view.addProperty(k, properties[k])) + const components = Config.get('view.components', {}) Object.keys(components).forEach(k => diff --git a/tests/fixtures/config/view.ts b/tests/fixtures/config/view.ts index 067d83f..27c7fae 100644 --- a/tests/fixtures/config/view.ts +++ b/tests/fixtures/config/view.ts @@ -8,6 +8,7 @@ */ import { Path } from '@athenna/common' +import { Env, Config } from '@athenna/config' export default { disk: Path.fixtures('views'), @@ -16,6 +17,11 @@ export default { admin: Path.fixtures('views/admin') }, + properties: { + env: Env, + config: Config + }, + components: { button: Path.fixtures('views/components/button.edge'), copyright: Path.fixtures('views/components/copyright.edge'), diff --git a/tests/unit/providers/ViewProviderTest.ts b/tests/unit/providers/ViewProviderTest.ts index 9969089..31052df 100644 --- a/tests/unit/providers/ViewProviderTest.ts +++ b/tests/unit/providers/ViewProviderTest.ts @@ -53,7 +53,16 @@ export default class ViewProviderTest { } @Test() - public async shouldRegisterTemplatesInViewConfigInTheViewInstance({ assert }: Context) { + public async shouldRegisterPropertiesToBeAvailableToAllViewsInViewConfigInTheViewInstance({ assert }: Context) { + new ViewProvider().register() + + assert.isDefined(View.edge.globals.env) + assert.isDefined(View.edge.globals.config) + assert.isUndefined(View.edge.globals.notFound) + } + + @Test() + public async shouldRegisterComponentsInViewConfigInTheViewInstance({ assert }: Context) { new ViewProvider().register() assert.isTrue(View.hasComponent('button'))