Skip to content

Commit 443a2ee

Browse files
committed
try the nullvox method
1 parent 17a170f commit 443a2ee

File tree

4 files changed

+110
-5
lines changed

4 files changed

+110
-5
lines changed

addon/components/dynamic-template.js

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { setComponentTemplate } from '@ember/component';
22
import { getOwner } from '@ember/application';
3-
import { compileTemplate } from '@ember/template-compilation';
43
import { importSync } from '@embroider/macros';
54
import Component from '@glimmer/component';
5+
import { createTemplateFactory } from '@ember/template-factory';
6+
const { getTemplateLocals } = importSync('@glimmer/syntax');
7+
const { precompileJSON } = importSync('@glimmer/compiler');
68

79
let templateOwnerMap = new Map();
810

@@ -30,11 +32,15 @@ export default class DynamicTemplateComponent extends Component {
3032
if (component === undefined) {
3133
let compiledTemplate;
3234
try {
33-
compiledTemplate = compileTemplate(templateString);
35+
compiledTemplate = compileTemplate(templateString, {
36+
moduleName: this.args.componentId,
37+
});
3438
} catch (err) {
3539
console.error(err);
3640
console.error(templateString);
37-
compiledTemplate = compileTemplate(`<DynamicTemplateError />`);
41+
compiledTemplate = compileTemplate(`<DynamicTemplateError />`, {
42+
moduleName: this.args.componentId,
43+
});
3844
}
3945

4046
component = owner.factoryFor(`component:${this.args.componentId}`);
@@ -66,3 +72,46 @@ export default class DynamicTemplateComponent extends Component {
6672
return component;
6773
}
6874
}
75+
76+
// copied from https://github.com/NullVoxPopuli/limber/blob/main/packages/ember-repl/addon/src/compile/formats/hbs.ts
77+
function compileTemplate(source, { moduleName, scope = {} }) {
78+
let localScope = { ...scope };
79+
let locals = getTemplateLocals(source);
80+
81+
let options = {
82+
strictMode: true,
83+
moduleName,
84+
locals,
85+
isProduction: false,
86+
meta: { moduleName },
87+
};
88+
89+
// Copied from @glimmer/compiler/lib/compiler#precompile
90+
let [block, usedLocals] = precompileJSON(source, options);
91+
92+
let usedScope = usedLocals.map((key) => {
93+
let value = localScope[key];
94+
95+
if (!value) {
96+
throw new Error(
97+
`Attempt to use ${key} in compiled hbs, but it was not available in scope. ` +
98+
`Available scope includes: ${Object.keys(localScope)}`,
99+
);
100+
}
101+
102+
return value;
103+
});
104+
105+
let blockJSON = JSON.stringify(block);
106+
let templateJSONObject = {
107+
id: moduleName,
108+
block: blockJSON,
109+
moduleName: moduleName ?? '(dynamically compiled component)',
110+
scope: () => usedScope,
111+
isStrictMode: true,
112+
};
113+
114+
let factory = createTemplateFactory(templateJSONObject);
115+
116+
return factory;
117+
}

index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ module.exports = {
3939
},
4040

4141
included(app) {
42-
this.import('vendor/ember/ember-template-compiler.js');
43-
4442
if(!app.options['ember-prism']) {
4543
app.options['ember-prism'] = {
4644
// theme: 'okaidia',

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
"resolve": "^1.17.0",
5252
"walk-sync": "^2.2.0"
5353
},
54+
"peerDependencies": {
55+
"@glimmer/compiler": "*",
56+
"@glimmer/syntax": "*"
57+
},
5458
"devDependencies": {
5559
"@babel/eslint-parser": "^7.24.1",
5660
"@babel/plugin-proposal-decorators": "^7.24.1",

pnpm-lock.yaml

Lines changed: 54 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)