diff --git a/src/app/app.ts b/src/app/app.ts index f2f5f30c..f423dadf 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -44,7 +44,8 @@ export class App extends TemplateSet { console.info(DEV_MSG); } if (config.env) { - this.env = Object.freeze(Object.assign({}, config.env)); + const descrs = Object.getOwnPropertyDescriptors(config.env); + this.env = Object.freeze(Object.defineProperties({}, descrs)); } if (config.translateFn) { this.translateFn = config.translateFn; diff --git a/tests/components/__snapshots__/app.test.ts.snap b/tests/components/__snapshots__/app.test.ts.snap index d91cd01a..b48f82a9 100644 --- a/tests/components/__snapshots__/app.test.ts.snap +++ b/tests/components/__snapshots__/app.test.ts.snap @@ -1,5 +1,20 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`app App supports env with getters/setters 1`] = ` +"function anonymous(bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, component, comment } = bdom; + + let block1 = createBlock(\`
\`); + + return function template(ctx, node, key = \\"\\") { + let d1 = ctx['env'].someVal; + let d2 = Object.keys(ctx['env'].services); + return block1([d1, d2]); + } +}" +`; + exports[`app destroy remove the widget from the DOM 1`] = ` "function anonymous(bdom, helpers ) { diff --git a/tests/components/app.test.ts b/tests/components/app.test.ts index c6a5dcf4..a44aee32 100644 --- a/tests/components/app.test.ts +++ b/tests/components/app.test.ts @@ -1,7 +1,7 @@ import { App, Component } from "../../src"; import { status } from "../../src/component/status"; import { xml } from "../../src/tags"; -import { makeTestFixture, snapshotEverything } from "../helpers"; +import { makeTestFixture, snapshotEverything, nextTick } from "../helpers"; let fixture: HTMLElement; @@ -25,4 +25,30 @@ describe("app", () => { expect(document.contains(el)).toBe(false); expect(status(comp)).toBe("destroyed"); }); + + test("App supports env with getters/setters", async () => { + let someVal = "maggot"; + + const services: any = { serv1: "" }; + const env = { + get someVal() { + return someVal; + }, + services, + }; + + class SomeComponent extends Component { + static template = xml`
`; + } + + const app = new App(SomeComponent); + app.configure({ env }); + const comp = await app.mount(fixture); + expect(fixture.innerHTML).toBe("
maggot serv1
"); + someVal = "brain"; + services.serv2 = ""; + comp.render(); + await nextTick(); + expect(fixture.innerHTML).toBe("
brain serv1,serv2
"); + }); });